补充一下,主控芯片用的stc89c52,避障小车没有使用PWM波驱动电机,直接将电源降压给电机供电。
#include
#define uint unsigned int
#define uchar unsigned char
#define left_qian IN3=0,IN4=1 //左前进
#define right_qian IN1=0,IN2=1 //右前进
#define left_hou IN3=1,IN4=0// 左后退
#define right_hou IN1=1,IN2=0 //右后退
#define enable {ENA=1,ENB=1;} //电机使能
#define disable {ENA=0,ENB=0;}
uint s=40,pwm_zkb=0,time;
uchar num=3;
uchar i=1,t=0;
uchar distance[4]={0,0,0,0}; //distance[1] 右距离distance[2]正前距离 distance[3] 左距离
sbit trig=P0^0;
sbit echo=P0^1;
sbit IN1=P1^1;
sbit ENA=P1^0;
sbit IN2=P1^2;
sbit ENB=P1^3;
sbit IN3=P1^4;
sbit IN4=P1^5;
sbit PWM=P0^3;
/********************************************函数声明**********************/
int juli(); //测距函数
void delay(uint z); //延迟函数
void init(); //初始化
void delayms(unsigned int ms);
void delay1(void) //延迟20us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=1;a>0;a--);
}
void culibijiso()
{
if(distance[1]<=5 &&distance[2]<=5 && distance[3]<=5 )
{
enable; //先后退后右转
left_hou;
right_hou;
delay(1000);
enable;
left_qian;
right_hou;
delay(200);
}
else
{
if(distance[1]<=15 || distance[2]<=15 || distance[3]<=15)
{
if(distance[1]>=distance[2])
{
if(distance[2]>=distance[3]) //左有障碍物 右转
{
enable;
left_qian;
right_hou;
delay(800);
}
else
{
if(distance[2]<=5) //先后退后左转
{
enable;
left_hou;
right_hou;
delay(800);
left_hou;
right_qian;
delay(200);
}
else //右转
{
enable;
left_qian;
right_hou;
delay(800);
}
}
}
else
{
if(distance[1]>=distance[3]) //左有障碍物 右转
{
enable;
left_qian;
right_hou;
delay(800);
}
else //左转
{
enable;
left_hou;
right_qian;
delay(800);
}
}
}
else //直行
{
enable;
left_qian;
right_qian;
}
}
}
void main()
{
init();
disable;
while(1)
{
if(t==150) //70ms为一个周期检测一次
{
t=0;
s=juli();
if(s>20)
{
enable;
left_qian;
right_qian;
}
else
{
disable;
for(num=2;num<5;num++)
{
pwm_zkb=0;
delay(1000);
distance[i]=juli();
i++;
pwm_zkb=0;
}
num=3;
delay(300);
i=1;
culibijiso();
disable; t=0;
}
}
}
}
void init()
{
TMOD=0X11; //选择定时器1和定时器0
TH0=0;
TL0=0;
TH1=(65536-461)/256; //t1赋初值
TL1=(65536-461)%256;
EA=1; //开总中断
ET1=1; //开定时器1中断
TR1=1; //打开定时器1
}
void time1() interrupt 3
{
TH1=(65536-461)/256;
TL1=(65536-461)%256;
t++;
if(pwm_zkb<num)
{
PWM=1;
}
else
{
PWM=0;
}
pwm_zkb++;
if(pwm_zkb==40)
{
pwm_zkb=0;
}
}
int juli()
{
int ss;
trig=1;
delay1(); //延时20us
trig=0;
while(echo==0); //等待回音
TR0=1; // 开定时器0
while(echo==1); //当为高电平时等待
TR0=0; //关闭定时器0
time=TH0*256+TL0; //读取脉冲长度
ss=(time*1.72)/100; //计算距离 单位为cm
TH0=0; //重新赋初值
TL0=0;
return ss;
}
void delay(uint z)
{
uint i,k;
for(i=z;i>0;i--)
{
for(k=100;k>0;k--);
}
}