Proteus仿真下的51单片机自动避障寻迹智能小车设计
文章目录
一、主要功能
本项目使用Proteus8仿真51单片机控制器,使用LCD1602液晶模块、DS18B20模块、超声波模块、蜂鸣器、按键、红外寻迹模块等。
主要功能:
系统运行后,LCD1602显示DS18B20采集温度和超声波检测距离
以及左右红外传感器检测的AD值。
可通过S1键选择自动/手动控制模式,当处于手动模式时,可
通过K1-K4键控制小车运行方向。当处于自动模式时,根据左右
超声波检测距离、红外传感器检测黑线值自动控制小车运行,
当超声波检测距离小于危险距离,小车立即停止。
主要功能如下:
1、温度、距离显示
2、超声波避障,报警指示
3、红外寻迹
4、自动/手动控制
二、硬件资源
1、51单片机核心模块
2、LCD1602液晶模块
3、DS18B20模块
4、按键、蜂鸣器模块
5、超声波模块
6、红外寻迹传感器模块
三、软件设计
/*
作者:嗨小易(QQ:3443792007)
*/
//系统参数设置
void sys_parm_set(void)
{
u8 key=0;
static u8 md=0;
//自动/手动模式选择
if(MODE_SW==0)
{
sys_ctrl.mode=1;//手动
if(md==0)
lcd1602_show_string(14,0,"Mn");
md=1;
}
else
{
sys_ctrl.mode=0;//自动
if(md==1)
lcd1602_show_string(14,0,"Au");
md=0;
}
//手动模式下,可通过按键控制
if(sys_ctrl.mode)
{
key=key_scan(1);
//前进
if(key==KEY1_PRESS)
{
car_forward();
}
else if(key==KEY2_PRESS)//左转
{
car_left();
}
else if(key==KEY3_PRESS)//后退
{
car_back();
}
else if(key==KEY4_PRESS)//右转
{
car_right();
}
else//停止
{
car_stop();
}
}
}
//系统数据采集
void sys_data_get(void)
{
static u8 i=0;
while(1)
{
i++;
//间隔采集温度、距离
if(i%10==0)
{
sys_ctrl.temp=ds18b20_read_temperture()*10;//放大10倍,保留小数点后1位
if(sys_ctrl.temp<0)
{
sys_ctrl.sign=1;//负温度符号
sys_ctrl.temp=-sys_ctrl.temp;
}
else
sys_ctrl.sign=0;//正温度符号
}
//左距离检测
sys_ctrl.dis[0]=ultrasonicwave_measure(0);
//右距离检测
sys_ctrl.dis[1]=ultrasonicwave_measure(1);
//读取左AD值
sys_ctrl.adval[0]=pcf8591_read_adcvalue(1);
//读取右AD值
sys_ctrl.adval[1]=pcf8591_read_adcvalue(0);
break;
}
}
//系统数据显示
void sys_data_show(void)
{
u8 buf[6];
while(1)
{
//温度显示
buf[0]=sys_ctrl.temp/100+0x30;
if(buf[0]==0x30)buf[0]=' ';
buf[1]=sys_ctrl.temp%100/10+0x30;
buf[2]='.';
buf[3]=sys_ctrl.temp%100%10+0x30;
buf[4]='\0';
lcd1602_show_string(2,0,buf);
//左距离检测值显示
buf[0]=sys_ctrl.dis[0]%100/10+0X30;
if(buf[0]==0x30)buf[0]=' ';
buf[1]=sys_ctrl.dis[0]%10+0X30;
buf[2]='\0';
lcd1602_show_string(2,1,buf);
//右距离检测值显示
buf[0]=sys_ctrl.dis[1]%100/10+0X30;
if(buf[0]==0x30)buf[0]=' ';
buf[1]=sys_ctrl.dis[1]%10+0X30;
buf[2]='\0';
lcd1602_show_string(9,1,buf);
//左红外检测值显示
buf[0]=sys_ctrl.adval[0]%100/10+0X30;
if(buf[0]==0x30)buf[0]=' ';
buf[1]=sys_ctrl.adval[0]%10+0X30;
buf[2]='\0';
lcd1602_show_string(8,0,buf);
//右红外检测值显示
buf[0]=sys_ctrl.adval[1]%100/10+0X30;
if(buf[0]==0x30)buf[0]=' ';
buf[1]=sys_ctrl.adval[1]%10+0X30;
buf[2]='\0';
lcd1602_show_string(11,0,buf);
break;
}
}
//系统功能控制
void sys_fun_ctrl(void)
{
//自动模式下,避障,寻迹
if(sys_ctrl.mode==0)
{
//红外寻迹
//如果左红外检测值大于右红外检测值,小车左转
if(sys_ctrl.adval[0]>sys_ctrl.adval[1])
{
car_left();
}
//如果右红外检测值大于左红外检测值,小车右转
else if(sys_ctrl.adval[1]>sys_ctrl.adval[0])
{
car_right();
}
else
{
car_forward();
}
//超声波避障
//如果左超声波检测距离小于避障距离,小车右转
if(sys_ctrl.dis[0]<=BZ_DISTANCE)
{
car_right();
BEEP=0;//蜂鸣器报警
}
//如果右超声波检测距离小于避障距离,小车左转
if(sys_ctrl.dis[1]<=BZ_DISTANCE)
{
car_left();
BEEP=0;//蜂鸣器报警
}
if(sys_ctrl.dis[0]>BZ_DISTANCE && sys_ctrl.dis[1]>BZ_DISTANCE)
{
BEEP=1;
}
//如果超声波检测距离小于危险距离,小车停止
if(sys_ctrl.dis[0]<=ALARM_DISTANCE || sys_ctrl.dis[1]<=ALARM_DISTANCE)
{
car_stop();
BEEP=0;//蜂鸣器报警
delay_ms(100);
BEEP=1;
}
}
}
//应用控制系统
void appdemo_show(void)
{
u8 i=10;
lcd1602_init();
ds18b20_init();
sys_parm_init();//系统参数初始化
//等待温度数据稳定
while(i--)
{
sys_ctrl.temp=ds18b20_read_temperture()*10;
delay_ms(100);
}
sys_open_show();//系统开机显示
ultrasonicwave_init();//超声波初始化
while(1)
{
sys_data_get();//系统数据采集
sys_data_show();//系统数据显示
sys_parm_set();//系统参数设置
sys_fun_ctrl();//系统功能控制
}
}
四、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
B站演示视频:https://space.bilibili.com/444388619
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。