一 前言
? 上一篇我們已經成功實現單片機和電腦的連接,接下來,我們學習一個有趣的板塊,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 位,無校驗位
注意事項:
以上大家按照步驟進行寫就好,在這里有幾個問題要給大家說明一下:
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藍牙 | 單片機 |
RXD | PA2 |
TXD | PA3 |
GND | GND |
VCC | 5V |
六 手機APP
1 我們需要在手機上下載一個“藍牙調試助手”,這個app軟件的廣告比較多(哈哈)
?2 點開之后搜索你的藍牙,點添加新的藍牙,然后搜索到你創建的藍牙就可以了
?3 隨后我們進入到一個界面,我們點界面調試
?4 然后我們點下方的組件
?5 選擇switch,也就是開關的意思
?6 隨后我們將他的屬性配置好,如下圖,切記哈,畫紅框的一定要改成GBK形式,GBK是發送漢字的編碼,大家記住就好,感興趣的自己查閱GBK什么意思。反正選成GBK就對了。
然后,該項目就創立好啦,實現相應效果的視頻我已放到我主頁的視頻部分,大家可以自行翻看最終效果