mega16程序典例.docx
- 文档编号:24485383
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:22
- 大小:17.03KB
mega16程序典例.docx
《mega16程序典例.docx》由会员分享,可在线阅读,更多相关《mega16程序典例.docx(22页珍藏版)》请在冰豆网上搜索。
mega16程序典例
#include
#include
/***************************函数申明*******************************************/
voiddelay_1ms(void);//延时1毫秒
voiddelay_nms(unsignedint);//延时n毫秒
voidwhite(void);//盲区循迹辅助函数
voidled(char);//一般循迹程序,输入行走格数
voidled1(char);//一般循迹程序,输入行走格数
voidled2(char);//后退循迹,输入行走格数
voidturnleft(void);//左转
voidturnright(void);//右转
charmega_16ad(void);//ad转换函数
voidhold(void);//抓紧函数
voidlose(void);//放松函数
voidd_motor_s(unsignedchart);//小舵机控制函数
voidd_motor_b(unsignedchart);//大舵机控制函数
voidd_motor_r(unsignedchart);//大舵机恢复函数
voidmotor(unsignedcharm);//机械臂电机控制函数
charcatch(char);//抓取函数,包含ad转换函数,返回0未抓取,1黑色,2白色,3灰色
//同时完成伸出机械臂,抓取,抬起机械臂动作
voidput(void);//伸出机械臂,放下棋子,抬起机械臂
/********************************主函数****************************************/
voidmain(void)
{
chara,b,c=3;
unsignedchari;
DDRD|=BIT(4);
DDRD|=BIT(5);
TCCR1A=0XA2;
TCCR1B=0X19;
TCNT1=0X0000;
ICR1=0x4A38;
OCR1B=1054;
delay_nms(50);
OCR1A=2000;
delay_nms(50);
led1
(2);//循迹,到达第一个棋子
turnright();
a=catch
(1);//第一次抓取,记录棋子颜色
turnleft();
b=5;
if(a==0)//若第一个为灰色,抓取下一个
{
led1
(1);
turnright();
a=catch
(1);
turnleft();
b=4;
c=1;
}
led1(b);//到达指定位置,放下棋子
if(a==1){turnright();
put();
turnright();
}
else{turnleft();
put();
turnleft();}
led2(b-1);//后退b-1格
turnleft();
a=catch
(2);//第二次抓取,记录棋子颜色
turnleft();
b=b-1;
if(a==0)//若第二个为灰色,抓取第三个
{
led1
(1);
turnright();
a=catch
(2);
turnleft();
b=3;
c=2;
}
led1(b);
if(a==1){turnright();
put();
turnright();
}
else{turnleft();
put();
turnleft();}
if(c==3)
b=3;
elseif(c==2)
b=4;
elseif(c==1)
b=5;
led2(b);//后退,取最后一个棋子
turnleft();
a=catch(3);
turnleft();
led1(b-1);
{
DDRD|=BIT(4);
DDRD|=BIT(5);
TCCR1A=0XA2;
TCCR1B=0X19;
TCNT1=0X0000;
ICR1=0x4A38;
OCR1B=2156;
delay_nms(50);
OCR1A=2000;
delay_nms(50);
for(i=0;i<18;i++)
{OCR1A+=100;delay_nms(20);OCR1B=2156;delay_nms(20);}
OCR1B=2156;
delay_nms(100);
d_motor_s
(2);
delay_nms(1000);
d_motor_s
(1);
}
{
DDRD|=BIT(4);
DDRD|=BIT(5);
TCCR1A=0XA2;
TCCR1B=0X19;
TCNT1=0X0000;
ICR1=0x4A38;
OCR1B=2156;
delay_nms(50);
OCR1A=3800;
delay_nms(50);
for(i=0;i<18;i++)
{OCR1A-=100;delay_nms(20);OCR1B=2156;delay_nms(20);}
delay_nms(100);
}
led2(4);//往前走五格,放下灰色棋子
put();
turnleft();
turnleft();
led2(3);//后退四格,取车
turnleft();
catch(3);
turnleft();
led2
(2);
turnleft();//左转
led2
(1);
put();//放下车,将死
turnright();//右转
led1
(2);//调用led2,往前走两格
turnleft();
led2
(2);
turnright();
turnright();
catch(3);
turnleft();
turnleft();//将举起,结束
}
/****************************时间延时函数************************************/
voiddelay_1ms(void)
{
unsignedinti;
for(i=0;i<150;i++)
{
}
}
voiddelay_nms(unsignedintn)
{
unsignedinti;
for(i=0;i delay_1ms(); } /************************循迹程序*********************************************/ voidled1(charnum)//向前循迹 { charkey,n=1; DDRA=0X3F; PORTA=0X35; delay_nms(500); PORTA=0X30; while (1) { key=(PINB&0X2F); if(key<=0X0F) {switch(key) { case0X06: PORTA=0X35;break;//旁路传感器5、6为白 case0X07: PORTA=0X35;break; case0X0E: PORTA=0X35;break; case0X0F: PORTA=0X35;break; case0X00: white();break; case0X03: PORTA=0X11;break;//左偏 case0X01: PORTA=0X11;break; case0X02: PORTA=0X11;break; case0X0C: PORTA=0X24;break;//右偏 case0X08: PORTA=0X24;break; case0X04: PORTA=0X24;break; } } elseif(key>=0X20) { PORTA=0X30; delay_nms(10); key=(PINB&0X2F); if(key<=0X0F); else { if(n { while (1) { key=(PINB&0X2F); if(key>0X0F) PORTA=0X35; else{n++;break;} } } elseif(n==num) { PORTA=0X30; delay_nms(20); break; } } } } } voidled2(charnum)//向后循迹 { charkey,n=1; DDRA=0X3F; PORTA=0X35; delay_nms(500); PORTA=0X30; while (1) { key=(PINB&0X1F); if(key<=0X0F) {switch(key) { case0X06: PORTA=0X35;break;//旁路传感器5、6为白 case0X07: PORTA=0X35;break; case0X0E: PORTA=0X35;break; case0X0F: PORTA=0X35;break; case0X00: white();break; case0X03: PORTA=0X11;break;//左偏 case0X01: PORTA=0X11;break; case0X02: PORTA=0X11;break; case0X0C: PORTA=0X24;break;//右偏 case0X08: PORTA=0X24;break; case0X04: PORTA=0X24;break; } } else {PORTA=0X30; delay_nms(10); key=(PINB&0X1F); if(key<=0X0F); else { if(n { while (1) { key=(PINB&0X1F); if(key>0X0F) PORTA=0X35; else{n++;break;} } } elseif(n==num) { PORTA=0X30; delay_nms(20); break; } } } } } /*********************************循迹辅助*************************************/ voidwhite(void) { unsignedcharkey; while (1) { key=(PINB&0X0F); if(key==0X00) { PORTA=0X24; delay_nms (1); PORTA=0X35; delay_nms(9); } elsebreak; } } /*********************************转弯*****************************************/ voidturnleft(void)//左转 { unsignedcharkey; DDRA=0X3F; PORTA=0X39; delay_nms(300); while (1) { key=(PINB&0X0F); if(key==0X03) { PORTA=0X30; delay_nms(20); break; } elsePORTA=0X39; } } voidturnright(void)//右转 { unsignedcharkey; DDRA=0X3F; PORTA=0X36; delay_nms(300); while (1) { key=(PINB&0X0F); if(key==0X0C) { PORTA=0X30; delay_nms(20); break; } elsePORTA=0X36; } } /*......................................AD转换................................*/ charmega_16ad(void) { intaddata; DDRA&=~BIT(PA0);//PA口输入 PORTA&=~BIT(PA0); ADMUX=0X27;//使用外部参考电压,右对齐,ADC0选择7通道 ADCSR=0X80;//控制寄存器,adc使能,取消中断,2分频 ADCSR|=BIT(6);//ADCR代表数字6,启动ADE while(! (ADCSR&(BIT(4))));//ADIF对应4,将第四位置位,其余为0 addata=ADCH; returnaddata; } charad(void) { intad0; intad1; charc; delay_nms(100);//延时500毫秒,稳定后采集信号 while (1)//延时,两次相同采集信号 { ad0=mega_16ad(); delay_nms(10); ad1=mega_16ad(); if(ad0==ad1) break; }; if(ad0<0X033)c=2;//白线 else if((ad0>0X033)&&(ad0<0X75))c=3;//灰线 else if(ad0>0x75)c=1;//黑线 returnc; } /*................................小舵机,PD4输出............................*/ voidd_motor_s(unsignedchart) { switch(t) { case2: {unsignedchari; DDRD|=BIT(4); TCCR1A=0X22; TCCR1B=0X19; TCNT1=0X0000; ICR1=0x2710; OCR1B=1500; for(i=0;i<5;i++)//松开 { OCR1B-=111; delay_nms(10); } delay_nms(100); };break; case1: { unsignedchari; DDRD|=BIT(4); TCCR1A=0X22; TCCR1B=0X19; TCNT1=0X0000; ICR1=0x2710; OCR1B=1500; for(i=0;i<6;i++)//加紧 { OCR1B+=111; delay_nms(10); } delay_nms(100); };break; } } /*...................m为1放下传,为2抬升(110上,101下)......................*/ voidmotor(unsignedcharm) { unsignedchari; unsignedcharj; DDRD|=BIT(5); TCCR1A=0X82; TCCR1B=0X19; TCNT1=0X0000; ICR1=0x4A38; //起点,确认居中 if(m==2) { OCR1A=3800; delay_nms(500); for(i=0;i<18;i++)//右转90度,缓慢 {OCR1A-=100;delay_nms(40);} delay_nms(100); } elseif(m==1) { OCR1A=2000; delay_nms(500); for(i=0;i<18;i++)//右转90度,缓慢 {OCR1A+=100;delay_nms(40);} delay_nms(100); } } /*.................................抓取......................................*/ charcatch(chara) { charb,c; d_motor_s (2); motor (1); delay_nms(100); d_motor_s (1); delay_nms(100); b=ad(); c=b; switch(a) { case1: {if(b==1||b==2) { unsignedchari; DDRD|=BIT(4); DDRD|=BIT(5); TCCR1A=0XA2; TCCR1B=0X19; TCNT1=0X0000; ICR1=0x4A38; OCR1B=2156; delay_nms(50); OCR1A=3800; delay_nms(50); for(i=0;i<18;i++)//右转90度,缓慢 {OCR1A-=100;delay_nms(20);OCR1B=2156;delay_nms(20);} delay_nms(100); } else { d_motor_s (2); motor (2); delay_nms(100); c=0; } };break; case2: {if(b==1||b==2) { unsignedchari; DDRD|=BIT(4); DDRD|=BIT(5); TCCR1A=0XA2; TCCR1B=0X19; TCNT1=0X0000; ICR1=0x4A38; OCR1B=2156; delay_nms(50); OCR1A=3800; delay_nms(50); for(i=0;i<18;i++)//右转90度,缓慢 {OCR1A-=100;delay_nms(20);OCR1B=2156;delay_nms(20);} delay_nms(100); } else { d_motor_s (2); motor (2); delay_nms(100); c=0; } };break; case3: { unsignedchari; DDRD|=BIT(4); DDRD|=BIT(5); TCCR1A=0XA2; TCCR1B=0X19; TCNT1=0X0000; ICR1=0x4A38; OCR1B=2156; delay_nms(50); OCR1A=3800; delay_nms(50); for(i=0;i<18;i++) {OCR1A-=100;delay_nms(20);OCR1B=2156;delay_nms(20);} delay_nms(100); c=3; };break; }; returnc; } /*.....................................放下...................................*/ voidput(void) { unsignedchari; DDRD|=BIT(4); DDRD|=BIT(5); TCCR1A=0XA2; TCCR1B=0X19; TCNT1=0X0000; ICR1=0x4A38; OCR1B=2156; delay_nms(50); OCR1A=2000; delay_nms(50); for(i=0;i<18;i++) {OCR1A+=100;delay_nms(20);OCR1B=2156;delay_nms(20);} OCR1B=2156; delay_nms(100); d_motor_s (2); motor (2); delay_nms(100); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mega16 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)