實現的目標是利用藍牙模塊,實現手機與單片機通信,在手機上點擊按鈕,點亮單片機上面的小燈。
使用到的器件是HC05藍牙模塊,單片機(51或者stm32都可以),杜邦線若干。 手機端的調試工具為“藍牙串口助手app”
先稍微介紹一下HC05藍牙模塊,管腳如下:
HC05 藍牙串口模塊所有功能都是通過 AT 指令集控制,比較簡單,該部分使用的詳細信息,請參考 HC05 藍牙指令集。 今天主要是介紹建立通信的過程,對于模塊具體的一些其他方面的應用暫時不多說。
HC05 藍牙串口模塊有兩種狀態,一種是AT指令狀態,一種是連接狀態。 在AT指令狀態下,可以向模塊發送一些指令,退出AT狀態后,可以與藍牙設備比如手機建立連接。
進入AT 指令狀態有兩種方法:①上電同時/上電之前將 SET 腳設置為 VCC,上電后,模塊即進入 AT 指令 狀態。 ②模塊上電后,通過將SET 腳接 VCC,使模塊進入AT 狀態。 方法1進入AT 狀態后,模塊的波特率為:38400(8位數據位, 1位停止位)。 方法2進入 AT 狀態后,模塊波特率和通信波特率一致。 在編程中我們通過改變SET管腳電平來切換狀態。
從模塊管腳可以看出,它是利用串口通信的,所以,帶串口的單片機都可以作為主控芯片。 我們分別使用stm32和51單片機進行了驗證,完全是沒有問題的。
一、連線
根據管腳說明來與單片機連線,VCC接3.3V或5V都可以。 模塊發送管腳連單片機接收管腳,接收管腳連發送管腳,這個千萬要注意,SET腳隨便連一個IO口即可,STATE管腳可連可不連,不影響。
二、整體編程思路
藍牙模塊接收手機發送的信號,將信號通過串口發送給單片機,單片機接收到信號后,執行相應的操作。 如果要向模塊發送指令,通常是采用按鍵的方式,可以使用掃描按鍵,也可以使用外部中斷,按下按鍵就執行發送指令的程序,比如通過按鍵來切換模塊主從模式,修改密碼,修改波特率,修改名字等等。
涉及到的單片機部分主要是串口和定時器,串口用來向模塊發送指令或者接收來自外部的信號,定時器主要用來產生定時中斷,用來界定兩幀數據,比如約定接收的相鄰兩個字節時間間隔超過5ms,則認定為是兩幀數據,這個間隔是自定義的。
三、具體編程思路
1、串口部分
串口部分是整個最重要的一部分,大致要完成一下事情:
初始化串口,設置好串口的通信波特率,開啟串口中斷,編寫串口中斷函數。在串口中斷函數里面把接收的數據存入一個數組當中。編寫串口發送函數,用來向模塊發送指令。stm32有現成函數可以調用,51單片機要自己去編寫單字節的發送函數和字符串發送函數。
2、定時器部分
初始化定時器,設置好定時時間,使能中斷,在中斷函數里面關閉定時器(后面再解釋為什么)。
上面是我大致畫的一個思路圖。其實在整個過程當中,我們定義了一個全局變量sta,初始值為0,它有兩個作用,最高位用來標記一幀數據是否接收完成,為1表示一幀數據接收完成,為0相反。剩下的位用來記錄接收字節的個數。
我們來大致理一下思路:sta初始值為0,假設現在收到一串數據若干個字節,那么就會觸發串口中斷。第一個字節觸發中斷時,顯然sta為0,此時程序將定時器計數值清零,并且開啟定時器,然后sta+1,把數據存放在數組里面,表示接收到了一個數據,那么緊接著可能第二個字節也收到了,再次觸發中斷,這個時候因為sta為1,所以不必開啟定時器,只要把計數值清零即可,此時定時器仍在計時,只是因為你把計數值清零了,所以不會發生定時中斷,然后重復這樣的動作直到接收完最后一個字節。接收完最后一個字節后就不再觸發串口中斷,也就是不再將定時器清零,也就意味著會發生定時器中斷,而在定時器中斷函數里面,我們將sta最高位置1,表示一幀數據接收完成,同時關閉定時器。
這樣我們就可以把剛剛接收后存放在數組里的數據拿來用了,比如對接收的數據進行判斷,然后執行不同的操作。使用完之后一定要及時把sta清零,這樣進入串口中斷之后才會保存數據。
所以sta的最高位主要就是用來標記一幀數據是否接收完成。 當接收的兩個字節數據時間間隔超過了定時器設置的時間時,定時器中斷函數就會把它最高位置1,置1后串口中斷函數里面將不再保存后面接收的數據(認為這不是同一幀數據),使用完后把sta最高位及時清零,方便后面再次進入串口中斷并保存數據。
這個是接收部分。 對于發送部分來說就更簡單了,直接通過串口把數據發送至藍牙模塊即可。
另外需要注意的就是,使用51單片機要注意串口會占用一個定時器來產生波特率,所以要使用另一個定時器避免干擾。 經過實驗驗證,stm32接收一串字符時能夠很好的還原,而51單片機則容易丟失數據,可能是因為51單片機代碼執行速度太慢,接收一個字節之后還沒處理完就又來了一個數據,從而導致數據丟失,所以最好只發送一個字節。
總的來說,51的代碼會更簡單一些,但是51非常不方便調試,每次修改程序后都要重新燒錄,51單片機燒錄必須冷啟動,燒錄時還得把杜邦線拔了(至少要拔掉VCC才能燒錄進去),所以反復的修改程序和燒錄是一件非常麻煩的事情。 當然,在考慮成本的清空下,同樣都能完成功能,肯定是選擇51了。
-
單片機
+關注
關注
6032文章
44525瀏覽量
633260 -
通信
+關注
關注
18文章
5977瀏覽量
135871 -
STM32
+關注
關注
2266文章
10876瀏覽量
354927 -
編程
+關注
關注
88文章
3596瀏覽量
93610 -
藍牙模塊
+關注
關注
30文章
565瀏覽量
55694
發布評論請先 登錄
相關推薦
評論