您的当前位置:首页正文

超声波避障小车程序设计

2024-05-13 来源:年旅网


超声波避障小车程序设计

/***********************************************************************************************************/ //5

路超声波避障实验:51

单片

机 + HC-SR04超声波 //

/***********************************************************************************************************/ #include //器件配置文件

#include #define RX1 P3_6

//小车左侧超声波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 && S5else if(S2<20)

{ rightrun(); //车与障碍物呈45度角时,车的左边比车的右边距离小,右转 } else if(S4<20)

{ leftrun(); //车与障碍物呈45度角时,车的右边比车的左边距离小,左转 }

else { run(); } } }

因篇幅问题不能全部显示,请点此查看更多更全内容