/***********************************************************************************************************/
//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 //右前方超声波 #define TX4 P3_4 #define RX5 P3_7 //右侧超声波 #define TX5 P1_6 #define Left_moto_pwm P1_5 //PWM信号端 #define Right_moto_pwm P1_4 //PWM信号端 //定义小车驱动模块输入IO口 sbit IN1=P1^0; sbit IN2=P1^1; sbit IN3=P1^2; sbit IN4=P1^3; sbit EN1=P1^4; sbit EN2=P1^5; bit Right_moto_stop=1; bit Left_moto_stop =1; #define Left_moto_go {IN1=0,IN2=1,EN1=1;} //左电机向前走 #define Left_moto_back {IN1=1,IN2=0,EN1=1;} //左边电机向后走 #define Left_moto_Stop {EN1=0;} //左边电机停转 #define Right_moto_go {IN3=1,IN4=0,EN2=1;} //右边电机向前走 #define Right_moto_back {IN3=0,IN4=1,EN2=1;} //右边电机向后走 #define Right_moto_Stop {EN2=0;} //右边电机停转 unsigned char pwm_val_left =0;//变量定义 unsigned char push_val_left =0;// 左电机占空比N/20 unsigned char pwm_val_right =0; unsigned char push_val_right=0;// 右电机占空比N/20 unsigned int time=0; unsigned int timer=0; unsigned long S1=0; unsigned long S2=0; unsigned long S3=0; unsigned long S4=0; unsigned long S5=0; void delay_1ms(unsigned char x) //1ms延时函数,100ms用 { unsigned char i; while(x--) for(i=124;i>0;i--); } /********************************************************/ void Count1() //计算左侧超声波距离的函数 { 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 } 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 //左电机停 Right_moto_Stop //右电机停 } /************************************************************************/ /* PWM 调 制 电 机 转 速 */ /************************************************************************/ /* 左电机调速 */ /*调节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(); } } } 因篇幅问题不能全部显示,请点此查看更多更全内容