【51】基于51单片机的蓝牙控制小车的简单实现(有源代码,无图)

原文地址:?mod=viewthread&tid=544143
此帖子现在有一个后续版本,实现了手机端的蓝牙程序控制小车运动以及接收小车状态并展示,链接地址: ... d&tid=544299&page=1
最初的想法是做一个红外遥控的装置,链接地址: ... d&tid=540165&extra=
我只需要前进和停止,二路遥控,想使用模拟电路搭建,但最后也没能完成,这个想法依然在,现在只能留带以后是否有想法再做了。
第二个想法是想做一个小车,小车的功能如下: 前进,后退,转弯,遥控控制,自主智能运转。 上某宝买了一个小车的底座(4驱动的,带电机), 买了两个l298n驱动模块用来驱动小车,买了蓝牙模块(hc05)用来充当遥控。
实践篇:
1,首先根据51单片机的最小系统的电路图,焊接了一个最小系统板,使用的stc89c52的单片机(晶振6mhz,带复位电路,复位指示灯显示),为了便于测试,又焊接了一个发光二极管连接一个i/o口,用于测试最小系统。
2,然后开始测试最小系统,不过我很多年没有用过keil和下载器了,就上网寻找了一下关于这方面的帖子,过程总结如下:
最小系统测试篇:
要测试最小系统,首先需要编译代码的工具(我用的keil),下载代码到单片机的工具(stc-isp),usb转ttl硬件设备(某宝上2块多钱买的),串口调试助手(使用的是单片机多功能调试助手porthelper.exe),于是从网上下载了keil4破解版本,stc-isp下载软件,单片机多功能调试助手三个软件。
第一步:测试usb转ttl是否可用(就4个引脚,5v,gnd, tx, rx)
打开串口调试助手,设置波特率,打开,发现打开失败,比较郁闷,为何呢? 极有可能是串口号不对,于是打开我的电脑-》管理-》设备管理器,找到串口的条目,查看它的串口号,我的竟然是串口号12.于是设置串口号,重新打开,ok。 如何测试usb转ttl呢? 我的想法是如果发送数据的话,对应的tx引脚应该有信号,如果将tx和rx连接到一起,那么发送出去的应该自己可以接收到。我没有示波器,就简单的使用万用表量它的tx引脚的电压,点击发送按钮,发现tx引脚的电压有波动即可。
第二步: 将usb转ttl的四个引脚接入到单片机的对应引脚即可(其实就是vcc接vcc,gnd接gnd,tx接rx,rx接tx)。没有采用外部供电,直接利用usb转ttl进行的5v供电
第三步:在keil中写代码,对单片机的某一个i/o进行翻转电平的操作,代码如下
sbit led=p0^0;
while(1){
led = !led
delay10ms(100);
}
第四步:编译程序,生成hex文件
第五步:打开stc-isp下载工具,选择单片机型号,hex程序位置,点击下载即可,如果识别了单片机的话,会出现给mcu重新上电的字样,这个时候只需要关闭再打开mcu的电源开关即可,就会出现烧写程序的过程。
最小系统测试篇遇到的问题,回忆篇:
51单片机的电源供电问题,忘了接单片机的vcc引脚了(如果是这方面的问题,就检查几个关键地方,vcc和地接好了吗,tx和rx接好了吗,晶振接好了吗,复位电路先不用管,我是使用的万用表一个个的量的)
晶振的电路没焊好(万用表搞定)
usb转ttl找不到串口(软件问题的话,容易解决,也有可能是usb转ttl硬件有问题,驱动没有安装成功,导致识别不了硬件)
第六步: 用万用表量p0^0口,查看电压是否1秒一次变化即可。
3,蓝牙模块工作篇
从某宝上花了17大洋买了一个hc05蓝牙主从模块,有6个引脚(vcc,gnd,tx,rx,at,status),前4个引脚与usb转ttl的接法相同(注意rx,tx交叉接线接入到单片机),at和status引脚是我自己命的名字。 at引脚高电平有效,用于蓝牙模块进入at状态(所谓at状态,即是其他程序可以通过它的引脚向蓝牙模块发送at控制命令,例如设置波特率,查看版本号,设置主从模式),at引脚悬空默认为低电平。status引脚用于显示配对的状态(配对成功输出高电平,未配对输出低电平)
蓝牙模块测试篇:
第一步:蓝牙模块既然包含串口,那么它应该可以跟usb转ttl直接连接,使用电脑向蓝牙模块发送命令。于是连接蓝牙模块与usb转ttl的对应引脚。
第二步:将at引脚悬空,使用手机搜索周围的蓝牙设备,发现有hc05的蓝牙(因为这个蓝牙模块默认是从模块,可以被收到)
第三步:将at引脚拉高电平,使其进入at状态(按照文档描述,如果上电之后再置位at,指示灯无变化,依旧是,如果上电之前拉高at,指示灯转为1秒一次),然后通过电脑串口发送at+version?(注意需要换行)查看版本号,使用at+uart?查看波特率(默认9600,不带校验)
此文档有用: atk-hc05-v11用户手册_v1.0.pdf
第四步:实验了一下,我的模块有问题,就是上电之前拉高at,模块不接受at命令,只有上电后拉高at才有用,不过不影响使用。
第五步:将蓝牙模块和usb转ttl连接后,at保持悬空,即蓝牙模块为从模块,手机安装蓝牙串口助手,打开手机蓝牙,然后搜索hc05,配对,然后打开手机端的蓝牙串口助手软件,向hc05发送消息,如果蓝牙模块工作正常,那么电脑端的串口调试助手应该收到手机发送的消息。同样的也可以通过电脑端发送消息,到手机端。
消息传递流程如下: 手机端蓝牙串口助手 -> 手机蓝牙 ->空气-> hc05蓝牙模块 -> usb转ttl模块 -> 电脑的串口调试助手,反过来也是可行的(注意线路连接方式都是rx与tx交叉连接)
蓝牙模块与单片机集成调试篇:
上面的测试已经证明了蓝牙模块是可以发送接收手机端消息的,现在开始将蓝牙模块与单片机的tx,rx接口连接起来,通过程序控制蓝牙模块与手机蓝牙进行沟通,从而达到利用手机蓝牙进行遥控的目的。
main函数如下,主要设置串口波特率,以及开启串口中断
//pcon:smod位默认为0,串行口波特率加倍位
pcon = 0x80; //smod=1;
tmod=0x20; //8位自动加载计数器
//th1=0xfd;tl1=0xfd; for 11.0592mhz and smod=0,
th1 = 0xf3;//2400bps
tl1 = 0xf3;
tr1=1; // t1
//scon: 0x50=sm0=0, sm1=1,ren=1
ren=1;
sm0=0;
sm1=1; //串口
ea=1; //中断
es=1;
串口中断函数
void serial() interrupt 4
{
char sbuf;
sbuf=sbuf;
switch (sbuf)
{
case 'f': direc=4; break;
case 'b': direc=5; break;
case 'l': direc=6; break;
case 'r': direc=7; break;
case 's': direc=-1; break;
default : led = !led; //led为一个i/o引脚,控制发光二极管
}
ri=0;
}
遇到的问题:
利用手机给蓝牙hc05发送消息,如果不是switch中的几个case的话,那么led灯会明暗变化,但是刚开始的测试却始终不如意。而后仔细查看了代码,并没有发现什么错误,后来怀疑是波特率的问题,因为我的晶振是6mhz的,蓝牙模块的波特率是9600. 我手动计算了一下:
采用波特率倍频,那么计算如下 6*1000000*2 / 12 / 32 / 9600 = 3.255, 取整为3. 然后使用3反代入到此式子中
6*1000000*2 / 12 / 32 /3 = 10416.7 与9600相差1000多,这个似乎差距太大了。我又尝试了其他几个参数,像4800,19200,38400都相差挺大的,估计就是这个原因。于是继续尝试,发现2400的话,相差不多。6*1000000*2/12/32/2400 = 13.02 ,然后使用13代入进去结果为2403.8,与2400的波特率相差很小,估计是可以用的。但是看蓝牙模块的文档,发现它说不支持2400的,我不甘心,就使用usb转ttl模块设置了一下2400,没想到at命令还真的返回ok了,单片机程序也可以正常工作了。
4,小车驱动篇:
将两个l298n模块与单片机的p2口直接相连(小车4轮驱动,每个电机需要两个输入引脚,以及一个使能引脚,那就是12个引脚,我刚开始并不想支持调速的功能,因此使能引脚直接高电平了,就连接了8个i/o口)。注意l298n的gnd引脚一定要和单片机的gnd共地。
关于l298n: 它的en引脚用于使能,en为高电平,才使能。另外两个输入引脚in1,in2根据电平的组合变化会有4种情况(00,10,01,11),电机相应的在00和11停止(这个停止是带电的,类似于锁死的感觉),在10正转,01反转。可以直接使用单片机的vcc和gnd连接l298n的in1和in2,同时将en端接vcc,看电机转不转就可以测试l298n模块了。
编写程序,控制轮子的正转,翻转,停止等。基本上就是以下的这种代码
void wheelforward(uchar which)
{
switch(which)
{
case 1:
{
wheel_1_1 = 0;
wheel_1_2 = 1;
break;
}
case 2:
{
wheel_2_1 = 0;
wheel_2_2 = 1;
break;
}
case 3:
{
wheel_3_1 = 0;
wheel_3_2 = 1;
break;
}
case 4:
{
wheel_4_1 = 0;
wheel_4_2 = 1;
break;
}
}
}
遇到的问题:
问题1: 刚开始l298n直接连接p0口,死活不转,而直接引出高低电平到某一个电机的in1,in2口,电机正常运转。于是猜测是i/o有问题,使用万用表测量,发现p0的i/o在输出高电平的时候,根本不是高电平,而后发了帖子,询问了一下才知道p0口在高电平是呈现高阻态的,需要外部焊接电路加上拉电阻才可工作。我不想焊接过多的电路,就将其i/o换到p2口,可以正常工作
帖子链接地址: ... 8&page=1#pid4108114
问题2: 我使用的是路由器的9v直流电源,使用其带动两个l298n,同时将l298n的输出的一个5v高电平接到单片机上给单片机供电,启动4轮驱动,电机只会翁的一声,然后啥也没有,二轮驱动也不转。 上网查看了不少资料,基本上都是电源功率过低,需要将单片机与l298n分别供电才可以。 于是使用笔记本的usb口给单片机供电,使用9v直流电源给电机供电,比刚才好了一些,两轮可以转,但是4个轮子还是转不了。没办法,想到自己有一个小的卡片相机,有镍氢电池8节,然后上网买了一个电池盒,装上去,电机转的吼吼叫,同时l298n给单片机供电也没问题。
问题3:
关于l298n同时给单片机供电的问题,大家可以在启动轮子转动的时候量一量单片机的电源电压,会发现在电机启动的一刹那,单片机的电压有一个瞬时的拉低,这样单片机就会复位了。
5,蓝牙遥控小车汇总篇
第一步:部署小车,l298n,镍氢电池盒,蓝牙模块组装到一起
第二步:编写代码,本来可以使用en口进行调速控制的,但是考虑到还需要使用额外的i/o口,就先不打算做了。
代码完成的功能:
小车前进,后退,停止,左转,右转
小车单个轮子的转动(用于测试)
小车当前状态的获取(用于后期给小车增加其他模块的时候,例如温度模块,就可以读取温度了)
小车命令帮助
代码思路:
首先完成单个轮子的控制
再完成小车的控制
再加入串口接收中断,收到不同命令,设置方向变量
main程序读取方向变量控制不同的方向
6,思路篇
一些比较有特点的思路:
思路1:一个棘手的问题想实现这样的功能: 用户按键,小车才走,用户松开按键,小车停止。
我的想法如下: 小车使用一个定时器t0,控制定时器的延时时间为100ms,用户每发送一个前进信号,小车会前进100ms,但是这100ms内小车还需要能够响应外部的命令。例如如果用户在t=0ms发送前进命令,然后在t=50ms发送左转命令,小车能够立刻左转,而不是继续前进100ms,然后才执行左转的命令。基本的代码思路是用户的每一个命令,都会重置timer0,timer0的超时中断函数会将小车停止。这样用户只要以连续的小于100ms间隔发送前进命令,小车就会一直前进,也就是说timer0的中断没有执行,如果用户间隔100ms还没有发送命令,那么小车停止。 当前我使用的蓝牙串口助手它的按键不支持连续发送,只能按下松开手,才会发送消息,这样我现在就把时间间隔设置为1000ms,用户只要以小于1000ms的间隔连续按键,小车就会一直前进,如果不按键,小车会继续前进1000ms才会停止。 后期打算找到蓝牙串口调试助手的源代码,修改它的源代码,设置成如果用户按下不丢,小车前进命令能够一直发送。
思路2:既然有了手机蓝牙,那么小车再想展示一些状态信息,就没必要使用像1602,12864之类的东东了,直接定时发给手机蓝牙模块就ok了。我现在并没有实现定时发送,不过支持了命令获取的功能。 当用户发送命令h到单片机,单片机会返回一个帮助界面,告知如何控制小车,例如f控制小车前进,b控制小车后退,当用户发送命令i到单片机,单片机会返回小车的一些状态信息,我当前只返回了一些简单的变量状态(后面想加入距离,温度,光敏都是可行的)。
思路3:有了蓝牙,这个小车就可以被我们随心所欲的控制了。你既可以推命令到单片机,控制它,你又可以把单片机内部的当前状态拉出来。单片机本身又可以定期将它的状态向你的手机进行推送。这个我感觉还是很好玩的,有了这个代码的基本框架,后面有可能的话像实现一个小车的扩展功能,加上红外对管让它不撞墙,加上超声波让它测距,加上麦克风让它向着声音跑,加上人体感应让它做一个跟屁虫,甚至于加上一个智能化点的程序,让它能够在一个屋子里随便的转悠,然后记录屋里的情况。还想做的是加入一个wifi模块,能将它的状态信息上传到路由器里面(手里有一个坏的路由器华为hg255d,正在修理中,还没有摸清楚如何修),这样远在千里之外都可以访问小车上面传感器的情况了。还想加的是一个摄像头模块,不过单片机的处理能力有限,摄像头的解码对它是个大问题,估计很难办到(手头有优龙fs2401开发板,刚修好它的电源模块,正在研究中,不过前天它突然bios引导不起来了,也不知道是什么问题,关于这种arm的东西,还没有接触过,完全不懂刷bios,uboot等等的东西,看情况是要重新刷bios了)。

制动电阻怎么测量好坏
Sense搭载的Silk平台 获得软硬件开发资源
小米Pocophone F1 Lite曝光采用了骁龙660处理器具有很高的性价比
广西移动将在2020年内实现全区所有城市的5G精品网络覆盖
哪种电阻更适合被用作为取样电阻?
【51】基于51单片机的蓝牙控制小车的简单实现(有源代码,无图)
拉绳位移传感器安装_拉绳位移传感器使用方法
过电压保护器和避雷器的区别
获评中国教育照明25强,利尔达引领教育照明行业“智变”
深鉴科技亮相华为全联接大会 同华为云达成深度合作
工业物联网网关、数据采集网关的应用
新华社:谁能走出苹果“阴影”
日本Futaba与世强带来消费级PM-OLED
日本将华为和中兴通讯从采购清单中去除,5G技术也避免采用
利用智能手机控制打开/关闭家中的电源
采用 6.25mm x 9mm BGA 封装的 42VIN、3.5A µModule 稳压器 适用于工业系统、工厂自动化和航空电子产品
磷酸铁锂电池化学反应方程式_磷酸铁锂电池工作温度
联想小新Pro14全新配置即将上线
电热水壶保温原理及电路分析
LED灯与白炽灯展开拔河赛 LED灯要胜出还任重道远?