51单片机和STM32集成蓝牙模块实用指南
51单片机和STM32集成蓝牙模块实用指南
蓝牙模块(如HC-05、HC-06、JDY-31等)是嵌入式开发中常用的无线通信模块,广泛应用于智能家居、物联网、机器人等领域。本文将详细介绍如何将蓝牙模块集成到 51单片机 和 STM32 中,并提供一个简单的点灯Demo代码。
1. 蓝牙模块简介
蓝牙模块是一种基于蓝牙协议的无线通信模块,通常支持串口通信(UART)。通过蓝牙模块,单片机可以与手机、电脑或其他蓝牙设备进行数据传输。
- 常见模块:HC-05(主从一体)、HC-06(从机)、JDY-31(低成本)。
- 通信方式:串口(UART)。
- 工作模式:
- AT模式:用于配置模块参数(如波特率、名称、配对密码等)。
- 通信模式:用于数据传输。
2. 硬件连接
(1) 蓝牙模块引脚说明
- VCC:电源正极(通常为3.3V或5V)。
- GND:电源负极。
- TX:串口发送引脚(接单片机的RX)。
- RX:串口接收引脚(接单片机的TX)。
- STATE:状态指示引脚(可选,用于检测模块连接状态)。
- EN/KEY:使能或AT模式引脚(具体功能因模块而异)。
(2) 连接方式
- 51单片机:
- 蓝牙模块的 TX 接单片机的 RX(P3.0)。
- 蓝牙模块的 RX 接单片机的 TX(P3.1)。
- GND 接 GND。
- VCC 接 5V(注意:部分蓝牙模块支持3.3V供电,需根据模块规格选择)。
- STM32:
- 蓝牙模块的 TX 接STM32的 RX(如USART1的PA10)。
- 蓝牙模块的 RX 接STM32的 TX(如USART1的PA9)。
- GND 接 GND。
- VCC 接 3.3V(注意:STM32的IO电平为3.3V,蓝牙模块也需使用3.3V供电)。
3. 配置蓝牙模块
(1) 进入AT模式
- 不同蓝牙模块进入AT模式的方法可能不同,常见方法包括:
- 将 EN/KEY 引脚接高电平(3.3V或5V)。
- 按住模块上的按钮(如果有)并上电。
- 通过特定波特率(如38400)发送AT指令。
- 发送
AT
,确认模块返回OK
。
(2) 修改模块参数
-
设置波特率:
AT+UART=9600,1,0
-
设置名称:
AT+NAME=MyBluetooth
-
设置配对密码:
AT+PSWD=1234
-
重启模块使设置生效。
4. 51单片机点灯Demo
(1) 硬件连接
- 蓝牙模块:
- TX 接单片机的 RX(P3.0)。
- RX 接单片机的 TX(P3.1)。
- GND 接 GND。
- VCC 接 5V。
- LED灯:
- 正极接单片机的 P1.0。
- 负极接 GND(通过限流电阻)。
(2) 代码实现
#include <reg52.h>
sbit LED = P1^0; // 定义LED引脚
void UART_Init() {
SCON = 0x50; // 8位数据位,1位停止位
TMOD |= 0x20; // 定时器1模式2
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
TR1 = 1; // 启动定时器1
ES = 1; // 使能串口中断
EA = 1; // 使能总中断
}
void UART_SendByte(unsigned char byte) {
SBUF = byte;
while (!TI);
TI = 0;
}
void UART_ISR() interrupt 4 {
if (RI) {
unsigned char data = SBUF;
RI = 0;
if (data == '1') {
LED = 0; // 开灯
} else if (data == '0') {
LED = 1; // 关灯
}
}
}
void main() {
UART_Init();
LED = 1; // 初始化LED为关闭状态
while (1);
}
(3) 测试
- 使用手机蓝牙调试工具(如Serial Bluetooth Terminal)连接模块。
- 发送
1
,LED灯亮;发送0
,LED灯灭。
5. STM32点灯Demo
(1) 硬件连接
- 蓝牙模块:
- TX 接STM32的 RX(如USART1的PA10)。
- RX 接STM32的 TX(如USART1的PA9)。
- GND 接 GND。
- VCC 接 3.3V。
- LED灯:
- 正极接STM32的 PA5。
- 负极接 GND(通过限流电阻)。
(2) 代码实现
#include "stm32f10x.h"
void UART_Init() {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; // TX
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; // RX
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = 9600;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStruct);
USART_Cmd(USART1, ENABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_EnableIRQ(USART1_IRQn);
}
void USART1_IRQHandler() {
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
uint8_t data = USART_ReceiveData(USART1);
if (data == '1') {
GPIO_SetBits(GPIOA, GPIO_Pin_5); // 开灯
} else if (data == '0') {
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 关灯
}
}
}
int main() {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
UART_Init();
while (1);
}
(3) 测试
- 使用手机蓝牙调试工具(如Serial Bluetooth Terminal)连接模块。
- 发送
1
,LED灯亮;发送0
,LED灯灭。
6. 总结
通过本文的指南,你可以轻松地将蓝牙模块集成到51单片机或STM32中,并实现一个简单的点灯Demo。无论是初学者还是有经验的开发者,掌握蓝牙模块的使用方法都能为你的项目带来更多可能性。