51单片机和蓝牙模块[HC-05]---手机蓝牙控制小灯之小白速成

接线

在这里插入图片描述

  • 接线是最关键的一步!!!!不多提辛酸历程了。(笔者使用的是集合有USB转TTL的单片机)

  • 我们需要遵循一个原则,交叉连接,TXD和RXD连接,RXD和TXD连

  • ********下面来理一下思路

  • 如果要用电脑与蓝牙模块进行通信 (如:用电脑配置蓝牙模块的波特率),需要将蓝牙模块的RXD和单片机的P3.0(RXD)相连,TXD和单片机的P3.1(TXD)相连。
    如果要将单片机和蓝牙模块进行通信(如:用手机蓝牙连接蓝牙模块,通过手机APP发送指令到蓝牙,蓝牙将收到的数据传给单片机)需要将蓝牙模块的RXD和单片机的P3.1(TXD)相连,TXD和单片机的P3.0(RXD)相连。
    因为以上两种是我们都需要使用的,因而在具体操作时请大家记得更换接线
    我们对51单片机进行程序烧录时,记得将蓝牙模块的RXD和TXD拔下,有可能会烧录不成功。

  • HC-05有6个引脚(不同款可能不一样),但是经实际测试,只需要中间4个引脚即可(TXD、RXD、GND、VCC【5V】),和一些只有4个引脚的蓝牙模块接线相同,特别注意的是EN最好不要接入高电平了,虽然这是个使能,但是这玩意接上后,模块只会进入配置模式(以下会详解)

  • 蓝牙模块一共有两个模式:1.配置模式 2.正常模式

    • 配置模式:用来设置主从机、波特率、密码、连接等一系列信息(使用AT指令);其中需要我们设置的是波特率,主从机以及密码。其具有断电保存的功能,所以我们一般只需要配置一次。
    • 正常模式:当设置完配置模式一系列参数后,我们便可以进入正常模式,将蓝牙模块和另一个拥有蓝牙模块的设备进行通信,从而传递数据
  • 按住蓝牙模块上的小按键,然后上电,即可进入配置模式(灯2S闪烁一次);也可以将EN接入高电平,上电后便直接进入配置模式(不推荐)。正常上电(不进行其余操作,不要接EN,不要接EN,不要接EN),便进入正常模式。

配置模式

  1. 线路接好后,我们要看蓝牙模块是否正常工作,首先进入配置模式,然后打开串口调试工具,波特率设置为38400,这个是配置模式下固定的波特率,就算我们在后面进行了波特率更改,改变的其是正常模式下的波特率;再次进入配置模式,依旧需要设置为38400的波特率,发送 AT 到蓝牙模块,如果收到OK,那么你的蓝牙模块没啥大问题,如果没有收到,恭喜你,中奖了,退货吧(大概率是因为操作问题,特别是串口调试工具的使用,有的串口调试程序有发送新行这一选项,一定要勾上才可以,它可以在发送时自动的在AT后加入/r/n;正常传输我们需要发送 的是AT\r\n 这一指令,但是大多数串口调试工具已经自动的添加\r\n,或者是有类似于发送新行的选项
    串口调试工具 提取码:xici
    在这里插入图片描述

2.确认串行调试工具和蓝牙模块可以正常通信后,发送以下指令

  • AT+ROLE=0 (蓝牙模块设为从机,此时只可以被搜索)
    AT+CMODE=1 (蓝牙模块可以和任意设备连接)
    AT+UART=9600,0,0 (设置波特率9600)
    AT+NAME=HC05 (设置蓝牙的名字为HC05,手机蓝牙搜索时就找这个名字)
    AT+PSWD=1234 (设置密码,手机蓝牙串口APP连接蓝牙模块,需要输入密码)
    以上,蓝牙串口通通返回OK 。
    此时,配置到这里,我们已经可以完成本次实验的功能了,AT指令集众多,如果想了解更多功能笔者为大家准备了指令集供参考。
    AT指令集 提取码:uqge

  • 断电,再上电,进入正常模式

  • 手机端蓝牙串口APP我推荐 SPP蓝牙串口 ,界面更美观,操作更直观,别的一些串口调试工具当然也可以,大家自由下载,具体操作也相同:打开蓝牙串口,搜索到HC05,然后点击连接,输入1234的密码,然后连接成功。
    在这里插入图片描述
    3.将代码烧录进51单片机,实现功能为:当我们用手机蓝牙串口发送31时(hex下),小灯点亮,当发送其他任意数据时,小灯熄灭;同时可以打开电脑串口调试工具监视当前手机蓝牙发送的数据。

程序编写

当我们用串口发送数据时,一般都会有的两个选项:HEX和字符串。我们要清楚HEX和字符串到底是什么,有什么区别。
串行通信,实质上发送的都是ASCII码,我们要时刻清楚这一点

  • hex是16进制,其2位为一组,比如发送1,就是发送0x01;发送1234,就是发送0x12和0x34。
  • 字符串包含了我们所使用的所有符号,其中数字、大小写字母、标点符号以及一些特殊控制字符可以直接转换为ascall码,顺便提一下ascall码是一个7位2进制数,范围为0-127,例如1的ascall是49,a是97,\n(换行)是10等等;那么汉字是怎么表示的呢,这就涉及到GB2312码表,原理其实也很简单,用两个ascall码来表示一个汉字(串行通信发送的都是ascaII码):第一位表示纵坐标,后一位表示横坐标,然后在GB2312表中找到所对应的汉字。例如206(CE),210(D2)查表得汉字“我”,仅简单介绍,了解即可,我们不需要对其进行操作,硬件会自动识别。
  • 1的ascaII码是49,转换为16进制是31,即0x31,因此可以理解为何我们在程序中写收到0x31时小灯亮,因为当我们选择用字符串发送1时,单片机实际收到的则是0x31。
// 51单片机
#include<reg52.h>

typedef unsigned int uint;
typedef unsigned char uchar; 
sbit led1 = P2^1;   //根据各位实际的单片机上的小灯硬件连接,随便选择一个即可
uint pass = 0;      //传递数据位

void UART_init()    //设置串行通信 本晶振为11.0592MHZ,其他的就自己算一下应该设置多少
{
      TMOD = 0x20;
      TH1 = 0xfd;
      TL1 = 0xfd;  //波特率9600
      SM0 = 0;  
      SM1 = 1;   // 串口工作方式1 10位异步
      REN = 1;  //串口允许接收
      TR1 = 1;
      EA = 1;
      ES =1 ;  //串口中断
}

int main()
{
       UART_init();  //波特率9600
       while(1)
       {
                    if(pass == 0x31)  
                         led1 = 0;  //本单片机P2^1为小灯
                    else
                         led1 = 1; 
       }           
}

void UART_INTERRUPT() interrupt 4
{        
              pass = SBUF;
              RI = 0;   
              SBUF = pass;    //手机和蓝牙模块通讯时,我们可以打开电脑串口调试工具查看我们的发送值)
              while(!TI);
              TI = 0;  
}

第一次发表,经验不足,还望多多包涵,之后学习其他的一些模块也会慢慢更新,希望得到大家的支持!!!!!!你们的支持是我最大的动力!!!!!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐