您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 超声波避障小车程序设计
/***********************************************************************************************************///5路超声波避障实验:51单片机+HC-SR04超声波///***********************************************************************************************************/#includeAT89x52.H//器件配置文件#includeintrins.h#defineRX1P3_6//小车左侧超声波HC-SR04接收端#defineTX1P1_7//发送端#defineRX2P3_3//左前方超声波#defineTX2P0_2#defineRX3P2_4//正前方超声波#defineTX3P2_5#defineRX4P3_5//右前方超声波#defineTX4P3_4#defineRX5P3_7//右侧超声波#defineTX5P1_6#defineLeft_moto_pwmP1_5//PWM信号端#defineRight_moto_pwmP1_4//PWM信号端//定义小车驱动模块输入IO口sbitIN1=P1^0;sbitIN2=P1^1;sbitIN3=P1^2;sbitIN4=P1^3;sbitEN1=P1^4;sbitEN2=P1^5;bitRight_moto_stop=1;bitLeft_moto_stop=1;#defineLeft_moto_go{IN1=0,IN2=1,EN1=1;}//左电机向前走#defineLeft_moto_back{IN1=1,IN2=0,EN1=1;}//左边电机向后走#defineLeft_moto_Stop{EN1=0;}//左边电机停转#defineRight_moto_go{IN3=1,IN4=0,EN2=1;}//右边电机向前走#defineRight_moto_back{IN3=0,IN4=1,EN2=1;}//右边电机向后走#defineRight_moto_Stop{EN2=0;}//右边电机停转unsignedcharpwm_val_left=0;//变量定义unsignedcharpush_val_left=0;//左电机占空比N/20unsignedcharpwm_val_right=0;unsignedcharpush_val_right=0;//右电机占空比N/20unsignedinttime=0;unsignedinttimer=0;unsignedlongS1=0;unsignedlongS2=0;unsignedlongS3=0;unsignedlongS4=0;unsignedlongS5=0;voiddelay_1ms(unsignedcharx)//1ms延时函数,100ms以内可用{unsignedchari;while(x--)for(i=124;i0;i--);}/********************************************************/voidCount1()//计算左侧超声波距离的函数{while(!RX1);//当RX1为零时等待TR0=1;//开启计数while(RX1);//当RX1为1计数并等待TR0=0;//关闭计数time=TH0*256+TL0;TH0=0;TL0=0;S1=(time*1.7)/100;//算出来是CM}voidCount2()//计算函数{while(!RX2);//当RX2为零时等待TR0=1;//开启计数while(RX2);//当RX2为1计数并等待TR0=0;//关闭计数time=TH0*256+TL0;TH0=0;TL0=0;S2=(time*1.7)/100;//算出来是CM}voidCount3()//计算函数{while(!RX3);//当RX3为零时等待TR0=1;//开启计数while(RX3);//当RX3为1计数并等待TR0=0;//关闭计数time=TH0*256+TL0;TH0=0;TL0=0;S3=(time*1.7)/100;//算出来是CM}voidCount4()//计算函数{while(!RX4);//当RX4为零时等待TR0=1;//开启计数while(RX4);//当RX4为1计数并等待TR0=0;//关闭计数time=TH0*256+TL0;TH0=0;TL0=0;S4=(time*1.7)/100;//算出来是CM}voidCount5()//计算函数{while(!RX5);//当RX5为零时等待TR0=1;//开启计数while(RX5);//当RX5为1计数并等待TR0=0;//关闭计数time=TH0*256+TL0;TH0=0;TL0=0;S5=(time*1.7)/100;//算出来是CMvoidleftrun(void){push_val_left=20;push_val_right=20;Left_moto_back//左电机往后走Right_moto_go//右电机往前走}/************************************************************************///右转voidrightrun(void){push_val_left=20;push_val_right=20;Left_moto_go//左电机往前走Right_moto_back//右电机往后走}/************************************************************************///停止voidstoprun(void){Left_moto_Stop//左电机停Right_moto_Stop//右电机停}/************************************************************************//*PWM调制电机转速*//************************************************************************//*左电机调速*//*调节push_val_left的值改变电机转速,占空比*/voidpwm_out_left_moto(void){if(Left_moto_stop){if(pwm_val_left=push_val_left){Left_moto_pwm=1;}else{Left_moto_pwm=0;}if(pwm_val_left=20)pwm_val_left=0;}else{Left_moto_pwm=0;}}/******************************************************************//*右电机调速*/voidpwm_out_right_moto(void){if(Right_moto_stop){if(pwm_val_right=push_val_right){Right_moto_pwm=1;}else{Right_moto_pwm=0;}if(pwm_val_right=20)pwm_val_right=0;}else{Right_moto_pwm=0;}}/********************************************************/voidtimer0()interrupt1//T0中断{}/***************************************************////*TIMER1中断服务子函数产生PWM信号*/voidtimer1()interrupt3{TH1=(65536-1000)/256;//1ms定时TL1=(65536-1000)%256;timer++;pwm_val_left++;pwm_val_right++;pwm_out_left_moto();pwm_out_right_moto();}/*******************************************************************************************************************/voidmain(void){TMOD=0x11;//设T0为方式1,GATE=1;TH0=0;TL0=0;TH1=(65536-1000)/256;//1ms定时TL1=(65536-1000)%256;ET0=1;//允许T0中断ET1=1;//允许T1中断TR1=1;//开启定时器EA=1;//开启总中断while(1){TX1=1;//开启超声波1探测delay_1ms(1);TX1=0;Count1();//测距TX2=1;delay_1ms(1);TX2=0;Count2();TX3=1;delay_1ms(1);TX3=0;Count3();TX4=1;delay_1ms(1);TX4=0;Count4();TX5=1;delay_1ms(1);TX5=0;Count5();if(S320&&S120&&S520)//进入狭窄通道{backrun();//倒车delay_1ms(100);}elseif(S320&&S1S5)//车子与障碍物90度垂直,左边距离小右转{rightrun();}elseif(S320&&S5S1)//车子与障碍物90度垂直,右边距离小左转{leftrun();}elseif(S220){rightrun();//车与障碍物呈45度角时,车的左边比车的右边距离小,右转}elseif(S420){leftrun();//车与障碍物呈45度角时,车的右边比车的左边距离小,左转}else{run();}}}
本文标题:超声波避障小车程序设计
链接地址:https://www.777doc.com/doc-2042271 .html