HC-06蓝牙模块使用与驱动代码详解
HC-06蓝牙模块使用与驱动代码详解
HC-06蓝牙模块是一种支持AT指令的无线通信模块,广泛应用于各种物联网设备中。本文将详细介绍HC-06模块的使用方法,包括AT指令设置、硬件接线以及STM32单片机的驱动代码,帮助开发者快速上手使用该模块。
HC-06介绍
HC-06蓝牙串口通信模块,支持AT指令,用户可根据需要更改角色(主、从模式)以及串口波特率、设备名称等参数,使用灵活。可以实现10米距离通信。
模块采用邮票孔封装方式,无线工作频段为2.4GHz ISM,调制方式是GFSK,基于Bluetooth Specification V2.0带EDR蓝牙协议的数传模块。
参数列表
- 支持AT指令
- 工作频率:2.4GHz ISM频段
- 调制方式:GFSK
- 蓝牙协议:Bluetooth Specification V2.0 + EDR
- 通信距离:10米
- 封装方式:邮票孔封装
AT指令调试
默认出厂参数
- 波特率:9600N81(N81表示8位数据位,无奇偶检验,1位停止位)
- 蓝牙名:HC-06
- 配对密码:1234
调试接线
HC-06 | USB to TTL |
---|---|
VCC | 3.3V |
GND | GND |
TXD | RXD |
RXD | TXD |
注意:不要勾选‘发送新行’,‘十六进制’,不需要回车换行。
AT指令
进入AT指令的方法
模块上电且在不配对的情况下,就处于AT模式。建议:两条指令之间的时间间隔控制在1S或以上。
指令 | 响应 | 说明 |
---|---|---|
AT | OK | 测试模块是否可以接收 |
设置蓝牙名称
指令 | 响应 | 说明 |
---|---|---|
AT+NAMEname | OKsetname | 参数name:所要设置的当前名称,即蓝牙被搜索到的名称。20个字符以内 |
例如:
发送:AT+NAMEbill_gates
返回:OKsetname
这时蓝牙名称改为bill_gates
参数可以掉电保存,只需修改一次。PDA端刷新服务可以看到更改后的蓝牙名称。
注:HC-06为主机时,不支持设置蓝牙名称。
设置蓝牙配对密码
指令 | 响应 | 说明 |
---|---|---|
AT+PINxxxx | OKsetPIN | 模块在出厂时的默认配对密码是1234。参数可以掉电保存,只需修改一次。 |
参数xxxx:所要设置的配对密码,4个数字,此命令可用于从机或主机。从机是适配器或手机弹出要求输入配对密码窗口时,手动输入此参数就可以连接从机。蓝牙模块主机搜索从机后如果密码正确,则会自动配对,主模块除了可以配对、连接从机外,如果其他产品包含从模块的时候也可以配对、连接,比如含蓝牙的数码相机,蓝牙GPS,蓝牙串口打印机,等等。这时蓝牙配对密码可能要改为8888。
例如:
发送:AT+PIN8888
返回:OKsetPIN
设置主从工作模式
主机:用于向从机下发指令,能够搜索从机并主动建立连接的一方。
从机:用于接收主机下发的命令,不能主动建立连接,只能等别人连接自己。
主从一体:能够在主机和从机模式间切换,即可做主机也可作从机。
指令 | 响应 | 参数 |
---|---|---|
AT+ROLE=S | OK+ROLE:S | S:设置模块为从模块Slave,(模块默认为从机) |
AT+ROLE=M | OK+ROLE:M | M:设置模块为主模块Master |
从机模式下蓝牙快闪,可与手机相连。
主机模式下蓝牙慢闪。
设置波特率
指令 | 响应 | 说明 |
---|---|---|
AT+BAUD1 | OK1200 | 波特率设置超过115200后用电脑无法使用,要用单片机编程,高于115200的波特率才能使用。 |
用AT指令设好波特率后,下次上电使用不需再设置,可以掉电保存波特率。串口助手中,设好波特率,需修改串口助手的波特率为刚刚设置的波特率,然后再打开串口继续操作。
例:
发送:AT+BAUD2
返回:OK2400
波特率代码如下:
1--------- 1200
2--------- 2400
3--------- 4800
4--------- 9600(默认就是这个设置)
5--------- 19200
6--------- 38400
7--------- 57600
8--------- 115200
9--------- 230400
A--------- 460800
B--------- 921600
C--------- 1382400
设置校验位
指令 | 说明 |
---|---|
AT+PN | 无校验(模块默认即为无校验) |
AT+PE | 模块为偶校验位 |
AT+PO | 模块为奇校验位 |
模块接线
HC-06 | STM32F103C8T6 |
---|---|
VCC | 3.3V |
GND | GND |
TXD | RXD(PA10) |
RXD | TXD(PA9) |
驱动代码
蓝牙模块接收数据,通过串口发给单片机,单片机进行处理
HC-06.h
#ifndef _HC_06_H_
#define _HC_06_H_
void HC06_Init(unsigned int baud);
#endif
HC-06.c
#include "stm32f10x.h" // Device header
#include "HC-06.h"
void HC06_Init(unsigned int baud)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //PA9 TXD
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//PA10 RXD
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = baud;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_Parity = USART_Parity_No; //无校验位
USART_InitStruct.USART_StopBits = USART_StopBits_1; //1位停止位
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART_InitStruct);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStruct);
USART_Cmd(USART1, ENABLE);
}
main.c
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "HC-06.h"
uint8_t Data;
int main(void)
{
OLED_Init();
HC06_Init(9600);
while (1)
{
OLED_ShowNum(1,1,Data,3);
}
}
//串口一接收中断
void USART1_IRQHandler(void)
{
uint8_t Byte=0;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
Byte=USART1->DR;
if(Byte==0x30){ Data++;}
if(Byte==0x31){ Data--;}
if(Byte==0x32){ Data+=3;}
if(Byte==0x33){ Data-=3;}
USART_ClearITPendingBit(USART1, USART_FLAG_RXNE);
}
}
参考手册:HC-06蓝牙模块用户手册