HC05蓝牙模块编程实例

描述

今天分享一个实践项目——HC05蓝牙模块的编程。

实现的目标是利用蓝牙模块,实现手机与单片机通信,在手机上点击按钮,点亮单片机上面的小灯。

使用到的器件是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了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分