超声波避障小车程序设计
/***********************************************************************************************************/ //5
路超声波避障实验:51
单片
机 + HC-SR04超声波 //
/***********************************************************************************************************/ #include #include //小车左侧超声波HC-SR04接收端 #define TX1 P1_7 //发送端 #define RX2 P3_3 //左前方超声波 #define TX2 P0_2 #define RX3 P2_4 //正前方超声波 #define TX3 P2_5 #define RX4 P3_5 //右前 void Count2() //计算函数 { 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 } void Count3() //计算函数 { 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 } void Count4() //计算函数 { 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 } void Count5() //计算函数 { while(!RX5); //当RX5为零时等待 开 启 计 TR0=1; //开启计数 while(RX5); //当RX5为1计数并等待 TR0=0; //关闭计数 time=TH0*256+TL0; TH0=0; TL0=0; S5=(time*1.7)/100; //算出来是CM void leftrun(void) { push_val_left=20; push_val_right=20; Left_moto_back //左电机往后走 Right_moto_go //右电机往前走 } /************************************************************************/ //右转 void rightrun(void) { push_val_left=20; push_val_right=20; Left_moto_go //左电机往前走 Right_moto_back //右电机往后走 } /************************************************************************/ //停止 void stoprun(void) { Left_moto_Stop //停 停 } /************************************************************************/ /* PWM调 制 电 机 转 速 */ /************************************************************************/ /* 左 电 机 调 速 左 右电电 机机 Right_moto_Stop // */ /*调节push_val_left的值改变电机转速 , 占 空 比 */ void pwm_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; } } /************************************** ****************************/ /* 右 电 机 调 速 */ void pwm_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; } } /********************************************************/ void timer0() interrupt 1 //T0中断 { } /***************************************************/ ///*TIMER1中断服务子函数产生PWM信号*/ void timer1()interrupt 3 { TH1=(65536-1000)/256; //1ms定时 TL1=(65536-1000)%256; timer++; pwm_val_left++; pwm_val_right++; pwm_out_left_moto(); pwm_out_right_moto(); } /********************************************************* **********************************************************/ void main(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(S3<20 && S1<20 && S5<20) //进入狭窄通道 { backrun(); //车 delay_1ms(100); } else if(S3<20 && S1 else if(S3<20 && S5 { rightrun(); //车与障碍物呈45度角时,车的左边比车的右边距离小,右转 } else if(S4<20) { leftrun(); //车与障碍物呈45度角时,车的右边比车的左边距离小,左转 } else { run(); } } } 因篇幅问题不能全部显示,请点此查看更多更全内容