课设-基于51单片机的智能小车(循迹+避障+APP控制)

2023-05-16

51单片机课设—智能小车

    • 一、课设任务
    • 二、硬件设计及相关传感器模块
      • 1、车模
      • 2、51单片机
      • 3、红外循迹模块
      • 4、电机及驱动
      • 5、蓝牙模块
      • 6、硬件搭建
    • 三、程序代码
      • 1、main.c文件
      • 2、motor.c文件
    • 四、我的大学--“造车”史

在这里插入图片描述

注:本设计资源可在微信公众号:“Kevin的学习站” 中获取!如有问题,可以加我QQ:643470489一起交流哦!

一、课设任务

使用51单片机设计一台智能小车,可以实现循迹、避障、手机APP控制等功能!

二、硬件设计及相关传感器模块

1、车模

在这里插入图片描述

2、51单片机

可以使用最小系统板,也可以使用自己的学习板
在这里插入图片描述

3、红外循迹模块

在这里插入图片描述
红外循迹的原理:

4、电机及驱动

在这里插入图片描述

5、蓝牙模块

在这里插入图片描述

6、硬件搭建

原则:硬件搭建的不好,会让我们在调试过程中遇到很多玄学问题,比如:杜邦线接触不良,杜邦线短路等等,为了调试更加舒服,在搭建硬件平台时,接口要做一些处理,比如接口处用热熔胶粘好,防止脱落,布线要尽量整齐一些,如果要参加智能车类的比赛,一个好的布线布局,会让你的对手瞬间感受到压力!

在这里插入图片描述

三、程序代码

1、main.c文件

#include "reg52.h"
sbit KEY1 = P3^3;
sbit KEY2 = P3^4;
sbit KEY3 = P3^6;
sbit KEY4 = P3^7;
sbit OUT1 = P2^4;//避障左       
sbit OUT2 = P2^5;//循迹左      
sbit OUT3 = P2^6;//循迹右    
sbit OUT4 = P2^7;//避障左   

extern void delay_ms(unsigned int n);
extern void go_stop(void);
extern void go_up(void);
extern void go_back(void);
extern void go_left(void);
extern void go_right(void);
extern void go_upleft(unsigned int n);
extern void go_upright(unsigned int n);
extern void go_backleft(unsigned int n);
extern void go_backright(unsigned int n);
unsigned char recv;

void uart_init(void)
{
	/*波特率设置*/
	TMOD = 0x20;//设置定时器T1的工作方式-2,即8位自动装填定时器
	TH1 = 0xFD;//波特率为9600
	TL1 = 0xFD;	
	TR1 = 1;//打开定时器T1
	/*串口设置*/
	SM0 = 0;//设置串口工作方式1
	SM1 = 1;
	REN = 1;//使能串口接收允许位
	ES  = 1;//使能串行中断允许位
	EA  = 1;//使能中断允许位
}

/*把str指向的字符串发送到串口,长度为len个字节*/
void uart_send(unsigned char *str,int len)
{
	unsigned char i;
	for(i=0;i<len;i++)
	{
		SBUF = str[i];//对SBUF进行写操作
		while(TI == 0);//等待发送完成
		TI = 0;
	}
}

void remote_control(void)
{
	while(1)
	{
		switch(recv)
		{
			case 0:
				go_stop();break;
			case 1:
				go_up();break;
			case 2:
				go_back();break;
			case 3:
				go_left();break;
			case 4:
				go_right();break;
			case 5:
				go_upleft(6);break;
			case 6:
				go_upright(6);break;
		}
	}
}
//红外循迹
void search_path(void)
{
	while(1)
	{
		if(OUT2==0 && OUT3==0)//两个红外探测器没有再黑线中
		{
			go_up();
		}
		else if(OUT2==1 && OUT3==0)//左边的红外探测器在黑线中
		{
			go_left();
		}
		else if(OUT2==0 && OUT3==1)//右边的红外探测器在黑线中
		{
			go_right();
		}
		else if(OUT2==1 && OUT3==1)//到达终点
		{
			go_back();
		}
	}
}
//红外避障
void auto_avoid(void)
{
	while(1)
	{
		if(OUT1==1 && OUT4==1)//没有障碍物
		{
			go_up();
		}
		else if(OUT1==0 && OUT4==1)//左边有障碍物
		{
			go_backleft(4);
		}
		else if(OUT1==1 && OUT4==0)//右边有障碍物
		{
			go_backright(4);
		}
		else if(OUT1==0 && OUT4==0)//前面有障碍物
		{
			go_stop();
		}
	}
}
void main(void)
{
	unsigned char ATcmd[]={"AT+NAME=GEC-zhangxueyou\r\n"};

	uart_init();
		if(KEY1 == 0)//修改蓝牙设备
		{
			 uart_send(ATcmd,sizeof(ATcmd));
			 delay_ms(1000);
		}
		else if(KEY2 == 0)//手机遥控模式
		{
			 remote_control();
		}
		else if(KEY3 == 0)//循迹模式
		{
			 search_path();
		}
		else if(KEY2 == 0)//自动避障模式
		{
			 auto_avoid();
		}

	
}

void uart_isr(void)  interrupt 	4 //串口中断处理函数
{
	if(RI == 1)//由接收完成引发中断
	{
		RI = 0;
		recv = SBUF;//对SBUF进行读操作
		SBUF = recv;
		while(TI == 0);
		TI = 0;
	}
}

2、motor.c文件

#include "reg52.h"

sbit La = P2^1;
sbit Lb = P2^0;
sbit Ra = P2^3;
sbit Rb = P2^2;

void delay_ms(unsigned int n)//延时
{
	unsigned char i;
	while(n--)
	{
		for(i=0;i<113;i++);
	}
}
void go_stop(void)//停止
{
	La = 0;
	Lb = 0;
	Ra = 0;
	Rb = 0;
}

void go_up(void)//前进
{
	La = 1;
	Lb = 0;
	Ra = 1;
	Rb = 0;
	delay_ms(100);
}

void go_back(void)//后退
{
	La = 0;
	Lb = 1;
	Ra = 0;
	Rb = 1;
	delay_ms(100);
}

void go_left(void)//原地左转
{
	La = 0;
	Lb = 1;
	Ra = 1;
	Rb = 0;
	delay_ms(100);
}

void go_right(void)//原地右转
{
	La = 1;
	Lb = 0;
	Ra = 0;
	Rb = 1;
	delay_ms(100);
}


void go_upleft(unsigned int n)//前进左偏
{
	unsigned int i=30;
	Ra = 1;
	Rb = 0;
	Lb = 0;
	while(i--)
	{
		La = 1;
		delay_ms(n);
		La = 0;
		delay_ms(10-n);
	}
}
void go_upright(unsigned int n)//前进右偏
{
	unsigned int i=30;
	La = 1;
	Lb = 0;
	Rb = 0;
	while(i--)
	{
		Ra = 1;
		delay_ms(n);
		Ra = 0;
		delay_ms(10-n);
	}
}

void go_backleft(unsigned int n)//后退左偏
{
	unsigned int i=200;
	Ra = 0;
	Rb = 1;
	La = 0;
	while(i--)
	{
		Lb = 1;
		delay_ms(n);
		Lb = 0;
		delay_ms(10-n);
	}
}
void go_backright(unsigned int n)//后退右偏
{
	unsigned int i=200;
	La = 0;
	Lb = 1;
	Ra = 0;
	while(i--)
	{
		Rb = 1;
		delay_ms(n);
		Rb = 0;
		delay_ms(10-n);
	}
}

四、我的大学–“造车”史

我记得我是从大一上学期开始我的“造车史”的吧,当时是参加学校冬令营培训,使用51单片机完成的人生的第一台智能车,在小组团队比赛中,我的小车的成绩还不错,哈哈哈,后面参加了学校组织的循迹小车竞赛,与相差0.1s的差距拿了个二等奖;造第二台车是大二的第一学期,当时学完STM32想要做点东西练练手,于是使用STM32又做了台车,不过资料都不见了!大二学校冬令营当时我们作为学长又带领了学弟学妹们又做了51小车;到了大二下学期,准备第十五全国大学生智能汽车竞赛,又是造车哈,当时选的题目是AI电磁智能车,这次高大上了哈,用的是NXP-RT1064的MCU,使用深度学习算法+传统PID控制让智能车以最快的速度跑完赛道,赛后的成绩是9秒多吧,唉。。。其实可以更快的,比赛就是这样,有时候需要天时地利人和!综合自己的“造车”史,最后的感悟就是:有时候结果不一定重要,注重过程,把握过程中的每一个细节,把相关的原理都搞懂,然后多练习、多做总结,这才是最大的收获!
顺便在这里提一下,对参加智能车项目的学弟学妹们的一些建议吧:

1、硬件平台一定要搭好,尽量少用杜邦线,它本身信号就不太稳定,智能车相对来说模块比较多了,如果使用杜邦线,硬件出了问题很难查出来,会把你心态搞死!可以考虑用FPC接口,电源接口、电机接口可以用XT60接口。

在这里插入图片描述
在这里插入图片描述

2、电源要设计好,像使用开关稳压电源时注意下面几点:

①、 要明确电源的输入输出电主电路,把输入输出的元器件进行分离,注意大小电容的放置(先大后小原则);
②、布局要紧凑,采用一字或者L型布局方式;
③、如果系统需要多路开发电源工作时,尽量使相邻电感之间垂直放置,这样可以降低电磁干扰;
④、其他器件采用就近原则放置;
⑤、开关电源内部的信号连接线要加粗,一般采用10mil;
⑥、反馈电路部分,要远离干扰源和大电流的平面,反馈电源要从滤波电路里面取;
⑦、PCB布局时要注意电感下尽量不要布线,电感下要挖铜皮,不要增加电感的出线宽度。

不然效果如下图:

在这里插入图片描述
在这里插入图片描述

布局布线多参考芯片数据上的Layout。
在这里插入图片描述
推荐几家电源管理芯片做的比较好的公司:TI-德州仪器、ADI-亚德诺半导体、安森美、立锜科技。根据需求选择吧,比如方案既需要开关稳压的高效,又需要线性稳压的低纹波,就可以考虑电荷泵电路——优势:消除电感器问题、在更低的输入电压下提供更高效率,以及缩减解决方案尺寸。总之电源一定要设计好!

3、相关外设要做隔离,比如电机、舵机这类的要做隔离,不然容易烧核心板,都是痛苦的教训啊!

4、如果要使用干簧管进行停车,尽量自己设计好PCB,不要嫌麻烦;

5、PCB形状可以根据车模结构去设计,外设接口尽量使用连接性比较好的;

6、自己的车可以适当加点个性的东西哈,比如设计个前灯,尾灯什么的,寓意:快到只能让你看到车尾灯残影!哈哈哈

下面找了几台硬件搭的不错的智能车图片,仅供参考!

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

接下来的学习生涯里希望自己继续“造车”之路,在这个无人驾驶爆火的时代,补补脑洞,填填坑!
立个flag:做一台无人驾驶小车!等有时间就开始入坑,从主控、电机、电机驱动、电源模块、slam、双目识别、定位、路径规划等方面慢慢入手,我想这才算得上真正的造车吧!

声明:文中有关图片来源于互联网,如有侵权,请联系作者删除,谢谢合作!

想要获取更多资源,可以关注公众号:Kevin的学习站,之前听到过一句很有意思的话:“天下代码都在抄,抄来抄去有提高”,希望此文对您有一定的帮助,整理不易,但您的点赞、关注、收藏就是对我最大的鼓励!

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

课设-基于51单片机的智能小车(循迹+避障+APP控制) 的相关文章

  • 为ubuntu配置WiFi

    1 前提条件 ubuntu不论什么版本 xff0c 如果想要正常使用wifi xff0c 必须在电脑的bios中把secure boot设定为disable 2 快捷指令 xff08 WiFi相关的常用命令行指令 xff09 2 1查看电脑
  • 嵌入式C语言自我修养:从芯片、编译器到操作系统-习题、笔记

    前沿 C语言测试 1 基本概念考查 什么是标识符 关键字和预定义标识符 三者有何区别 标识符 xff08 Identifier xff09 由程序员定义 xff0c 用来表示变量 xff0c 包括了变量名 函数名 宏名 结构体名等 标识符的
  • smile@smile-X3-S:~/app_install/mapx/build$ sudo make

    smile 64 smile X3 S app install mapx build span class token function sudo span span class token function make span span
  • 两台ubuntu之间文件互传方法

    1 查找本机ip地址 终端输入 xff08 不是自己的电脑 xff0c 是服务其的IP xff09 xff1a ifconfig span class token operator span a 查看inet 192打头的地址 2 查找本机
  • 单片机通过串口发送浮点类型数据

    单片机通过串口向串口助手或者其他器件发送数据时是不能直接发送浮点类型数据的 xff0c 通过printf 34 f 34 1 28 发送浮点数据 在串口助手看似是小数 xff0c 其实是字符串类型 xff0c 它们是各符号对应的ASSCII
  • 制作系统启动盘和制作windows+Ubuntu双系统启动盘

    制作windows 43 Ubuntu双系统启动盘 前言1 准备软件和工具 xff1a 开始1 软件和系统镜像自行在网上下载 2 下载好系统镜像之后 xff0c 开始制作ubuntu系统盘 xff1a 3 制作好ubuntu启动盘之后 xf
  • 虚拟机分配的硬盘太大怎么办?

    虚拟机分配的硬盘太大怎么办 xff1f 虚拟机分配的硬盘太大怎么办 xff1f 文章来源说明 xff1a 开始1 首先需要将虚拟机中多余的硬盘空间删除 xff0c 在此电脑中右键管理 xff0c 然后在磁盘管理中右键有多余空间的磁盘进行压缩
  • QT界面窗口的显示和隐藏,关闭

    这里写目录标题 QT窗口的显示和隐藏 xff1a 1 隐藏窗口1 1 介绍 xff1a 2 显示窗口2 1 介绍 xff1a 3 关闭窗口常用函数有 xff1a QT窗口的显示和隐藏 xff1a 1 隐藏窗口 span class toke
  • QT的中文显示乱码问题解决

    QT的中文显示乱码问题解决 QT的中文显示乱码问题解决 xff1a 1 查看源文件的编码格式 xff0c 有必要的话转换源文件的编码格式再重新编译运行尝试汉字能否正常显示 2 在代码里面解决 xff1a 3 用法 xff1a QT的中文显示
  • 0.9 - GPIO寄存器的C语言映射与STM32库函数雏形构建思路

    首先 xff0c 从参考手册可知 xff0c 程序存储器 xff08 flash xff09 数据存储器 SRAM 寄存器 外设控制 和输入输出端口被组织在同一个4GB的线性地址空间内 数据字节以小端格式存放在存储器中 一个字里的最低地址字
  • Linux文件/文件夹建立软硬链接

    建立软连接 xff1a sudo ln s home spike Downloads redis src redis server usr local bin redis server 源文件 链接到 目标文件 xff0c 这两个文件目录都
  • Linux中记录终端(Terminal)输出到文本文件四种方法

    Linux中记录终端 xff08 Terminal xff09 输出到文本文件 Linux中记录终端 xff08 Terminal xff09 输出到文本文件 一 xff0c 如何把命令运行的结果保存到文件当中 二 command gt f
  • C++ 标准库头文件汇集:

    C 43 43 标准库头文件汇集 xff1a C 43 43 标准库的接口由下列头文件的汇集定义 C 43 43 标准库头文件汇集 xff1a 概念库协程库工具库动态内存管理数值极限错误处理字符串库容器库迭代器库范围库算法库数值库本地化库输
  • C++开源库列表总结记录

    开源 C 43 43 库列表 前言包管理器库音频 音频指纹格式标签CD 性能测试 通信 并发 配置 XMLJSONYAMLTOMLHOCONCSS容器 密码学 数据库 嵌入语言绑定 嵌入式 实时 文件元数据 金融计算 游戏引擎架构 通用多媒
  • C++转义序列和操作符优先级

    C 43 43 转义序列和操作符优先级 1 转义序列 xff1a 2 C 43 43 运算符优先级注解 1 转义序列 xff1a 转义序列 描述 表示 简单转义序列 39 单引号 ASCII 编码中为字节 0x27 34 双引号 ASCII
  • PX4:Policy “CMP0097“ is not known to this version of CMake.

    make px4 fmu v3 时报的错 CMake版本的问题 由https blog csdn net zhizhengguan article details 118380965推测 xff0c 删除cmake policy也没事 ma
  • 安装Anaconda3后再安装ROS(用于PX4)

    记录一下安装anaconda后再安装ROS xff0c 方便未来找错误 出现no module wstool 仔细观察报错信息发现调用的库都在anaconda3 lib python3 7里面了 随后按照https www cnblogs
  • Offboard仿真时出现CMD: Unexpected command 176, result 0

    在用PX4 43 gazebo 43 ROS仿真offboard例程时 xff0c 如果出现以下问题 xff1a 运行以下命令 xff1a roslaunch mavros px4 launch fcu url span class tok
  • Offboard例程的python版本

    因为python的库很丰富 xff0c 有现成的解方程库 xff0c 比如sympy 自己写了一份python版本的自动起飞2m的程序 假设自定义的包名为offb xff0c 在offb下新建scripts文件夹 xff0c 将py文件放在
  • 子类与父类构造函数调用顺序

    子类与父类构造函数调用顺序 构造函数 当创建子类对象时 构造函数的调用顺序 xff1a 静态数据成员的构造函数 gt 父类的构造函数 gt 非静态的数据成员的构造函数 gt 自己的构造函数 注意 无论创建几个对象 该类的静态成员只构建一次

随机推荐