HC-06蓝牙串口通信模块使用指南与驱动代码实战
目录
HC-06介绍
AT指令调试
调试接线
AT指令
进入 AT 指令的方法
设置蓝牙名称
设置蓝牙配对密码
设置主从工作模式
设置波特率
设置校验位
模块接线
驱动代码
HC-06.h
HC-06.c
main.c
HC-06介绍
HC-06 蓝牙串口通信模块,支持 AT 指令,用户可根据需要更改角色(主、从模式)以及串口波特率、设备名称等参数,使用灵活。可以实现10 米距离通信。
模块采用邮票孔封装方式
无线工作频段为 2.4GHz ISM,调制方式是 GFSK
基于 Bluetooth Specification V2.0 带 EDR 蓝牙协议的数传模块
参数列表
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测试
| 指令 | 响应 | 说明 |
| 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);
}
}
参考手册
https://www.hc01.com/downloads/HC-06.pdf
作者:我不吃代码