您好,欢迎访问三七文档
/****************************************************************************************************蓝牙循迹小车:通过手机APP控制蓝牙小车的前进、后退、左转、右转、停止,并可以在蓝牙遥控状态和循迹状态之间进行切换,使小车可以检测到黑色轨道并沿着黑色轨道行驶。经测试,该蓝牙小车可以实现平稳高速循迹,在大赛中获奖,未经允许不得转载,特此声明!*****************************************************************************************************/#includereg52.h#defineucharunsignedchar#defineuintunsignedintsbitin1=P1^0;sbitin2=P1^1;sbitin3=P1^2;sbitin4=P1^3;sbitENA=P1^4;sbitENB=P1^5;sbitled=P2^3;ucharcount_flag=0;//当第1个字符接收完成后,置count_flag=1ucharrecv_flag=0;//当3个字符全部接收完成后,置recv_flag=1,否则recv_flag=0ucharcount_data=0;//接收到的3个字符在数组中的下标,0、1、2ucharbuffer_data[3]=0;//存放接收到的3个字符,buffer_data[count_data]为数组中的一个字符uintpwm_data=0;//PWM方波的计数变量uintleft_pwm=0;//表征左边电机的占空比uintright_pwm=0;//表征右边电机的占空比uintPWM_CYCLE=210;//PWM方波的周期uinttemp=0;//保存P3口输入的循线信息uintflag=0;uintflagxun=0;//flagxun=0,蓝牙状态;flagxun=1,循线状态/************************毫秒延时函数**********************************************/voiddelay(uintx){uintm,n;for(m=0;mx;m++)for(n=0;n15;n++);}/**************************端口初始化函数******************************************/voidcom_init(){P0=0xff;P1=0xff;P2=0xff;P3=0xff;}/**************************电机初始化函数******************************************/voiddian_init(){in1=1;in2=0;in3=1;in4=0;ENA=0;ENB=0;}/**************************定时器初始化函数******************************************/voidtimer_init(void){TMOD=0x22;//T1为方式2,T0为方式2TL1=0xfd;//11.0592M晶振,波特率为9600TH1=0xfd;TL0=0;TH0=156;//计数100次溢出,即每隔100us进入T0中断SCON=0x50;PCON=0x00;TR1=1;ES=1;EA=1;ET0=1;TR0=1;}/**************************驱动轮方向与速度控制函数******************************************/voidforward1(uintx)//左轮前进{in1=1;in2=0;left_pwm=x;}voidforward2(uintx)//右轮前进{in3=1;in4=0;right_pwm=x;}voidback1(uintx)//左轮后退{in1=0;in2=1;left_pwm=x;}voidback2(uintx)//右轮后退{in3=0;in4=1;right_pwm=x;}/**************************高速向前******************************************/voidbforw()//高速向前{in1=1;in2=0;in3=1;in4=0;left_pwm=140;right_pwm=140;}voidmforw()//中速向前{in1=1;in2=0;in3=1;in4=0;flag=0;while((temp==0)&&(8000-flag)){left_pwm=105;right_pwm=105;flag++;delay(10);}bforw();flag=0;}voidsforw()//保持原来方向,低速向前测黑线{left_pwm=35;right_pwm=35;}voidsright()//微调路径,尽量减小小车左右摆动{in1=1;in2=0;in3=1;in4=0;flag=0;while(temp==64){left_pwm=80-2*flag;//可调试right_pwm=28-7*flag;//可调试delay(30);flag++;if(flag=4)flag=4;}flag=0;}voidsleft(){in1=1;in2=0;in3=1;in4=0;flag=0;while(temp==32){right_pwm=80-2*flag;//可调试left_pwm=28-7*flag;//可调试delay(30);flag++;if(flag=4)flag=4;}flag=0;}voidmright()//二次调节,减小左右摆动{in1=1;in2=0;in3=1;in4=0;flag=0;while(temp==192){left_pwm=100-4*flag;//可调试right_pwm=50-3*flag;//可调试delay(2);flag++;if(flag=10)flag=10;}flag=0;}voidmleft(){in1=1;in2=0;in3=1;in4=0;flag=0;while(temp==48){right_pwm=100-4*flag;//可调试left_pwm=50-3*flag;//可调试delay(2);flag++;if(flag=10)flag=10;}flag=0;}voidbright()//后退,防止小车脱离赛道{flag=0;in3=0;in4=1;while(temp==128){flag++;if(flag16){left_pwm=60+1*flag;//可调试right_pwm=0;//可调试delay(6);}if(flag=16){left_pwm=35+(flag-17)^2;//可调试right_pwm=3*(flag-15);//可调试delay(10);}if(flag=25)flag=25;}flag=0;}voidbleft(){flag=0;in1=0;in2=1;while(temp==16){flag++;if(flag16){right_pwm=60+1*flag;//可调试left_pwm=0;//可调试delay(6);}if(flag=16){right_pwm=35+(flag-17)^2;//可调试left_pwm=3*(flag-15);//可调试delay(10);}if(flag=25)flag=25;}flag=0;}voidexpe()//接收到未知数据,保持原来方向{left_pwm=110;right_pwm=110;}voidstop()//停止{left_pwm=0;right_pwm=0;}/**************************手机APP遥控函数*****************************************/voidbluetooth(void){switch(buffer_data[2]){case'A':forward1(80);forward2(80);break;//按下APP前进键case'B':back1(80);back2(80);break;//按下APP后退键case'C':back1(50);forward2(50);break;//按下APP左转键case'D':forward1(50);back2(50);break;//按下APP右转键case'F':forward1(0);forward2(0);break;//松手case'1':flagxun=~flagxun;break;//按下1,进入循线状态default:;}}/**************************循线函数*****************************************/voidxunji(void){P3=0xff;temp=P3;temp=temp&0xf0;P0=temp;switch(temp)//左1左2右3右4{case0:mforw();break;//全都没检测到黑线,中速前进case16:bleft();break;//左1检测到黑线,高速左转case32:sleft();break;//左2检测到黑线,低速左转case64:sright();break;//右3检测到黑线,低速右转case128:bright();break;//右4检测到黑线,高速右转case96:sforw();break;//左2、右3检测到黑线,低速前进case48:mleft();break;//左1、左2检测到黑线,中速左转case192:mright();break;//右3、右4检测到黑线,中速右转case240:stop();break;//全都检测到黑线,停止default:expe();break;//接收到未知数据,保持原来方向前进}}/*************************主函数***************************************************/voidmain(void){com_init();//四组IO口初始化dian_init();//电机初始化timer_init();//定时器初始化led=0;flagxun=0;while(!flagxun){if(recv_flag==1)//recv_flag==1表明3个字符全部接收完毕{recv_flag=0;//清空3个字符全部接收完毕标记位bluetooth();//手机APP遥控函数}while(flagxun)xunji();}}/**************************串口中断服务函数****************************************/voidSerial(void)interrupt4//中断接收3个字符{uchartemp_data;//temp_data用来存放接收到的字符RI=0;temp_data=SBUF;if(temp_data=='O'&&(count_data==0))//接收第一个字符串{buffer_data[count_data]=temp_data;count_flag=1;//count_flag=1表示已经接收到第1个字符}else{if(count_flag==1)//开始接收第2、3个字符{count_data++;buffer_data[count_data]=temp_data;if(count_data=2)//count_data=2,表明已经接收3个字符{//此时表明
本文标题:蓝牙循迹小车源程序
链接地址:https://www.777doc.com/doc-5149450 .html