datasheet

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

上一篇:通用型1602,12232,12864液晶操作方法
下一篇:最后一页

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

推荐阅读

STM32开发笔记38: 单片机内部Flash的读写

单片机型号:STM32F070F6P6本文介绍应用C语言进行单片机内部Flash的读写技巧,将从查看文档开始,到最终完成完整的程序。单片机型号:STM32F070F6P6步骤如下:1、查看文档《STM32F030x4/x6/x8/xC and STM32F070x6/xB advanced ARM®-based 32-bit MCUs》确认其Flash的内部结构。2、查看文档确认STM32F070F6P6内部存储器地址分配。从下表中得到的主要信息是Main Flash memory的起始地址是0x08000000,长度是32KB,到0x08017FFF结束(结束值可不关心)。3、继续查看Main Flash memory的内部结构
发表于 2019-07-16
STM32开发笔记38: 单片机内部Flash的读写

模拟量数据的采集过程解析

二进制的000000000000代表输入模拟量0V,而111111111111代表最大值VREF。下面以上图C8051单片机为例子,如原理图所示,该单片机工作电源为3.3V,参考电压为2.048V,所以模拟量的输入范围为0~2.048V。若所需采集的电压范围大于参考电压值时,可以使用电阻分压进行降压或者使用运放进行缩小等。该单片机ADC为12位的。也就是说输入电压为0时,单片机转换后的数字量结果为000000000000(二进制),当输入电压为2.048V时,单片机转换后的数字量结果为111111111111(二进制),十进制为4095。也就是说,输入电压的值V=2.048×ADC采集到的数字量÷4095。比如我们要采集一个0~10V
发表于 2019-07-13
模拟量数据的采集过程解析

单片机入门学习八 STM32单片机学习五 时钟系统

单片机学习除了了解该篇 单片机入门学习五 STM32单片机学习二 跑马灯程序衍生出的stm32编程基础 中的基础外,我们还需要有时钟的概念,本篇将记录 stm32的时钟系统。1、STM32时钟介绍 下面这幅图时stm32的时钟系统框图 1)蓝底框表示 时钟源,即: ①HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③LSI是低速内部时钟,RC振荡器,频率为40kHz。(WDG看门狗 使用该时钟源) ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。(RTC
发表于 2019-07-12
单片机入门学习八 STM32单片机学习五 时钟系统

单片机入门学习十三 STM32单片机学习十 通用定时器

本篇重点记录的是STM32F1的通用定时器。 STM32F103ZE有8个定时器,其中2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5),2个基本定时器(TIM6、TIM7)。下表是对这8个定时器的详细描述。定时器种类 位数 计数器模式 产生DMA请求 捕获/比较通道 互补输出 特殊应用场景高级定时器(TIM1,TIM8) 16 向上、向下、向上/下 可以 4 有 带死区控制盒紧急刹车,可应用于PWM电机控制通用定时器(TIM2~TIM5) 16 向上、向下、向上/下 可以 4 无 通用。定时计数,PWM输出,输入捕获,输出比较基本定时器(TIM6,TIM7) 16 向上、向下
发表于 2019-07-12
单片机入门学习十三 STM32单片机学习十 通用定时器

单片机中工程的文件结构分析

一直以来都是在原有的工程上直接新建自己的模块文件,现在一到自己新建工程的时候就出现了各种的链接错误(当然我这里说的是多文件的工程,单文件工程不会出现链接错误的),平常接触的51,32,飞思卡尔K66等芯片都的工程都有自己的工程结构。简单的51来说一般都是单文件的工程,毕竟本身的资源不多,引脚定义也少。如果你的工程在各模块编译没有错的情况下,link时出现错误或警告,一定是文件结构有问题。通俗来讲就是乱定义。这里以51为例提供一种常用的工程结构定义,绝对不会出错。/*新建工程后,建立一个总的.h文件可以,暂且命名为include.h。include.h下包含工程下所有的.h文件(包括所需的C库.h和各模块的.h)关于寄存器的定义
发表于 2019-07-09

基于STM32的无线通信模块使用——HC_05蓝牙串口

一、模块介绍1、供电电压3.3V~3.6V; 2、支持AT指令集配置模块; 3、采用CSR主流蓝牙芯片,蓝牙V2.0协议标准; 4、波特率最高为1382400bps; 5、配对以后当全双工串口使用,无需了解任何蓝牙协议,但仅支持8位数据位、1位停止位、无奇偶校验的通信格式,这也是最常用的通信格式,不支持其他格式。 6、接口电平3.3V,可以直接连接各种单片机(51,AVR,PIC,ARM,MSP430等),5V单片机最好串联一个1K电阻再与模块直接连接,无需MAX232也不能经过MAX232!二、PC端配置模块,手机端连接模块如果要配置模块的参数,那么就必须要进入AT命令模
发表于 2019-07-11
基于STM32的无线通信模块使用——HC_05蓝牙串口

小广播

何立民专栏

单片机及嵌入式宝典

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

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