51单片机与蓝牙模块连接

2019-04-15 19:00发布

不久前开始学习使用蓝牙模块,在模块与51单片机连接的过程中出现了非常多的问题,我想应该也是很多新手和我一样会遇到这样的问题,因此特地写这篇文章,想分享下在学习过程中遇到的问题以及解决方法。
此次学习用到模块是HC-06蓝牙模块,如下图:该模块某宝有售,价格约为20RMB。某宝上的HC-06有两种,分别是带引脚不带引脚的,建议新手购买带引脚的。我从试验开始到成功,一共使用了四块蓝牙模块。第一次买的是带引脚的,但是模块本身是坏的;第二次买的是不带引脚的,但是由于自身的焊功有限,导致模块损坏,无法使用;第三次是朋友送的蓝牙4.0,由于某些原因无法使用,在此也特别感谢朋友送我蓝牙;第四次购买,就是上图所示的蓝牙,才最终完成了试验。总结:在某宝购买时,最好货比三家,虽然模块不值钱,但是在购买过程遇到问题会耽误时间,影响开发,非常麻烦。单片机用了两个,分别是新手常用的开发板还有一个单片机最小模块,两者有什么区别我稍后会说明。开发板:
单片机最小模块:
我特别标注了两者的晶振,分别为12MHZ11.0594MHZ,就是晶振的不同导致我在学习中问题的发生。以下是学习试验过程。
蓝牙模块的调试:接线,蓝牙模块的RX接转换模块的TX蓝牙模块的TX接转换模块的RX,如下图所示:
接入电脑,在PC端下载好串口调试助手,软件自搜,此处不再赘述。附可能会用到的驱动:链接:https://pan.baidu.com/s/1bpYLfCr 密码:yabv进入到调试助手,其实基本不怎么用调参数了,蓝牙模块基本都默认设置好波特率为9600,因此直接启动软件调试即可。具体调参数的方法可以自行百度其他文章,都有很详细的介绍。启动串口,成功后左下角显示成功:
发送AT指令,返回OK:
表明串口正常,此时用手机连接蓝牙模块。手机端也是用到调试助手,请自行下载。搜索蓝牙模块:备注:我的蓝牙模块此前已经被我改名为Ezio,未改名前默认为HC06。
连接成功:
尝试发送消息hello:
此时在PC端的串口助手上,可以收到来自手机端发送的消息:
在此说明一点,在蓝牙模块上电以后,模块上的LED灯为闪烁状态,此时处于从机模式,与手机成功连接后,LED灯会变为常亮。自此,蓝牙模块调试成功,可以与单片机连接进行试验
蓝牙模块与51单片机接线:和连接转换模块一样,蓝牙模块的RX连接单片机的TX,蓝牙模块的TX连接单片机的RX,此处说明单片机的RX和TX引脚分别为P3.0和P3.1,如图(图片来自网络):
正确接线后,向单片机中写入程序,程序如下:#include sbit P1_0 = P1^0; //测试口,可用可不用 sbit P1_3 = P1^3; //输出口 unsigned char tempbuf; //存储接收到的信息 /*初始化串口*/ void BlueteethInit() { SCON = 0x50; //串口模式1,允许接收 TMOD = 0x20; //T1工作模式为2,自动重装 PCON = 0x00; //波特率不倍增 REN = 1; TH1 = 0xfd; //设置波特率为9600 TL1 = 0xfd; RI = 0; EA = 1; ES = 1; TR1 = 1; } void main() { BlueteethInit(); P1_0 = 0; P1_3 = 0; TI = 0; while(1) { if(tempbuf == 0x31) //可以使用 P1_3 = 1; if(tempbuf == 0) //不可以使用 P1_3 = 0; if(tempbuf == 'A') //可以使用 P1_3 = 1; if(tempbuf == 'B') //可以使用 P1_3 = 0; } } void Serial(void) interrupt 4 { tempbuf = SBUF; RI = 0; //读标志清零 SBUF = tempbuf; //将内容返回到手机端,可在手机查看发送的内容 while(!TI); TI = 0; //写标志清零 }该程序为最简单的测试程序,利用蓝牙接收手机发来的信息,控制P1.3口输出高或者低电平,以测试是否正确接收到信息。
第一步,用蓝牙模块与开发板接线,并成功用手机与蓝牙模块连接,尝试发送信息,过程如图所示:
无论是发送数字或者是其他字符,都可以看见返回的是乱码,因此可以知道,单片机接收的也是乱码,故程序中的判断:while(1) { if(tempbuf == 0x31) //可以使用 P1_3 = 1; if(tempbuf == 0) //不可以使用 P1_3 = 0; if(tempbuf == 'A') //可以使用 P1_3 = 1; if(tempbuf == 'B') //可以使用 P1_3 = 0; }无法正确执行,P1.3口自然也无法根据需要来输出高或者低电平。第二步,用蓝牙模块与单片机最小模块接线,成功用手机连接收尝试发送信息,如下图所示:
可见,此时返回的内容与发出的内容相同,经测试此时程序也可以正确执行,使用万用表可以检查出P1.3口输出电平的变化,表明此时蓝牙模块可以正常使用。特别说明:if(tempbuf == 0x31) //可以使用 P1_3 = 1; if(tempbuf == 0) //不可以使用 P1_3 = 0;当发送数字消息时,应为十六进制,因此在判断时,如接收到1,应判断是否等于0x31,而不是判断是否等于1。此处经过测试,发送1时,判断tempbuf == 0x31,该判断有效;当发送0时,判断tempbuf == 0,判断无效。判断字符加单引号即可。第三步,为什么使用两个相同的单片机会导致结果不同?这也是困扰了我很久的问题,后来经过检查,才知道原来就是晶振的问题。此处PO一下大神关于晶振的说明,暂时未看懂:https://www.zhihu.com/question/30930577但可以得出的结论就是,如果使用串口通信,应使用的晶振为11.0594MHZ,否则可能出现乱码的情况。另附:开发板上的晶振如图:
是可以更换的,某宝也有售,可以根据需要的晶振购买。