一 前言

  上一篇我们已经成功实现单片机和电脑的连接,接下来,我们学习一个有趣的板块,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-05USB转串口
EN3.3V
RXDTXD
TXDRXD
VCC5V
GNDGND

在蓝牙上面的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指令,但是后面要进行蓝牙串口传输数据的时候,要快一点,我们把波特率设置高一点就会更加的高效快捷,这是一种良好的习惯

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

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

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

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

四 按步骤写代码

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

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 
//当你的设备需要从外部接收数据,则用RXNENVIC_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函数,添加如下代码

#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蓝牙单片机
RXDPA2
TXDPA3
GNDGND
VCC5V

六 手机APP

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

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

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

 4 然后我们点下方的组件

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84855.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84855.shtml
英文地址,请注明出处:http://en.pswp.cn/web/84855.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Verilog】Verilator的TestBench该用C++还是SystemC

Verilator的Testbench(测试平台)主要使用 C 或 SystemC 来编写。这是由Verilator的工作原理决定的:它将你的Verilog/SystemVerilog设计转换成一个C类,因此你需要一个C环境来实例化和驱动这个类。 下面详细说明这两种方式以及如何…

71-Oracle Undo与Flashback管理(Guarantee设置)深度解析

小伙伴们有没有在操作undo表空间、Flashback管理,时间保留设置,总有些配置需要提前预置好,否则闪回查询和表的时候出现报错。 需短期恢复(秒级~小时)直接上UNDO_RETENTION同时启用RETENTION GUARANTEE,Und…

单片机——浮点数转换4位数码管显示

浮点数转换4位数码管显示 static char buffer[5]; int DecimalPlace 0; #define HideChar h void DisplayFloatOn4LED(float value) {long integer roundf(value );if (integer > 9999) //4位{integer 9999;snprintf(buffer, sizeof(buffer), "%4ld", integer…

金融行业B端系统布局实战:风险管控与数据可视化的定制方案

摘要 在金融行业,一次小小的数据泄露可能引发千万级资金损失,一次错误的风险评估或许让企业陷入危机。传统 B 端系统布局在应对复杂多变的金融业务时,常出现风险预警滞后、数据杂乱无章的情况,让从业者如履薄冰。如何才能在瞬息万…

融合LSTM与自注意力机制的多步光伏功率预测新模型解析

这篇论文《Improved multistep ahead photovoltaic power prediction model based on LSTM and self-attention with weather forecast data》(2024, Applied Energy)聚焦在 多步光伏功率预测 中,如何结合 LSTM 与自注意力机制(se…

Blazor-内置输入组件

封装的输入组件 InputCheckbox:表示复选框。InputDate:表示类型为 date 的日期选择框。InputFile:表示文件上传。InputNumber:表示数字框。InputRadio:表示单选按钮。InputRadioGroup:表示单选按钮组。Inpu…

Qt源码分析: QChildEvent

本文记录QChildEvent事件相关代码分析。 注1:限于笔者研究水平,难免有表述不当,欢迎批评指正。 注2:博文会不定期更新,敬请关注。 一、QChildEvent的发送 分析QObject::setParent代码,当修改父对象时&…

《Whisper :说明书 》

[论文] [模型卡] [Colab 示例] Whisper 是一种通用的语音识别模型。它基于各种音频的大型数据集进行训练,也是一种多任务模型,可以执行多语言语音识别、语音翻译和语言识别。 方法 Transformer 序列到序列模型针对各种语音处理任务进行训练,…

回溯----8.N皇后

题目链接 /** 将n个棋子放在n*n的棋盘上,不同列,不同行,不同斜线 大致执行流程: 首先选取第一行第一格放置第一个棋子,再从第二行第一个位置开始选取合法的位置(不同行不同列不同斜线)放置棋子,重复上述流程迭代行数, 直到放置n个棋子。 若放置途中出现无合法位置的情况,回溯将…

微机电子拉伸试验机

对于不同材料的试样,由于其化学成分及组织的不同,在拉伸过程中会体现 出不同的物理现象及力学性质。西安力创(LETRY)公司专业制造WDL/WDW系列微机控制电子万能试验机,主要适用于金属板材、棒材、管材、金属丝、金属箔、…

【数据结构与算法】数据结构核心概念系统梳理

第一章 绪论:基础概念体系 🚩算法:问题求解步骤的描述。 🚩非递归的算法效率更高。 1.1 逻辑结构 vs 存储结构 维度逻辑结构存储结构(物理结构)定义数据元素之间的逻辑关系数据结构在计算机中的实现方式分类线性/树形/图/集合顺序/链式/索引/散列独立性独立于存储结构…

73页PPT | 大数据平台规划与数据价值挖掘应用咨询项目解决方案

推荐摘要:在数字化浪潮中,企业数据量呈几何级增长,却常因缺乏科学规划的大数据平台,陷入数据孤岛、处理效率低下的困境,难以充分挖掘数据价值。特推出大数据平台规划与数据价值挖掘应用咨询项目解决方案,正…

gRPC 与 Protobuf 的深度集成 —— 从服务定义到多语言交互(Go + Java 示例)

在前几篇文章中,我们已经掌握了 Protobuf 的基础语法、高级特性和序列化反序列化操作。本篇文章将深入讲解 gRPC 与 Protobuf 的集成,重点介绍如何通过 .proto 文件定义服务接口,并在 Go 和 Java 中实现 gRPC 服务与客户端的完整交互流程。我…

可信计算的基石:TPM技术深度解析与应用实践

可信计算的基石:TPM技术深度解析与应用实践 引言:数字世界的"信任之锚" 在数据泄露事件频发的时代,传统软件级安全防护已力不从心。TPM(可信平台模块)作为硬件级安全解决方案,正成为现代计算设…

「ECG信号处理——(18)基于时空特征的心率变异性分析」2025年6月23日

一、HRV概述 心率变异性(Heart rate variability ,HRV)分析是通过测量分析连续正常R-R间期的时间变化来反映心率的变化程度的,根据计算RR 序列的统计指标,或者是画出RR间期的直方图和散点图来反映HRV的大小情况。下面我们从男性与…

【学习笔记】深入理解Java虚拟机学习笔记——第10章 前端编译与优化

第10章 前端编译与优化 10.1 概述 1>前端编译器:Javac命令。 【.java文件->.class文件】 2>即时编译器:Hotspot.C1.C2 【.class文件->机器码】 3>提前编译器:JDK的Jaotc等【.java->机器码】 10.2 Javac 编译器 10.2.1 …

Python 区块链与Web3开发指南

https://www.python.org/static/community_logos/python-logo-master-v3-TM.png 区块链基础概念 区块链核心特性 python 复制 下载 class Block:def __init__(self, index, timestamp, data, previous_hash):self.index indexself.timestamp timestampself.data datas…

工业智能体调参闭环:从物料感知到智慧工艺的落地路径

用户定义目标:智能工艺的起点不是机器,而是人 在智能制造系统中,工艺调优的第一步并非直接依赖AI或自动化设备,而是始于用户的明确输入。用户需要在系统中定义产品的工艺要求,包括目标尺寸与规格(如长宽高…

【Linux学习笔记】进程间通信之共享内存

【Linux学习笔记】进程间通信之共享内存 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 文章目录 【Linux学习笔记】进程间通信之共享内存前言一. system V共享内存1.1 共享内存数据结构1.2 共享内存函数1.3 共享内存实现通信…

郭碧婷闯入女团赛道 与刘忻张予曦蔡诗芸组成ROLLING SISTERS

近日,郭碧婷与刘忻、张予曦、蔡诗芸组成的女团ROLLING SISTERS正式官宣,并发布《Rolling Life》《Alpha》两首单曲! 此次几位姐姐的组合让大家眼前一亮,尤其是郭碧婷造型颠覆以往。银灰色挑染短发搭配棱角分明的黑色烟熏妆&#x…