5.HC-05蓝牙模块

发布于:2024-04-17 ⋅ 阅读:(25) ⋅ 点赞:(0)

配置蓝牙模块

注意需要将蓝牙模块接5v,实测接3.3v好像不太好使的样子

首先需要把蓝牙模块通过TTL串口模块接到我们的电脑,然后打开我们的串口助手

注意,我们现在是配置蓝牙模块,所以需要进入AT模式,需要按着蓝牙模块上的黑色小按钮再上电,这时候模块上的LED灯以一秒慢闪一次的速度闪烁着,如果你的LED是快速闪烁的可能就像上面说的一样接到3.3V去了

 连接好后测试一下,波特率默认设置为38400

发送AT,模块会返回一个OK

 我们给蓝牙修改一下名字,输入指令:

AT+NAME=自己想改的名字

例如: AT+NAME =BTtest

注意中间如果有空格的话会报错 

改完后拔掉蓝牙模块再重新上电,这时候不用再按黑色小按钮了,这样就能进去配对连接啦

我们用手机蓝牙调试助手测试一下

在调试助手找到我们的模块后点击右边加号连接

 连接后点击下方对话模式

然后输入内容点击发送

这时候我们的串口助手也能收到 

也可以使用我们的串口助手进行发送

手机也能收到我们串口发过来的信息

这就表明我们的蓝牙模块已经配置成功啦,能插到单片机上进去使用了,将跳线帽接到蓝牙这边

初始化USART3

从原理图我们可以看到,将跳线帽接到蓝牙这边后USART3就变成了蓝牙配置

所以需要找到我们的USART3并配置,可以看到USART的TX和RX分别在PB10和PB11

配置USART基本都是:

RCC开启USART和GPIO的时钟

//使用结构体输出化:

GPIO_Init();

NVIC_Init();

USART_Init();

//开启串口接收中断:

USART_ITConfig();

//上电

USART_Cmd();

void BT_UART3_Init(u32 bound )
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);	//使能USART3
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //GPIOB时钟

	//USART3_TX   GPIOB.10
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	//USART3_RX	  GPIOB.11
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB.11
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	//Usart3 NVIC 配置
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
	
	USART_Init(USART3, &USART_InitStructure); //初始化串口3
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
    USART_Cmd(USART3, ENABLE);
}

在main.c定义串口3标志位

int g_USART3_FLAG1 = 0; //串口3控制标志位

然后在BT.h里面extern一下

extern int g_USART3_FLAG1; //串口3控制标志位

中断服务函数添加处理

void USART3_IRQHandler(void)
{
	u8 Res;
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
	{	
		Res =USART_ReceiveData(USART3); //读取接收到的数据
		if(Res == 'A') g_USART3_FLAG1 = 1 ; //根据接受的数据 置为标志位
		if(Res == 'B')g_USART3_FLAG1 = 2 ;
	}
}

在上一节USART开启串口接收的函数里面把USART3的判断也加一下

//串口接收判断
void Usatr_If(void)
{
		if(g_USART1_FLAG1 ==1 | g_USART3_FLAG1 ==1 )
		{
			if(temp != 'A')
			{
				printf("Is A,LED Open\n");
			}
			temp = 'A';
			LED = RESET;
		}
		if(g_USART1_FLAG1 ==2 | g_USART3_FLAG1 ==2)
		{
			if(temp != 'B')
			{
			printf("Is B,LED Close\n");
			}
			temp = 'B';
			LED = SET;
		}
		if(g_USART1_FLAG1 ==3 | g_USART3_FLAG1 ==3)
		{
			if(temp != 'C')
			{
			printf("Is C,LED Flashing\n");
			}
			temp = 'C';
			LED =!LED;
		}
}

测试

然后在main.c里面测试一下

//开启串口接收
Usatr_If();

//初始化并设置波特率
BT_UART3_Init(115200);

烧录进单片机,程序现象就是:

输入A,串口打印Is A,LED Open,开启LED

输入B,串口打印Is B,LED Close,关闭LED

输入B,串口打印Is C,LED Flashing,闪烁LED

蓝牙模块测试

看log也打印正常,那么就证明蓝牙已经跟单片机调通啦


网站公告

今日签到

点亮在社区的每一天
去签到