前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HC05蓝牙模块通信(附源码)

HC05蓝牙模块通信(附源码)

作者头像
飞哥
发布2020-07-10 10:27:20
3.6K0
发布2020-07-10 10:27:20
举报

今天分享一个实践项目——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了。

公众号后台回复HC05获取参考源码!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子技术研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档