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

课设-基于51单片机的智能小车(循迹+避障+APP控制)[通俗易懂]基于51单片机的智能小车,可以实现循迹、避障、APP控制等功能;顺便提了一下自己大学的“造车”史!

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用


在这里插入图片描述

注:本设计资源可在微信公众号:“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的学习站,之前听到过一句很有意思的话:“天下代码都在抄,抄来抄去有提高”,希望此文对您有一定的帮助,整理不易,但您的点赞、关注、收藏就是对我最大的鼓励!

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/183318.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(2)
blank

相关推荐

  • platform device和platform driver

    platform device和platform driver从Linux2.6起引入了一套新的驱动管理和注册机制:Platform_device和Platform_driver。Linux中大部分的设备驱动,都可以使用这套机制,设备用Platform_device表示,驱动用Platform_driver进行注册。Li

  • C++的动态联编与静态联编【转载】

    C++的动态联编与静态联编【转载】

  • svn 配置文件_svn环境配置

    svn 配置文件_svn环境配置SVN配置文件说明svnserve是SVN自带的一个轻型服务器,SVN用户端通过使用以svn://或svn+ssh://为前缀的URL来访问svnserve服务器,实现远程访问SVN版本库。svnserve可以通过配置文件来设置用户和口令,以及按路径控制版本库访问权限。本文详细分析了svnserve配置文件格式,并说明如何使用配置文件控制版本库访问权限。一、svnserve配置文件概述svnserve配置文件通常由以下3个文本文件组成:svn服务配置文件,该文件版…

  • Adaboost算法原理分析和实例+代码(简明易懂)

    Adaboost算法原理分析和实例+代码(简明易懂)Adaboost算法原理分析和实例+代码(简明易懂)【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/70995333本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理。也许是自己能力有限吧,很多资料也是看得懵懵懂懂。网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘…

  • Qt 垂直布局 (QVBoxLayout)

    Qt 垂直布局 (QVBoxLayout)Qt垂直布局(QVBoxLayout)上一节说了水平布局:https://blog.csdn.net/weixin_42837024/article/details/82114258QVBoxLayout:在垂直的方向上排列控件上下排列QVBoxLayout*pLayout=newQVBoxLayout();//水平布局QPushButton*p…

  • JavaScript 时间戳格式化日期

    JavaScript 时间戳格式化日期JavaScript时间戳格式化日期项目中从后台获取接口数据时常需要按自己的需求将时间戳转化为对应的日期格式。//时间戳格式化为日期functionformatDate(timestamp,fmt){//这里传入的timestamp应该是Number数值,如果是字符串,需要先转换为Number//vartimestamp=parseInt(timestamp)vardate=newDate(timestamp)if(/(y+)/.tes

    2022年10月27日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号