实现的目标是利用蓝牙模块,实现手机与单片机通信,在手机上点击按钮,点亮单片机上面的小灯。
使用到的器件是HC05蓝牙模块,单片机(51或者stm32都可以),杜邦线若干。 手机端的调试工具为“蓝牙串口助手app”
先稍微介绍一下HC05蓝牙模块,管脚如下:
HC05 蓝牙串口模块所有功能都是通过 AT 指令集控制,比较简单,该部分使用的详细信息,请参考 HC05 蓝牙指令集。 今天主要是介绍建立通信的过程,对于模块具体的一些其他方面的应用暂时不多说。
HC05 蓝牙串口模块有两种状态,一种是AT指令状态,一种是连接状态。 在AT指令状态下,可以向模块发送一些指令,退出AT状态后,可以与蓝牙设备比如手机建立连接。
进入AT 指令状态有两种方法:①上电同时/上电之前将 SET 脚设置为 VCC,上电后,模块即进入 AT 指令 状态。 ②模块上电后,通过将SET 脚接 VCC,使模块进入AT 状态。 方法1进入AT 状态后,模块的波特率为:38400(8位数据位, 1位停止位)。 方法2进入 AT 状态后,模块波特率和通信波特率一致。 在编程中我们通过改变SET管脚电平来切换状态。
从模块管脚可以看出,它是利用串口通信的,所以,带串口的单片机都可以作为主控芯片。 我们分别使用stm32和51单片机进行了验证,完全是没有问题的。
一、连线
根据管脚说明来与单片机连线,VCC接3.3V或5V都可以。 模块发送管脚连单片机接收管脚,接收管脚连发送管脚,这个千万要注意,SET脚随便连一个IO口即可,STATE管脚可连可不连,不影响。
二、整体编程思路
蓝牙模块接收手机发送的信号,将信号通过串口发送给单片机,单片机接收到信号后,执行相应的操作。 如果要向模块发送指令,通常是采用按键的方式,可以使用扫描按键,也可以使用外部中断,按下按键就执行发送指令的程序,比如通过按键来切换模块主从模式,修改密码,修改波特率,修改名字等等。
涉及到的单片机部分主要是串口和定时器,串口用来向模块发送指令或者接收来自外部的信号,定时器主要用来产生定时中断,用来界定两帧数据,比如约定接收的相邻两个字节时间间隔超过5ms,则认定为是两帧数据,这个间隔是自定义的。
三、具体编程思路
1、串口部分
串口部分是整个最重要的一部分,大致要完成一下事情:
初始化串口,设置好串口的通信波特率,开启串口中断,编写串口中断函数。在串口中断函数里面把接收的数据存入一个数组当中。编写串口发送函数,用来向模块发送指令。stm32有现成函数可以调用,51单片机要自己去编写单字节的发送函数和字符串发送函数。
2、定时器部分
初始化定时器,设置好定时时间,使能中断,在中断函数里面关闭定时器(后面再解释为什么)。
上面是我大致画的一个思路图。其实在整个过程当中,我们定义了一个全局变量sta,初始值为0,它有两个作用,最高位用来标记一帧数据是否接收完成,为1表示一帧数据接收完成,为0相反。剩下的位用来记录接收字节的个数。
我们来大致理一下思路:sta初始值为0,假设现在收到一串数据若干个字节,那么就会触发串口中断。第一个字节触发中断时,显然sta为0,此时程序将定时器计数值清零,并且开启定时器,然后sta+1,把数据存放在数组里面,表示接收到了一个数据,那么紧接着可能第二个字节也收到了,再次触发中断,这个时候因为sta为1,所以不必开启定时器,只要把计数值清零即可,此时定时器仍在计时,只是因为你把计数值清零了,所以不会发生定时中断,然后重复这样的动作直到接收完最后一个字节。接收完最后一个字节后就不再触发串口中断,也就是不再将定时器清零,也就意味着会发生定时器中断,而在定时器中断函数里面,我们将sta最高位置1,表示一帧数据接收完成,同时关闭定时器。
这样我们就可以把刚刚接收后存放在数组里的数据拿来用了,比如对接收的数据进行判断,然后执行不同的操作。使用完之后一定要及时把sta清零,这样进入串口中断之后才会保存数据。
所以sta的最高位主要就是用来标记一帧数据是否接收完成。 当接收的两个字节数据时间间隔超过了定时器设置的时间时,定时器中断函数就会把它最高位置1,置1后串口中断函数里面将不再保存后面接收的数据(认为这不是同一帧数据),使用完后把sta最高位及时清零,方便后面再次进入串口中断并保存数据。
这个是接收部分。 对于发送部分来说就更简单了,直接通过串口把数据发送至蓝牙模块即可。
另外需要注意的就是,使用51单片机要注意串口会占用一个定时器来产生波特率,所以要使用另一个定时器避免干扰。 经过实验验证,stm32接收一串字符时能够很好的还原,而51单片机则容易丢失数据,可能是因为51单片机代码执行速度太慢,接收一个字节之后还没处理完就又来了一个数据,从而导致数据丢失,所以最好只发送一个字节。
总的来说,51的代码会更简单一些,但是51非常不方便调试,每次修改程序后都要重新烧录,51单片机烧录必须冷启动,烧录时还得把杜邦线拔了(至少要拔掉VCC才能烧录进去),所以反复的修改程序和烧录是一件非常麻烦的事情。 当然,在考虑成本的清空下,同样都能完成功能,肯定是选择51了。
-
单片机
+关注
关注
6031文章
44508浏览量
632509 -
通信
+关注
关注
18文章
5966浏览量
135825 -
STM32
+关注
关注
2265文章
10862浏览量
354597 -
编程
+关注
关注
88文章
3584浏览量
93560 -
蓝牙模块
+关注
关注
30文章
563浏览量
55677
发布评论请先 登录
相关推荐
评论