哈喽哈喽大家好,我是阿飞的小蝴蝶,大家可以叫我阿飞或者小飞,我又回来啦~
上节内容讲完了串口通信的基础知识,结尾的时候跟大家说我们找时间来更新一篇备赛的“番外篇”来带大家使用一下串口通信,今天,它来了!
接下来我会再用两节的内容,来带大家完成一个属于自己的DIY小作品——蓝牙遥控小车,记得第一次见到学长做的小车是感觉可厉害了,其实制作起来也没有那么复杂的。有没有一点小期待呢?我们先来看一下成品:
我们要做的跟这个差不多,不过我们只需要用两个直流电机再加一个万向轮就好了。
这节内容我们主要来讲一下蓝牙模块的使用、程序设计以及制作简单手机APP
首先我们先来看一下蓝牙模块:
还记得我在串口第一节最后边讲到的原生串口转串口的通信吧?对,我们使用的蓝牙模块不需要进行任何电平转换就可以直接跟单片机的串口进行通信,也就是说,蓝牙模块可以直接接在单片的串口上进行通信,第二张图中有蓝牙模块的引脚,我们只需要用中间的“VCC”、“GND”、“TXD”、“RXD”就可以了,VCC接5V电压、GND接地、TXD接在单片机的RXD(P3^0)引脚、RXD接在单片机的TXD(P3^1)引脚。
使用蓝牙时要用对应的AT指令设置蓝牙模块的一些参数(不同型号的蓝牙模块AT指令可能会不同),这里以图片上的(HC-05)为例介绍一下(其它型号的可以在百度上搜索对应的AT指令集):
HC-05 AT指令集摸我下载哦(AT指令说明.pdf)~
首先将蓝牙模块与CH340连接好(连接方法与连接单片机方法一致),我先讲一种进入AT指令的方法:我们可以看到模块上有一个小按钮,连接好以后按住按钮不放,同时将CH340接在电脑USB接口上,这时模块上的灯会亮起来,等到灯灭时松开按钮,灯会处于慢闪状态,然后打开串口调试助手,选择好端口,波特率设置为38400,其它参数保持默认就好,然后打开串口
好的,接下来我会演示一些常用的AT指令:
首先是测试指令:大写的AT+换行(敲回车键或者+“\n”)
我们可以看到每条指令后边都有用红色字体写着的“34脚至高一次”或者“34脚一直至高”,这里的34脚指的就是模块上的小按键,“34脚至高一次”时不需要任何操作直接发送即可,“34脚一直至高”时要按住小按键发送
OK,这就代表着可以正常通信,看下一条指令:
这条指令用于修改模块的名称(就是用手机连接时显示的名称),这里我改成“Fei”,发送此条指令时要按住按键
OK,看下一个:
此条指令用于修改蓝牙配对码(手机连接蓝牙时需要输入正确的配对码才能连接成功),这里我改成我的生日:0803
OK,最后一个:
此条指令用于修改模块的串口参数(这里要改成与单片机串口参数一致的哦~),由于模块默认参数就是 波特率:9600、停止位:1位、校验位:None,这里就不再修改了,直接查询一下,需要修改的同学自己操作一下吧
好的,AT指令就先介绍到这里啦,其它的指令如果需要用到大家就自行查询一下吧
接下来我们看一下程序的设计:
单片机通过电机驱动来控制电机,对应的引脚配置成高或者低,电机驱动输出的电压也为对应的电源电压或者0V,直流电机有两个接线脚(这里用1脚和2脚表示),当1脚接高电平,2脚接低电平时,电机正转;2脚接高电平,1脚接低电平时,电机反转,当两脚都接低/高电平时电机停止,于是:两个电机都正转时,小车向前走;都反转时小车向后走,右轮正转;左轮不转或者倒转时,小车向左转…这样我们就可以写出电机的方向控制:
sbit motor_left_1 = P1^4; //电机 左 + sbit motor_left_2 = P1^5; //电机 左 - sbit motor_right_2 = P1^6; //电机 右 - sbit motor_right_1 = P1^7; //电机 右 + void Forward() //直行 { motor_left_1 = 1; //电机 左 + motor_left_2 = 0; //电机 左 - motor_right_2 = 0; //电机 右 - motor_right_1 = 1; //电机 右 + } void Left() //左转 { motor_left_1 = 0; //电机 左 + motor_left_2 = 1; //电机 左 - motor_right_2 = 0; //电机 右 - motor_right_1 = 1; //电机 右 + } void Right() //右转 { motor_left_1 = 1; //电机 左 + motor_left_2 = 0; //电机 左 - motor_right_2 = 1; //电机 右 - motor_right_1 = 0; //电机 右 + } void Backward() //后退 { motor_left_1 = 0; //电机 左 + motor_left_2 = 1; //电机 左 - motor_right_2 = 1; //电机 右 - motor_right_1 = 0; //电机 右 + } void Left_front() //左前 { motor_left_1 = 0; //电机 左 + motor_left_2 = 0; //电机 左 - motor_right_2 = 0; //电机 右 - motor_right_1 = 1; //电机 右 + } void Right_front() //右前 { motor_left_1 = 1; //电机 左 + motor_left_2 = 0; //电机 左 - motor_right_2 = 0; //电机 右 - motor_right_1 = 0; //电机 右 + } void Right_rear() //右后 { motor_left_1 = 0; //电机 左 + motor_left_2 = 1; //电机 左 - motor_right_2 = 0; //电机 右 - motor_right_1 = 0; //电机 右 + } void Left_rear() //左后 { motor_left_1 = 0; //电机 左 + motor_left_2 = 0; //电机 左 - motor_right_2 = 1; //电机 右 - motor_right_1 = 0; //电机 右 + } void Stop() { motor_left_1 = 0; //电机 左 + motor_left_2 = 0; //电机 左 - motor_right_2 = 0; //电机 右 - motor_right_1 = 0; //电机 右 + }
然后是串口:
我们先配置好串口的初始化:
void usart_init()
{
EA = 1; TMOD = 0x20;
TH1 = 0xfd; TL1 = 0xfd; //波特率9600
TR1 = 1; ES = 1; //串口中断打开
SM0 = 0; SM1 = 1; //串口工作方式1 10位异步
REN = 1; //串口允许接收
}
然后开始接收数据,接收到对应的数据时小车向对应的方向行走,这里我设定的是:A-前进、B-右前、C-右转、D-右后、E-后退、F-左后、G-左转、H-左前、Z-停止(字母区分大小写,按照顺序顺时针转了一圈,大家可以根据自己的习惯来修改,不一定非要用字母,数字也是可以的),然看一下完整的程序:
u8 dat; void usart_init() { EA = 1; TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; //波特率9600 TR1 = 1; ES = 1; //串口中断打开 SM0 = 0; SM1 = 1; //串口工作方式1 10位异步 REN = 1; //串口允许接收 } void main() { usart_init(); //串口初始化 while(1) { switch(dat) { case 'A':Forward(); break; //前进 case 'B':Right_front(); break; //右前 case 'C':Right(); break; //右转 case 'D':Right_rear(); break; //右后 case 'E':Backward(); break; //后退 case 'F':Left_rear(); break; //左后 case 'G':Left(); break; //左转 case 'H':Left_front();break; //左前 case 'Z':Stop(); break; //停止 } } } void UART() interrupt 4 //串口接收中断 { RI=0; //清除接收标志 dat=SBUF; //读取串口接收数据 }
完整程序摸我下载,如果有错误请滴滴我改正哦~(51遥控车.zip)
最后的内容就是制作简单的手机APP啦:
在此链接在线制作:http://app.gzjkw.net/login/
登录进去以后我们新建一个项目:
建好以后点进去进行操作。
这里我们需要设置用于选择蓝牙的选择列表、用于断开蓝牙的按钮、八个方向的按钮,我们先向界面中放几个布局:
我们设置成一下效果:
然后再往布局中加入按钮、布局等
这里按钮的序号是按照放置的顺序排列的,每个需要对应的作用要记清楚(例如:按钮1用于断开蓝牙)
OK,这下界面设置好了就该逻辑了:
好的,按照这样的方式我们把所有的都写好:(位置可以随意摆放)
这样逻辑也就好啦,这样用一个个的模块来搭逻辑的时候让我想起了之前玩过的一个叫做“异常”的游戏,通过搭程序来打败敌人
好的,现在只剩最后一步了
点击这里会生成一个二维码,用手机下载好就行啦
因为分辨率的原因,跟我们设计的有所差别,不过也能勉强使用啦
好的,今天的内容就先到这里啦,下节再给大家更新后续的内容,各位晚安啦~