51单片机实现智能小车的寻轨避障功能
程序员文章站
2022-05-22 09:06:21
...
我们先来讨论智能小车的各个模块:
1.电机驱动
2.寻迹传感器
它具有四个引脚,分别是:VCC GND D0 A0,我们只需要用到三个引脚,AO不需要使用。一般智能小车上我们是安装两个,左边一个右边一个。
原理:
1.利用黑色对光线的反射率小这个特点,当平面的颜色不是黑色时,反射器发射出去的红外光被大部分反射回来。于是传感器输出低电平0。
2.当平面中有一条黑线,传感器在黑线上方时,因黑色的反射能力很弱,反射的红外光很少,打不到传感器动作的水平,所以传感器输出1。
所以当探头经过黑线时,传感器上的开关指示灯会熄灭,输出的是高电平。如果没有经过黑线,一直保持低电平。
3.红外传感器
它具有三个引脚,分别是:VCC GND OUT
有障碍物灯就会亮,所以有障碍物代表低电平,没有障碍物高电平。
代码实现过程:
我没有将寻轨和避障合并实现,而是分别调试的。
#include <reg51.h>
sbit IN1=P0^0; //电机驱动模块引脚
sbit IN2=P0^1;
sbit IN3=P0^2;
sbit IN4=P0^3;
sbit Left_led=P0^4; //寻轨模块引脚
sbit Right_led=P0^5;
sbit Left_bizhang=P0^6;//避障模块引脚
sbit Right_bizhang=P0^7;
unsigned char pwm_val=0;//变量定义,每次加1
unsigned char push_val=0;//栈空比N/10
//延时函数
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
{
for(y=0;y<2000;y++);
}
}
//前进
void run(void)
{
push_val=3;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
//后退
void backrun(void)
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
//左转
void leftrun(void)
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}
//右转
void rightrun(void)
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
}
//点击停止转动
void stop(void)
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void pwm_out_moto(void)
{
if(pwm_val <= push_val)
{
run();
}
else
{
stop();
}
if(pwm_val>=10)
pwm_val=0;
}
void timer0()interrupt 1 using 2
{
TH0=0xFC;
TL0=0x18;
pwm_val++;
pwm_out_moto();
}
void main(void)
{
P1=0x00;
TMOD=0x01;
TH0=0xFC;//定时1ms
TL0=0x18;
TR0=1;
EA=1;
while(1)
{
run();
/*if(Left_led==0&&Right_led==0)
{
ET0=1;
run();
}
else
{
if(Left_led==0&&Right_led==1)
{
rightrun();
}
if(Right_led==0&&Left_led==1)
{
leftrun();
}
}*/
if(Left_bizhang==1&&Right_bizhang==1)
{
run();
}
else
{
if(Left_bizhang==1&&Right_bizhang==0)
{
backrun();
delay(50);
leftrun();
delay(100);
}
if(Left_bizhang==0&&Right_bizhang==1)
{
backrun();
delay(50);
rightrun();
delay(100);
}
}
}
}