项目分享|小师弟手把手教你用蓝牙模块

运维

  一 、模块简介

  嵌入式蓝牙串口通讯模块(简称蓝牙模块)具有两种工作模式:

  命令响应工作模式和自动连接工作模式。

  当模块处于命令响应工作模式(或者AT模式)时能才能执行 AT 命令,用户可向模块发送各种 AT指令,为模块设定控制参数或发布控制命令。(AT指令就是我们PC与一些终端设备(例如蓝牙,WiFi模块)之间进行通信的,配置这些终端设备参数的一套指令。)

  在自动连接工作模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工作角色。当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输。主模式:该模块可以主动搜索并连接其它蓝牙模块并接收发送数据。从模式:只能被搜索被其它蓝牙模块连接进行接收发送数据。回环:蓝牙模块就是将接收的数据原样返回给远程的主设备。

  二、开发工具

  1.USB转TTL模块(可用CH340),蓝牙模块(HC-05),PC端串口助助手。

  2.蓝牙模块与USB转TTL模块的接线情况就是VCC-VCC,GND-GND,RXD-TXD,TXD-RXD,有的蓝牙模块只有四个引脚,而且我们见到的大多数蓝牙模块都是四个或者只需要用到四个引脚。

  3年嵌入式物联网学习资源整理分享:C语言、Linux开发、数据结构;软件开发,STM32单片机、ARM硬件开发、物联网通信开发、综合项目开发教程资料;笔试面试真题。点击下方插件免费领取嵌入式物联网学习资料(头条)

  3.手机需要安装一个可以进行蓝牙通信的APP,一般直接在你手机的应用商店搜蓝牙串口就可以下载相关APP,如“串口调试助手”。

  三、蓝牙模块初始化

  这里以蓝牙模块HC-05为例,蓝牙模块可能每个人买到的不一样,但是用法都相近,可以作为参考,建议你在哪里买的模块就找对应的卖家找到对应的蓝牙模块中文数据手册,一般来说里面都有对应的AT指令集。这里要注意的是如果你发送对应的指令,在硬件连接都正确的情况下如果串口调试助手不能得到回应,那么很可能是你的AT指令集是错的,因为不同的蓝牙模块对应的蓝牙AT指令集是有差别的。

  HC-05蓝牙模块引脚说明:

  蓝牙模块自带一个状态指示灯

  1.在上电时,将KEY脚悬空或接地,红灯1s一次快速闪烁,表示进入可配对模式。

  2.在上电之前,按住黑色小设置按钮不放,同时KEY接高电平,上电,灯2s一次慢速闪烁,表示进入AT模式,进入AT模式可以对蓝牙模块进行设置。

  3.配对成功模式,快速闪烁。

  这三点很重要,蓝牙模块只有进入了AT模式才能发送AT指令集,很多小白以为只要接上USB转TTL模块插到电脑,打开串口调试助手就可以发送指令。这是不可以的。切记!!!

  四、单片机串口程序

  这里以51单片机为例,蓝牙串口的程序最重要的就是配置串口定时器,这里将定时器相关的代码贴出来,大家最好按照这种方法配置,经过多次建议程序稳定。

  串口初始化 1void Usartinit()//初始化

   2{

   3 TMOD=0x21; //设置定时器1的工作方式2 0010 0000 GATE C/T 8位初值自动重装8位定时器

   4 PCON=0x80; //波特率加倍 电源管理寄存器

   5 TH1=0xf3; //给定时器重装初值

   6 TL1=0xf3; //这里的波特率必须加倍 不加倍的话 通讯不成功 本人目前还不知道原因

   7 //由于开发板使用的晶振频率是12M,非标准频率,在设置波特率时很容易产生误差,而导致串口通信出现乱码或者失败

   8 //目前来说,选择波特率4800,SMOD=1波特率加倍的方式,误差率仅为0.16%,为12M晶振中最小的误差

   9 TH0=0XEC; //5ms定时

  10 TL0=0X78;

  11 TR0=1;

  12 ET0=1;

  13 TR1=1; //开定时器1

  14 SM0=0; //选择串口工作方式1,常用

  15 SM1=1;

  16 REN=1; //开串口接收 此时接收器所选择的波特率16倍速率采样RXD移交的电平 开始接收信息

  17 ES=1; //串行中断总开关

  18 EA=1; //开总中断

  19}

  相关配置程序注释已相当明白。

  主函数 1uchar flag,i,receive;

   2uchar code table1[]="GO";

   3uchar code table2[]="Stop";

   4void main()

   5{

   6 Usartinit(); //调用初始化函数进行初始化

   7 while(1)

   8 {

   9 if(flag==1) //不断的检测标志位是否被置1 被置1说明已经执行了中断服务程序,即已经接数据,否则一直检测flag的状态

  10 {

  11 switch(receive)

  12 {

  13 case 1:

  14 ES=0; //接下来要发送数据 先要使ES=0关闭串口中断 等数据发送完后再打开串口中断

  15 for(i=0;i<2;i++)

  16 {

  17 SBUF=table1[i];

  18 while(!TI); //等待是否发送完成 因为发送完成后TUI会有硬件置1

  19 TI=0; //清除发送完成标志位 手动清0

  20 }

  21 ES=1;

  22 flag=0;

  23 break;

  24 case 2:

  25 ES=0;

  26 for(i=0;i<4;i++)

  27 {

  28 SBUF=table2[i];

  29 while(!TI);

  30 TI=0;

  31 }

  32 ES=1;

  33 flag=0;

  34 break;

  35 }

  36 }

  37 }

  38}

  39void Usart() interrupt 4 //一旦有数据接入,串行口中断触发

  40{

  41 receive=SBUF-48; //当REN为1时 开始接收数据 将接收到的值赋予receive 这里的是ACSII 所以要减去48

  42 RI=0; //当RI=0 将接收数据存入SBUF寄存器中 清除接收中断标志位 有内部硬件置1,项CPU发出中断请求 在中断服务程序中,必须用软件将其清零, 取消此中断申请

  43 flag=1; //将标志位置1 这个是方便在主程序中查询判断是否已经接收到数据

  44}

  以上是单片机的程序,由于51单片机只有一对RXD和TXD引脚,故先将程序下载到单片机后再将蓝牙模块的四个引脚接到单片机的RXD和TXD引脚,以后每次下载程序是都要这样操作,但不要嫌麻烦。

  五、手机端操作

  在安卓手机的应用商店搜索“蓝牙调试助手”,我的应用商店下载的是“蓝牙调试器”

  在没有连接成功蓝牙时,蓝牙上面的红灯一直在闪烁,当连接成功后,红灯停止闪烁,每发送一条指令,电脑的串口调试助手就会收到手机端发送的消息。

  原文标题:项目分享

  小师弟手把手教你用蓝牙模块

  原文链接:https://mp.weixin.qq.com/s/ggA2x_prpV9EWO_uIyNUHA

  原文作者:果果小师弟

标签: 运维