【Proteus仿真】【STM32单片机】四驱寻迹避障小车

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

系统运行后,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

【Proteus仿真】【STM32单片机】四驱寻迹避障小车_第1张图片
【Proteus仿真】【STM32单片机】四驱寻迹避障小车_第2张图片
【Proteus仿真】【STM32单片机】四驱寻迹避障小车_第3张图片
【Proteus仿真】【STM32单片机】四驱寻迹避障小车_第4张图片
【Proteus仿真】【STM32单片机】四驱寻迹避障小车_第5张图片


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

你可能感兴趣的:(单片机,proteus,stm32)