如上图所示,HC-05 模块用于代替全双工通信时的物理连线。左边的设备向模块发送串口数据,模块的 RXD 端口收到串口数据后,自动将数据以无线电波的方式发送到空中。右边的模块能自动接收到,并从 TXD 还原最初左边设备所发的串口数据。从右到左也是一样的。
①:模块与供电系统为 3.3V 的 MCU 连接时,串口交叉连接即可(模块的 RX 接 MCU 的 TX、模块的 TX 接 MCU
的 RX)
②:模块与供电系统为 5V 的 MCU 连接时,可在模块的 RX 端串接一个 220R~1K 电阻再接 MCU 的 TX,模块的
TX 直接接 MCU 的 RX,无需串接电阻。(注:请先确认所使用的 MCU 把 3.0V 或以上电压认定为高电平,否则需
加上 3.3V/5V 电平转换电路)
注:模块的电源为 3.3V,不能接 5V, 5V 的电源必须通过 LDO 降压到 3.3V 后再给模块供电。
用于设置蓝牙的相关信息(名字,配对密码,波特率(9600))按下模块上的按键,上电,即可进行AT指令模式,led灯慢闪表示进入AT模式,双闪表示蓝牙已连接并打开了端口。
上电后就进入了数据透传模式,此时蓝牙模块led灯快闪,连接后led灯双闪。在此模式下连接后可以传输数据。
①测试:AT\r\n 返回:OK (即通信成功)
②设置蓝牙名称:AT+NAME=PDD\r\n 返回:OK
③查询蓝牙名称:AT+NAME?\r\n 返回:+NAME=PDD OK
④设置配对密码:AT+PSWD=1234\r\n 返回:OK
⑤查询配对密码:AT+PSWD?\r\n 返回:+PSWD=1234 OK
⑥查询设备mac地址:AT+ADDR?\r\n 返回:+ADDR:21:13:52b9b OK
手机可以下载蓝牙调试器或者关注蓝牙调试公众号,蓝牙模块在数据透传模式可以用来连接蓝牙模块,并且给蓝牙模块发送数据,也可以通过编辑按钮,按按钮发送数据给蓝牙模块,蓝牙模块收到数据后通过串口发给MCU,从而控制MCU的一些外设
如上图U转UART1的RXD和TXD通过CH340芯片连接USB,可以通过USB连接电脑,用串口工具给MCU发数据和接收数据,USART1_TX和UASRT1_RX是和主芯片连着,调帽跳到1-3、2-4。如果蓝牙要和MCU通信,则调帽3-5、4-6相连,此时连到P4,将蓝牙模块的RXD和P4的TXD1连接,TXD和P4的RXD1连接,此时蓝牙模块就可以就可以和MCU通信.
//uart.c文件
#include "uart.h" void Uart_Init(uint32_t band) { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //1、初始化硬件 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_Init(GPIOA, &GPIO_InitStruct); //复用为串口1 GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); USART_InitStruct.USART_BaudRate = band; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件控制流 USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx ; USART_InitStruct.USART_Parity= USART_Parity_No; //无奇偶校验 USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_Init(USART1, &USART_InitStruct); //初始化NVIC NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x1;//抢占优先级 0-3 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x1;//响应占优先级 0-3 NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;//中断向量号 TIM3 中断向量号位tim3 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能 NVIC_Init(&NVIC_InitStruct); //串口中断 USART_ITConfig(USART1, USART_IT_RXNE,ENABLE); USART_Cmd(USART1,ENABLE); }
//main函数
#include "stdio.h"
uint16_t uart1_recv_data;
//重定向fputc fputs fgetc fgets
int fputc(int ch,FILE *f)
{
USART_SendData(USART1, ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
return ch;
}
//串口进入中断接收蓝牙发过来的数据
void USART1_IRQHandler()
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
//清楚中断标志位 往里面写1 记住一定要清空
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
uart1_recv_data = USART_ReceiveData(USART1);
}
}
//给蓝牙模块发数据
void USART_SendString(const uint8_t* str)
{
u8 i = 0;
while(*(str+i)!=‘\n‘)
{
USART_SendData(USART1, *(str+i));
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
i++;
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //给中断优先级分组
LED_Init();
Key_Init();
Beep_Init();
Uart_Init(9600); //和蓝牙模块的波特率一致
printf("hello");
while(1)
{
if(uart1_recv_data == ‘1‘)
{
PFout(8) =1;
}
if(uart1_recv_data == ‘0‘)
{
PFout(8) =0;
}
delay_s(1);
}
return 0;
}
原文:https://www.cnblogs.com/yuanqiangfei/p/14753533.html