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-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指令,但是后面要進行藍牙串口傳輸數據的時候,要快一點,我們把波特率設置高一點就會更加的高效快捷,這是一種良好的習慣

2?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…