您的当前位置:首页正文

超声波避障小车程序设计

2020-02-14 来源:年旅网


/***********************************************************************************************************/

//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 //右前方超声波

#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{ rightrun(); }

else if(S3<20 && S5else if(S2<20)

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

转 }

else if(S4<20)

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

else { run(); } } }

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