51单片机与蓝牙模块连接

2019-07-11来源: eefocus关键字:51单片机  蓝牙模块  连接

不久前开始学习使用蓝牙模块,在模块与51单片机连接的过程中出现了非常多的问题,我想应该也是很多新手和我一样会遇到这样的问题,因此特地写这篇文章,想分享下在学习过程中遇到的问题以及解决方法。


此次学习用到模块是HC-06蓝牙模块,如下图:

该模块某宝有售,价格约为20RMB。某宝上的HC-06有两种,分别是带引脚和不带引脚的,建议新手购买带引脚的。我从试验开始到成功,一共使用了四块蓝牙模块。第一次买的是带引脚的,但是模块本身是坏的;第二次买的是不带引脚的,但是由于自身的焊功有限,导致模块损坏,无法使用;第三次是朋友送的蓝牙4.0,由于某些原因无法使用,在此也特别感谢朋友送我蓝牙;第四次购买,就是上图所示的蓝牙,才最终完成了试验。


总结:在某宝购买时,最好货比三家,虽然模块不值钱,但是在购买过程遇到问题会耽误时间,影响开发,非常麻烦。


单片机用了两个,分别是新手常用的开发板还有一个单片机最小模块,两者有什么区别我稍后会说明。


开发板:

单片机最小模块:



我特别标注了两者的晶振,分别为12MHZ和11.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,否则可能出现乱码的情况。


另附:开发板上的晶振如图:



是可以更换的,某宝也有售,可以根据需要的晶振购买。



关键字:51单片机  蓝牙模块  连接

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic467491.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:通用型1602,12232,12864液晶操作方法
下一篇:详细讲解单片机复位电路原理

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51单片机之定时器/计数器应用实例(方式0、1、2、3)

硬件:STC89C52RC开发工具:Keil uVision4     对于刚接触单片机的同学来说可能会对定时器/计数器的应用很蒙圈,特别是初值的计算和各种定时方式的选择。下面希望能给你带来一个清晰的思路。定时器:一般用于软件计时,给定时器设置一个时间,时间到了系统停止当前的工作跳转到事先定义好的定时器中断函数里,函数里可以做一些周期性的事情。计数器:一般用于检测外来脉冲信号,给计数器设置一个次数,次数到了系统停止当前的工作跳转到事先定义好的计数器中断函数里,函数里做相应的事情。先说一下相关的寄存器,也可以直接跳过,看后面的实例分析。配置定时器或者计数器就是对相应的寄存器进行赋值,下面是相关的寄存器
发表于 2019-08-20
51单片机之定时器/计数器应用实例(方式0、1、2、3)

51单片机之外部中断应用实例(电平触发、边沿触发)

硬件:STC89C52RC开发工具:Keil uVision4前言:8051是一款很经典的、历史悠久的单片机,作为一款入门级的单片机8051受到很多初学者的欢迎。89c52是8051系列的成员之一,拥有8K字节程序存储空间,512字节随机数据存储空间;I/O口控制端口、中断功能、定时器及串行接口。下面详细讲述外部中断功能的使用。外部中断:单片机提供的系统紧急事件的输入控制。事件触发的方式包括输入信号的下降沿触发、低电平触发。当触发中断后,单片机会跳到某一个固定的地址去执行中断服务程序。外部中断信号由INT0、INT1引脚传送进来,如图所示:有关中断处理的相关控制寄存器如下:计时计数器控制寄存器 TCON中断允许控制寄存器 IE
发表于 2019-08-20
51单片机之外部中断应用实例(电平触发、边沿触发)

51单片机之串口通讯应用实例(逻辑分析仪调试)

硬件:STC89C52RC开发工具:Keil uVision4前言:8051是一款很经典的、历史悠久的单片机,作为一款入门级的单片机8051受到很多初学者的欢迎。89c52是8051系列的成员之一,拥有8K字节程序存储空间,512字节随机数据存储空间;I/O口控制端口、中断功能、定时器及串行接口。下面详细讲述串行接口功能的使用。不管你用的芯片是不是STC89C52RC,只要你看完这篇文章,就能自行运用到不同的芯片上;因为一种串口通信协议的传输原理在任何芯片上都是统一的;所以它可以作为不同芯片一起协作的通信媒介。目前普遍的单片机都有串行通信的接口,因为它依赖的硬件比较简单,一条串行数据输出线(TX)、一条串行数据接收线(RX)、一条
发表于 2019-08-20
51单片机之串口通讯应用实例(逻辑分析仪调试)

STM32单片机连接HC_SR04超声波模块测距

吧。/ * 教训:实验前一定要检查引脚连接是否正确,万不可搞错,不然又要烧坏芯片!!!! 2017年6月8日 * /    #include“hcsr04.h”  #include“chao_usart.h”    int  main()  {                浮动 长度; 
发表于 2019-08-19
STM32单片机连接HC_SR04超声波模块测距

矩阵键盘扫描原理详解——单片机

键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下。最后一步确定键值。现在我们以第二行的S5键为例,若按下S5后我们应该怎么得到这个键值呢?当判断确实有键按下之后,行线轮流输出低电平,根据读入列线的数据可以确定键值。首先,单片机将P10输出为低电平,其它P11~P13输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有键按下;其次,单片机将P11输出低电平,其它P10
发表于 2019-08-16

单片机读入4*4矩阵键盘

一、什么是矩阵键盘矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组,由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘有4*4和8*8,其中用的最多的是4*4。网上搜了两张实物图,大家可以看看看上图就知道,4*4键盘还是很多地方用到的吧^_^二、矩阵键盘的原理矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。由于单片机IO端口具有线与的功能,因此当任意一个按键按下时,行和列都有一根线被线与,通
发表于 2019-08-16
单片机读入4*4矩阵键盘

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved