STM32 串口通信②:蓝牙模块HC-05控制单片机

一 前言

上一篇我们已经成功实现单片机和电脑的连接,接下来,我们学习一个有趣的板块,HC-05蓝牙模块,这个蓝牙模块,我们就要建立手机和单片机的通讯啦,还是比较有趣的一个过程,大家可以跟着多操作,大家有看不懂的,欢迎大家在评论区里问我,我会为大家一一解答~

关于蓝牙的一些基础知识,我就不给大家介绍啦,大家感兴趣可以进行搜索从而翻阅更加全面的知识啦,我在这篇文章中,给大家做保姆级的教学,希望对大家有所帮助!

二 HC-05细节介绍

大家请看上面这两张图,在蓝牙板块中呢,最经典的蓝牙就是HC-05和HC-06型号的,非常适合初学者进行学习蓝牙板块。大部分初学者都是学习HC-05板块的,为什么呢,大家请看我上面画红框的部分,在HC-06中,引脚更为简单。

  • HC-06具有四个引脚,包括vcc、GND、TXD、RXD
  • HC-05具有六个引脚,包括vcc、GND、TXD、RXD、STATE、EN

05比06多出了两根线,这两根START和EN可以支持HC-05进入AT模式,HC-06只能作为从机来使用,HC-05可以在AT模式中配置主机或从机模式。

主机模式:是HC-05可以连接别的设备

从机模式:是只能HC-05/06去连接手机设备

我们本次的项目介绍,主要是围绕从机模式,让手机去控制单片机实现一些功能,主机模式本次不进行介绍。

  • EN:给他连接一个高电平,帮助HC-05进入AT模式,认真看下去,不急~
  • STATE:这个引脚主要是判断是否连接上蓝牙,可以理解为蓝牙指示灯
  • 当手机或电脑蓝牙搜索并配对 HC-05 时,蓝牙连接一建立,STATE 引脚立刻拉高。

  • 单片机检测到这个高电平,就让 LED 亮起来,这样用户一看就知道蓝牙工作正常。

  • 蓝牙一断开,STATE 又拉低,LED 熄灭。

三 HC-05的AT模式

1 硬件连接

首先大家需要准备两个东西,分别是USB转串口、HC-05串口的两个模块,然后我们将上面这个引脚进行如下的连接:

|---------|--------|
| 蓝牙HC-05 | USB转串口 |
| EN | 3.3V |
| RXD | TXD |
| TXD | RXD |
| VCC | 5V |
| GND | GND |

在蓝牙上面的STATE不用接线 !!!实际如下图:

2 AT指令集

然后打开串口调试助手,我用的是安信可串口调试助手,大家可以在网上搜一搜,下载一个这个串口调试助手,个人感觉这个挺好的,下面这个配置一定要正确哈,该模块HC-05的波特率是38400,发送新行也要勾选上。

所有的AT指令都需要换行操作,这里大家需要明白一个点,在串口的换行和C语言中的换行不一样,C语言是\n,在串口中是\r\n,如果勾选了"发送新行",就不用在打\r\n,只需要敲回车键就ok。

发送 AT, 回复 OK
发送 AT+UART? 回复 +UART9600,0,0
发送 AT+UART=115200,0,0 回复 OK 。
通过上述步骤波特率即配置成功。
发送 AT+NAME=" XXXX" , 修改蓝牙模块名称为 XXXX
发送 AT+ROLE=0 , 蓝牙模式即为从模式
发送 AT+CMODE=1 , 蓝牙连接模式为任意地址连接模 式,该模块可以被任意蓝牙设备连接
发送 AT+PSWD=1234 , 蓝牙配对密码为 1234, 密码只能是四位
发送 AT+UART=9600,0,0 , 蓝牙通信串口波特率为 9600,停止位 1 位,无校验位
配置完成,需要重启一次,则需要在发送一个 AT+RESET


注意事项:

以上大家按照步骤进行写就好,在这里有几个问题要给大家说明一下:

1 为什么要把蓝牙的波特率换成115200?

其主要目的就是为了让通信的速率更快,虽然我们这次只是用AT指令,但是后面要进行蓝牙串口传输数据的时候,要快一点,我们把波特率设置高一点就会更加的高效快捷,这是一种良好的习惯

2 AT+UART=115200,0,0 ,是什么意思?

是将蓝牙模块设置为 波特率为115200,停止位1位,无校验位。记住那几个数之间使用英文里面的逗号,中文会报错

最后的一个效果图,如图:

经过以上几步,我们的蓝牙模块就已经写好啦,接下来我们需要给蓝牙放到单片机中

四 按步骤写代码

我们在上一篇文章中已经写好了关于普通串口的代码,我们直接重新在usart.c文件中重新写一个函数my_bluetooth_usart_Config,关于蓝牙板块的底层函数。

cs 复制代码
void my_bluetooth_usart_Config(void)
{
	GPIO_InitTypeDef GPIO_structure;
	USART_InitTypeDef usart_structure;
	NVIC_InitTypeDef NVIC_structure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE);
  RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2 , ENABLE);

	//PA2--Tx,发送
	GPIO_structure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_structure.GPIO_Pin = GPIO_Pin_2;
	GPIO_structure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init( GPIOA, &GPIO_structure );
	
	//PA3--Rx,接收
	GPIO_structure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_structure.GPIO_Pin = GPIO_Pin_3;
  GPIO_Init( GPIOA, &GPIO_structure );	
	
	usart_structure.USART_BaudRate = 9600;
	usart_structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	usart_structure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	usart_structure.USART_Parity = USART_Parity_No;
	usart_structure.USART_StopBits = USART_StopBits_1;
	usart_structure.USART_WordLength = USART_WordLength_8b;
  USART_Init(USART2, &usart_structure);
  USART_Cmd( USART2,ENABLE);
  USART_ITConfig( USART2,USART_IT_RXNE,ENABLE);	//RXNE,接收数据寄存器不空
	
//连续发送数据,需要用这个,一个字符串或者一个字节流,则用TXE
//判断数据是否发送完成,则用TC 
//当你的设备需要从外部接收数据,则用RXNE

	NVIC_structure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_structure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_structure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_structure.NVIC_IRQChannelSubPriority = 0;
  NVIC_Init(&NVIC_structure);
	
	
}

在如上代码呢,我们使用的是串口2,USART2的时钟是在APB1上,我们需要重新写一个时钟函数放到最上面--关于USART2的。然后要把相应的波特率改写成9600,9600是蓝牙原本的波特率,必须要写,别写错了。剩下的相应原理请看上篇文章,看懂上一篇我写的文章,大家就明白为什么如此配置代码了。记得哦,要在.h文件中声明这个函数的名称哦

还有一个点要强调的是:这里USART为什么引脚设置为PA2PA3?

上面是stm32f1xx的中文参考手册,大家可以翻到相应的页数120页,大家可以看到对于USART2的端口,大家还记得REMAP什么意思嘛,这是重映射的意思,USART_REMAP=0就代表没有重映射,不理解的话,大家请翻上一篇文章,那里有详细的介绍。


随后我们打开main.c函数,添加如下代码

cs 复制代码
#include "stm32f10x.h"
#include "led.h"
#include "yaokong.h"
#include "usart.h"
#include "stdio.h"


int main()
{
 
	//1.初始化灯的引脚GPIOA1	

	Config_Ledinit(); 
	my_bluetooth_usart_Config();
	my_usart_Config();

	
	GPIO_SetBits( GPIOA, GPIO_Pin_1);
	
	while(1)
	{

		
	}
   
}


//手机--单片机串口
void USART2_IRQHandler()
{
	
	unsigned char str=0;

	if( USART_GetITStatus( USART2,USART_IT_RXNE) != RESET)
	{

		str = USART_ReceiveData( USART2);
		if(str == '1')
		{
			GPIO_ResetBits( GPIOA,  GPIO_Pin_1);

		}
		if(str == '0')
		{
			GPIO_SetBits( GPIOA,  GPIO_Pin_1);	
			
		}

		
  USART_ClearITPendingBit( USART2,USART_IT_RXNE);
		
	}
	
}

我们便可实现按1灯亮,按0灯灭。

五 硬件连接

此时蓝牙HC-05上面把EN的这跟线拔了,然后按如下表,将线插好:

|---------|-----|
| HC-05蓝牙 | 单片机 |
| RXD | PA2 |
| TXD | PA3 |
| GND | GND |
| VCC | 5V |

六 手机APP

1 我们需要在手机上下载一个"蓝牙调试助手",这个app软件的广告比较多(哈哈)

2 点开之后搜索你的蓝牙,点添加新的蓝牙,然后搜索到你创建的蓝牙就可以了

3 随后我们进入到一个界面,我们点界面调试

4 然后我们点下方的组件

5 选择switch,也就是开关的意思

6 随后我们将他的属性配置好,如下图,切记哈,画红框的一定要改成GBK形式,GBK是发送汉字的编码,大家记住就好,感兴趣的自己查阅GBK什么意思。反正选成GBK就对了。

然后,该项目就创立好啦,实现相应效果的视频我已放到我主页的视频部分,大家可以自行翻看最终效果

相关推荐
m0_4666077013 分钟前
【STM32CubeMX】ST官网MCU固件库下载及安装
stm32·单片机·嵌入式硬件
Wallace Zhang4 小时前
STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader
stm32·嵌入式硬件·安全
GodKK老神灭4 小时前
STM32 CCR寄存器
stm32·单片机·嵌入式硬件
杰克逊的日记9 天前
MCU编程
单片机·嵌入式硬件
Python小老六9 天前
单片机测ntc热敏电阻的几种方法(软件)
数据库·单片机·嵌入式硬件
懒惰的bit9 天前
STM32F103C8T6 学习笔记摘要(四)
笔记·stm32·学习
HX科技10 天前
STM32给FPGA的外挂FLASH进行升级
stm32·嵌入式硬件·fpga开发·flash·fpga升级
Suagrhaha10 天前
驱动入门的进一步深入
linux·嵌入式硬件·驱动
国科安芯10 天前
基于ASP4644多通道降压技术在电力监测系统中集成应用与发展前景
嵌入式硬件·硬件架构·硬件工程
Li Zi10 天前
STM32 ADC(DMA)双缓冲采集+串口USART(DMA)直接传输12位原始数据到上位机显示并保存WAV格式音频文件 收藏住绝对实用!!!
经验分享·stm32·单片机·嵌入式硬件