文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
系统运行后,LCD1602显示红外、超声波检测状态和距离、小车运行状态。可通过K1键可手动切换模式,寻迹、避障、蓝牙遥控;也可通过蓝牙发送指令切换模式;
当处于寻迹模式,依靠四个红外传感器控制小车寻迹行驶;
当处于避障模式,依靠2个红外传感器和超声波控制小车避障行驶;
当处于蓝牙遥控模式,可通过上位机发送控制指令实现小车方向控制;
蓝牙遥控指令(十六进制):
0X11–>前进
0X12–>后退
0X13–>左转
0X14–>右转
0X20–>模式切换
二、软件设计
/*
作者:嗨小易(QQ:3443792007)
*/
//系统数据获取
void sys_data_get(void)
{
while(1)
{
//超声波距离检测
USART_Cmd(USART1, DISABLE);
sys_ctrl.dis=ultrasonicwave_measure();
USART_Cmd(USART1, ENABLE);
//避障状态检测
if(sys_ctrl.dis>ALARM_DIST_MIN)
{
if(IRED_BZ_L==0)sys_ctrl.bz_status=1;
else if(IRED_BZ_R==0)sys_ctrl.bz_status=3;
else sys_ctrl.bz_status=0;
}
else
{
if(IRED_BZ_L==0)sys_ctrl.bz_status=4;
else if(IRED_BZ_R==0)sys_ctrl.bz_status=5;
else sys_ctrl.bz_status=2;
}
//红外寻迹状态检测
if(IRED_XJ_L1==0)
{
if(IRED_XJ_L2==0)sys_ctrl.xj_status=3;
else sys_ctrl.xj_status=1;
}
else
{
if(IRED_XJ_L2==0)sys_ctrl.xj_status=2;
}
if(IRED_XJ_L2==0)
{
if(IRED_XJ_R2==0)sys_ctrl.xj_status=4;
}
else
{
if(IRED_XJ_R2==0)
{
if(IRED_XJ_R1==0)sys_ctrl.xj_status=6;
else sys_ctrl.xj_status=5;
}
else
{
if(IRED_XJ_R1==0)sys_ctrl.xj_status=7;
}
}
if(IRED_XJ_L1==1&&IRED_XJ_L2==1&&IRED_XJ_R2==1&&IRED_XJ_R1==1)
sys_ctrl.xj_status=0;
break;
}
}
//系统数据显示
void sys_data_show(void)
{
while(1)
{
//距离显示
lcd1602_show_nums(2,0,sys_ctrl.dis,3,0);
//模式显示
switch(sys_ctrl.mode)
{
case 0: lcd1602_show_string(8,0,"XJ");break;
case 1: lcd1602_show_string(8,0,"BZ");break;
case 2: lcd1602_show_string(8,0,"YK");break;
}
//运行状态显示
switch(sys_ctrl.run)
{
case 0: lcd1602_show_string(4,1,"Stop");break;
case 1: lcd1602_show_string(4,1,"Ford");break;
case 2: lcd1602_show_string(4,1,"Back");break;
case 3: lcd1602_show_string(4,1,"Left");break;
case 4: lcd1602_show_string(4,1,"Rigt");break;
}
//避障状态显示
switch(sys_ctrl.bz_status)
{
case 0: lcd1602_show_string(14,0,"N");break;
case 1: lcd1602_show_string(14,0,"L ");break;
case 2: lcd1602_show_string(14,0,"Q ");break;
case 3: lcd1602_show_string(14,0,"R ");break;
case 4: lcd1602_show_string(14,0,"LQ");break;
case 5: lcd1602_show_string(14,0,"QR");break;
}
//红外寻迹状态显示
switch(sys_ctrl.xj_status)
{
case 0: lcd1602_show_string(12,1,"N ");break;
case 1: lcd1602_show_string(12,1,"L1 ");break;
case 2: lcd1602_show_string(12,1,"L2 ");break;
case 3: lcd1602_show_string(12,1,"L12 ");break;
case 4: lcd1602_show_string(12,1,"L2R2");break;
case 5: lcd1602_show_string(12,1,"R2 ");break;
case 6: lcd1602_show_string(12,1,"R12 ");break;
case 7: lcd1602_show_string(12,1,"R1 ");break;
}
break;
}
}
//系统功能控制
void sys_fun_ctrl(void)
{
//寻迹模式
if(sys_ctrl.mode==0)
{
if(sys_ctrl.xj_status==0)//4个红外未感应
{
car_forward();//前进
sys_ctrl.run=1;
}
else if(sys_ctrl.xj_status==1 || sys_ctrl.xj_status==2
|| sys_ctrl.xj_status==3)//左1、2或12感应
{
car_left();//左转
sys_ctrl.run=3;
}
else if(sys_ctrl.xj_status==4 || sys_ctrl.xj_status==5
|| sys_ctrl.xj_status==6|| sys_ctrl.xj_status==7)//右1、2或12感应
{
car_right();//右转
sys_ctrl.run=4;
}
}
//避障模式
else if(sys_ctrl.mode==1)
{
if(sys_ctrl.bz_status==0)//没有障碍物
{
car_forward();//前进
sys_ctrl.run=1;
}
else if(sys_ctrl.bz_status==1 || sys_ctrl.bz_status==2
|| sys_ctrl.bz_status==4)//左侧或中间障碍物
{
car_right();//右转
sys_ctrl.run=4;
}
else if(sys_ctrl.bz_status==3 || sys_ctrl.bz_status==5)//右侧或中间障碍物
{
car_left();//左转
sys_ctrl.run=3;
}
}
//蓝牙遥控模式
else if(sys_ctrl.mode==2)
{
if(USART1_RX_BUF[0]==CAR_FORWARD_CMD)//前进
{
USART1_RX_BUF[0]=0;
car_forward();//前进
sys_ctrl.run=1;
}
else if(USART1_RX_BUF[0]==CAR_BACK_CMD)//后退
{
USART1_RX_BUF[0]=0;
car_back();//后退
sys_ctrl.run=2;
}
else if(USART1_RX_BUF[0]==CAR_LEFT_CMD)//左转
{
USART1_RX_BUF[0]=0;
car_left();//左转
sys_ctrl.run=3;
}
else if(USART1_RX_BUF[0]==CAR_RIGHT_CMD)//右转
{
USART1_RX_BUF[0]=0;
car_right();//右转
sys_ctrl.run=4;
}
else
{
car_stop();//停止
sys_ctrl.run=0;
}
}
//遥控切换模式
if(USART1_RX_BUF[0]==CAR_MODE_CMD)//模式切换
{
USART1_RX_BUF[0]=0;
sys_ctrl.mode++;
if(sys_ctrl.mode>2)sys_ctrl.mode=0;
}
}
//应用控制系统
void appdemo_show(void)
{
sys_parm_init();//系统参数初始化
KEY_Init();
ctrl_pin_init();
lcd1602_init();//LCD1602初始化
sys_open_show();//系统初始界面显示
ultrasonicwave_init();//超声波初始化
dc_motor_init();
USART1_Init(9600);
while(1)
{
sys_data_get();//系统数据获取
sys_data_show();//系统数据显示
sys_data_set();//系统数据设置
sys_fun_ctrl();//系统功能控制
}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。