atmega16国赛程序.docx
- 文档编号:28955044
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:75
- 大小:24.50KB
atmega16国赛程序.docx
《atmega16国赛程序.docx》由会员分享,可在线阅读,更多相关《atmega16国赛程序.docx(75页珍藏版)》请在冰豆网上搜索。
atmega16国赛程序
/*
*guosai_2015.c
*
*Created:
2015/8/1316:
02:
59
*Author:
LOVE
*/
/************************************************************************/
/*常用头文件及宏定义*/
/************************************************************************/
#include
#include
#include
#include
#include
#include
#defineBIT(x)(1<<(x))
#defineucharunsignedchar
#defineuintunsignedint
/************************************************************************/
/*电机控制*/
/************************************************************************/
#defineDDR_DIANJIDDRA
#definePORT_DIANJIPORTA
#defineDIANJI_1_ZPORT_DIANJI|=BIT(0),PORT_DIANJI&=~BIT
(1)
#defineDIANJI_1_FPORT_DIANJI&=~BIT(0),PORT_DIANJI|=BIT
(1)
#defineDIANJI_2_ZPORT_DIANJI|=BIT
(2),PORT_DIANJI&=~BIT(3)
#defineDIANJI_2_FPORT_DIANJI&=~BIT
(2),PORT_DIANJI|=BIT(3)
#defineDIANJI_3_ZPORT_DIANJI|=BIT(4),PORT_DIANJI&=~BIT(5)
#defineDIANJI_3_FPORT_DIANJI&=~BIT(4),PORT_DIANJI|=BIT(5)
#defineDIANJI_4_ZPORT_DIANJI|=BIT(6),PORT_DIANJI&=~BIT(7)
#defineDIANJI_4_FPORT_DIANJI&=~BIT(6),PORT_DIANJI|=BIT(7)
voidchushihua_dianji()
{
DDR_DIANJI=0xff;
PORT_DIANJI=0;
}
voidtiaosu_1(charfangxiang,charsudu)
{
OCR0=sudu;
if(fangxiang)
{
DIANJI_1_Z;
}
else
{
DIANJI_1_F;
}
}
voidtiaosu_2(charfangxiang,charsudu)
{
OCR1A=sudu;
if(fangxiang)
{
DIANJI_2_Z;
}
else
{
DIANJI_2_F;
}
}
voidtiaosu_3(charfangxiang,charsudu)
{
OCR1B=sudu;
if(fangxiang)
{
DIANJI_3_Z;
}
else
{
DIANJI_3_F;
}
}
voidtiaosu_4(charfangxiang,charsudu)
{
OCR2=sudu;
if(fangxiang)
{
DIANJI_4_Z;
}
else
{
DIANJI_4_F;
}
}
/************************************************************************/
/*12864*/
/************************************************************************/
//串行模式
//引脚说明
//PB0RS(CS)PB1RW(SID)PB2E(CLK)
//宏定义
#defineDDR_KZDDRB
#definePORT_KZPORTB
#definePIN_KZPINB
#defineCS_HPORT_KZ|=BIT(0)
#defineCS_LPORT_KZ&=~BIT(0)
#defineSID_HPORT_KZ|=BIT
(1)
#defineSID_LPORT_KZ&=~BIT
(1)
#defineCLKPORT_KZ|=BIT
(2),PORT_KZ&=~BIT
(2)
#defineCLK_HPORT_KZ|=BIT
(2)
#defineCLK_LPORT_KZ&=~BIT
(2)
voidlcd_write_char(ucharshuju)//写字符函数
{
_delay_us(500);
uchari;
CS_H;
for(i=0;i<8;i++)
{
if(0xfa&BIT(7-i))
{
SID_H;
}
else
{
SID_L;
}
CLK;
}
for(i=0;i<4;i++)
{
if(shuju&BIT(7-i))
{
SID_H;
}
else
{
SID_L;
}
CLK;
}
SID_L;
CLK;CLK;CLK;CLK;
for(i=0;i<4;i++)
{
if(shuju&BIT(3-i))
{
SID_H;
}
else
{
SID_L;
}
CLK;
}
SID_L;
CLK;CLK;CLK;CLK;
CS_L;
}
voidlcd_write_string(char*str)//写字符串函数
{
while(*str!
='\0')
{
lcd_write_char(*str);
str++;
}
}
voidlcd_write_zhiling(ucharzhiling)//写指令
{
_delay_us(500);
uchari;
CS_H;
for(i=0;i<8;i++)
{
if(0xf8&BIT(7-i))
{
SID_H;
}
else
{
SID_L;
}
CLK;
}
for(i=0;i<4;i++)
{
if(zhiling&BIT(7-i))
{
SID_H;
}
else
{
SID_L;
}
CLK;
}
SID_L;
CLK,CLK,CLK,CLK;
for(i=0;i<4;i++)
{
if(zhiling&BIT(3-i))
{
SID_H;
}
else
{
SID_L;
}
CLK;
}
SID_L;
CLK,CLK,CLK,CLK;
CS_L;
}
//指令集宏定义//
#defineZHILINGJI_JIBENlcd_write_zhiling(0x30)//基本指令集
#defineZHILINGJI_KUOZHANlcd_write_zhiling(0x34)//扩展指令集
#defineHUITU_OFFlcd_write_zhiling(0x34)//绘图关
#defineHUITU_ONlcd_write_zhiling(0x36)//绘图开
#defineQINGPING_WENZIlcd_write_zhiling(0x01)//文字清屏
voidchushihua_12864()
{
PORT_KZ|=BIT(4);
DDR_KZ|=BIT(0)|BIT
(1)|BIT
(2);
ZHILINGJI_JIBEN;//基本指令集
lcd_write_zhiling(0x08);//显示关
lcd_write_zhiling(0x01);//清显示
lcd_write_zhiling(0x02);//地址归位
lcd_write_zhiling(0x10);//设置游标
lcd_write_zhiling(0x0c);//开显示
}
/************************************************************************/
/*USART*/
/************************************************************************/
voidchushihua_usart()
{
UCSRC|=BIT(UCSZ1)|BIT(UCSZ0)|BIT(URSEL);
UCSRB|=BIT(RXCIE)|BIT(RXEN)|BIT(TXEN);
UBRRL=51;
sei();
}
ucharRe_buf[11],counter=0,ucStra[6],ucStrw[6],ucStrAngle[6];
floata[3],w[3],angle[3];
ISR(USART_RXC_vect)
{
Re_buf[counter]=UDR;
if(Re_buf[0]!
=0x55&&counter==0)return;
counter++;
if(counter==11)//接收到11个数据
{
counter=0;//重新赋值,准备下一帧数据的接收
switch(Re_buf[1])
{
case0x51:
ucStra[0]=Re_buf[2];
ucStra[1]=Re_buf[3];
ucStra[2]=Re_buf[4];
ucStra[3]=Re_buf[5];
ucStra[4]=Re_buf[6];
ucStra[5]=Re_buf[7];
break;
case0x52:
ucStrw[0]=Re_buf[2];
ucStrw[1]=Re_buf[3];
ucStrw[2]=Re_buf[4];
ucStrw[3]=Re_buf[5];
ucStrw[4]=Re_buf[6];
ucStrw[5]=Re_buf[7];
break;
case0x53:
ucStrAngle[0]=Re_buf[2];
ucStrAngle[1]=Re_buf[3];
ucStrAngle[2]=Re_buf[4];
ucStrAngle[3]=Re_buf[5];
ucStrAngle[4]=Re_buf[6];
ucStrAngle[5]=Re_buf[7];
break;
}
}
}
#defineLING_HPORTD|=BIT
(2)|BIT(3)
#defineLING_LPORTD&=~(BIT
(2)|BIT(3))
/************************************************************************/
/*PWM*/
/************************************************************************/
voidchushihua_pwm()
{
DDRB|=BIT(3);
DDRD|=BIT(4)|BIT(5)|BIT(7)|BIT
(2)|BIT(3);
TCCR0|=BIT(WGM00)|BIT(COM01);
OCR0=0;
TCCR0|=BIT(CS01);//8分频
TCCR1A|=BIT(COM1A1)|BIT(COM1B1)|BIT(WGM10);
OCR1A=0;
OCR1B=0;
TCCR1B|=BIT(CS11);
TCCR2|=BIT(WGM21)|BIT(WGM20)|BIT(COM21);
OCR2=0;
TCCR2|=BIT(CS21);
}
#defineDDR_JIANPANDDRC
#definePORT_JIANPANPORTC
#definePIN_JIANPANPINC
intjiance()//检测函数//行扫描
{
DDR_JIANPAN=0xf0;//行扫描//0~3输入态//4~7输出态
PORT_JIANPAN=0x0f;//0~3启用上拉电阻//4~7输出低电平
_delay_ms
(1);
if(((PIN_JIANPAN|0xf0)==0xff))//屏蔽高四位//读取低四位状态
{
return0;
}
else
{
return1;
}
}
charshibie_hang()//行识别状态(与检测函数扫描一致,不用切换状态)
{
switch(PIN_JIANPAN|0xf0)
{
case0xfe:
return1;break;
case0xfd:
return2;break;
case0xfb:
return3;break;
case0xf7:
return4;break;
default:
return0;
}
}
charshibie_lie()//列识别状态,需要切换扫描状态
{
DDR_JIANPAN=0x0f;//行扫描//0~3输出态//4~7输入态
PORT_JIANPAN=0xf0;//0~3输出低电平//4~7启用上拉电阻
_delay_ms
(1);
switch(PIN_JIANPAN|0x0f)//屏蔽低四位//读取高四位状态
{
case0xef:
return1;break;
case0xdf:
return2;break;
case0xbf:
return3;break;
case0x7f:
return4;break;
default:
return0;
}
}
charyima()//计算按键标号函数
{
charh,l,jianma=0;
if(jiance())
{
_delay_ms(10);
if(jiance())
{
h=shibie_hang();
l=shibie_lie();
jianma=(h-1)*4+l;//计算按键标号
while(jiance());
}
}
returnjianma;
}
voidchushihua_jianpan()//键盘初始化函数
{
DDR_JIANPAN=0;//输入态
PORT_JIANPAN=0xff;//启用上拉电阻
}
#defineBAOCHI120
#defineJIAODU12
chardiyixiang()
{
QINGPING_WENZI;
_delay_ms(10);
charkaishi=0,us=1,jianma;
ucharfangxiang=1,qidong=1;
while
(1)
{
if(kaishi)
{
if(us)
{
chushihua_usart();
us=0;
}
w[0]=(short)(ucStrw[1]<<8|ucStrw[0])/32768.0*2000;
w[1]=(short)(ucStrw[3]<<8|ucStrw[2])/32768.0*2000;
angle[0]=(short)(ucStrAngle[1]<<8|ucStrAngle[0])/32768.0*180;
angle[1]=(short)(ucStrAngle[3]<<8|ucStrAngle[2])/32768.0*180;
if(angle[0]<-20||angle[0]>20)
{
LING_H;
}
if(qidong)
{
tiaosu_1(0,100);
tiaosu_3(1,100);
_delay_ms(200);
qidong=0;
tiaosu_1(0,0);
tiaosu_3(0,0);
}
if(fangxiang)
{
if((angle[0]
{
tiaosu_1(1,BAOCHI);
}
else
{
fangxiang=0;
tiaosu_1(1,0);
}
}
else
{
if(angle[0]>-JIAODU&&angle[0]<0)
{
tiaosu_3(1,BAOCHI);
}
else
{
fangxiang=1;
tiaosu_3(0,0);
}
}
}
else
{
lcd_write_zhiling(0x80);
lcd_write_string("当前测试第一项");
lcd_write_zhiling(0x90);
lcd_write_string("状态:
未开始");
lcd_write_zhiling(0x88);
}
jianma=yima();
switch(jianma)
{
case13:
{
kaishi=1;
lcd_write_zhiling(0x90);
lcd_write_string("状态:
运行中");
}
break;
case16:
{
if(kaishi)
{
kaishi=0;
LING_L;
UCSRB=0;
us=1;
tiaosu_1(1,0);
tiaosu_2(1,0);
tiaosu_3(1,0);
tiaosu_4(1,0);
qidong=1;
angle[0]=0;
}
else
{
return0;
}
}
break;
default:
;
}
}
return0;
}
chardierxiang()
{
QINGPING_WENZI;
_delay_ms(10);
charkaishi=0,us=1,jianma,juli0=0,juli1=0,juli2=0,jiaodu=0,pwm_0=0;
charwei=0,qidong=1,fangxiang=1;
uintn=0;
while
(1)
{
if(kaishi&&jiaodu!
=0)
{
if(us)
{
chushihua_usart();
us=0;
}
w[0]=(short)(ucStrw[1]<<8|ucStrw[0])/32768.0*2000;
w[1]=(short)(ucStrw[3]<<8|ucStrw[2])/32768.0*2000;
angle[0]=(short)(ucStrAngle[1]<<8|ucStrAngle[0])/32768.0*180;
angle[1]=(short)(ucStrAngle[3]<<8|ucStrAngle[2])/32768.0*180;
if(angle[0]>jiaodu&&angle[0]>0)
{
n++;
}
if(n==2000)
{
LING_H;
n=0;
}
if(qidong)
{
tiaosu_1(0,100);
tiaosu_3(1,100);
_delay_ms(200);
qidong=0;
tiaosu_1(0,0);
tiaosu_3(0,0);
}
if(fangxiang)
{
if((angle[0]
{
tiaosu_1(1,pwm_0);
}
else
{
fangxiang=0;
tiaosu_1(1,0);
}
}
else
{
if(angle[0]>-jiaodu&&angle[0]<0)
{
tiaosu_3(1,pwm_0);
}
else
{
fangxiang=1;
tiaosu_3(0,0);
}
}
}
else
{
lcd_write_zhiling(0x80);
lcd_write_string("当前测试第二项");
lcd_write_zhiling(0x90);
lcd_write_string("状态:
未开始");
lcd
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- atmega16 赛程