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

news2024/11/27 22:39:53

文章目录

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


一、功能简介

系统运行后,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设计,视频分享,技术交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

绝佳用户体验:构建响应式网页设计的关键原则

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 当谈到前端开发时&#…

使用Java创建一个简单的图书管理系统

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 图书管理系统项目简…

for...in...与for..of...

for...in... 仅迭代自身的属性for...in 语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。 for ... in是为遍历对象属性而构建的,不建议与数组一起使用,数组可以Array.prototype.forEach()和for ... of const …

Python实现猎人猎物优化算法(HPO)优化Catboost回归模型(CatBoostRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

新手如何开始Microstation CE版二次开发

一步步学习MicroStation CE MDL(C)开发 - 技术资料库 - Bentley 中国优先社区 - Bentley Communities https://communities.bentley.com/communities/other_communities/chinafirst/w/chinawiki/57704/microstation-ce-mdl-c一步步学习MicroStation CE A…

python项目制作docker镜像,加装引用模块,部署运行!

一、创建Dockerfile # 基于python:3.10.4版本创建容器 FROM python:3.10.4 # 在容器中创建工作目录 RUN mkdir /app # 将当前Dockerfile目录下的所有文件夹和文件拷贝到容器/app目录下 COPY . /app# 由于python程序用到了requests模块和yaml模块, # python:3.10.4基…

使用Java创建一个待办事项列表

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 待办事项列表项目简…

基于串口通讯的多电机控制技术研究

基于STM32CubeMX生成keil工程 基于proteus 8.7版本进行程序验证 采用了简单的串口通讯协议 基本效果如图 先对电机旋转方向进行指令设置 :221 :320 分别实现对第二个电机正转、第三个电机反转设置 为了方便观测,程序对接受到的串口数据会进行回显。 然后使能电…

用c语言编写出三底模型

以下是一个用C语言实现三底模型的示例代码。这个程序通过循环遍历输入的股票数据&#xff0c;判断是否出现三底形态&#xff0c;如果是&#xff0c;则输出买入信号&#xff0c;否则输出卖出信号。 c语言 #include <stdio.h> #include <stdlib.h> // 判断是否出现…

Python计算机二级知识点整理

1. 一个完整的二叉树包括根节点&#xff0c;左子树和右子树&#xff0c;不同的遍历方式的区别就是访问的顺序的不同&#xff0c;前序遍历是首先访问根节点然后再访问左子树和右子树&#xff0c;中序遍历是访问根节点在访问左子树和右子树之间&#xff0c;后序遍历是先访问左子树…

ElasticSearch 5.6.3 自定义封装API接口

在实际业务中&#xff0c;查询 elasticsearch 时会遇到很多特殊查询&#xff0c;官方接口包有时不便利&#xff0c;特殊情况需要自定义接口&#xff0c;所以为了灵活使用、维护更新 编写了一套API接口&#xff0c;仅供学习使用 当前自定义API接口依赖 elasticsearch 5.6.3 版本…

centos7内存过高排查

centos7内存过高排查 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.查找使用内存过大的进程 ps查看按内存排序的前3个进程 ps auxw|head -1;ps auxw|sort -rn -k4|head -3 #或 ps aux --sort-%mem | head -n 4 #这里就是4&#xff0c;查看的是前3个进程 2.可以…

Vue自动生成二维码并可下载二维码

遇到一个需求&#xff0c;需要前端自行生成用户的个人名片分享二维码&#xff0c;并提供二维码下载功能。在网上找到很多解决方案&#xff0c;最终吭哧吭哧做完了&#xff0c;把它整理记录一下&#xff0c;方便后续学习使用&#xff01;嘿嘿O(∩_∩)O~ 这个小东西有以下功能特点…

【深入解读Redis系列】(五)Redis中String的认知误区,详解String数据类型

有时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步&#xff0c;请认准https://blog.zysicyj.top 首发博客地址 系列文章地址 需求描述 现在假设有这样一个需求&#xff0c;我们要开发一个图像存储系统。要求如下&#xff1a; 该系统能快…

QT QAxWidget控件 使用详解

本文详细的介绍了QAxWidget控件的各种操作&#xff0c;例如&#xff1a;新建界面、使用示例、显示网页、显示pdf、显示Off、源文件详细说明其它文章等等操作。 ActiveX控件是一种可重用的二进制组件&#xff0c;用于在Windows操作系统上提供特定的功能和服务。以下是一些常见的…

python pycharm 下载 安装 自(1)

pycharm 官网 JetBrains: 软件开发者和团队的必备工具 python 官网 Python Release Python 3.11.5 | Python.org 软件安装 因为python需要借助pycharm所以需要安装 下边截图是重要的部分 pycharm python 终端安装 然后进行全局配置 打开pycahrm 可以在扩展里边搜索中…

后端字典的优雅设计

背景 今天讲到的是数据字典的设计。为什么要讲到这个呢&#xff0c;因为我下午在做开发的时候遇到了一个问题。我先扔出来某个表的字段的定义吧&#xff1a; business_type int default 0 comment 0&#xff1a;收款计划&#xff1b;1&#xff1a;付款计划而且我还有一个字典…

【2023年11月第四版教材】第12章《质量管理》(合集篇)

第12章《质量管理》&#xff08;合集篇&#xff09; 1 章节说明2 管理基础3 管理过程3.1 管理ITTO汇总★★★ 4 规划质量管理4.1 数据收集★★★4.2 数据分析★★★4.3 数据表现★★★4.4 质量管理计划★★★4.5 质量测量指标★★★ &#xff08;22下35&#xff09; 5 管理质量…

SpringMVC系列(六)之JSON数据返回以及异常处理机制

目录 前言 一. JSON概述 二. JSON数据返回 1. 导入pom依赖 2. 添加配置文件&#xff08;spring-mvc.xml&#xff09; 3. ResponseBody注解使用 4. 效果展示 5. Jackson介绍 三. 全局异常处理 1. 为什么要全局异常处理 2. 异常处理思路 3. 异常处理方式一 4. 异常处…

算法--插入排序

算法步骤 /*** 插入排序** version 1.0* date 2023/09/01 18:48:44*/ public class Insert {/*** 升序插入排序** param a 待排序的数组* date 2023/9/1 15:29:10*/public static void sortAes(int[] a) {int length a.length;for (int i 1; i < length; i) {for (int j …