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;idelay_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);
}