mega16程序典例.docx

上传人:b****2 文档编号:24485383 上传时间:2023-05-28 格式:DOCX 页数:22 大小:17.03KB
下载 相关 举报
mega16程序典例.docx_第1页
第1页 / 共22页
mega16程序典例.docx_第2页
第2页 / 共22页
mega16程序典例.docx_第3页
第3页 / 共22页
mega16程序典例.docx_第4页
第4页 / 共22页
mega16程序典例.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

mega16程序典例.docx

《mega16程序典例.docx》由会员分享,可在线阅读,更多相关《mega16程序典例.docx(22页珍藏版)》请在冰豆网上搜索。

mega16程序典例.docx

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

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1