實現(xiàn)的目標(biāo)是利用藍(lán)牙模塊,實現(xiàn)手機(jī)與單片機(jī)通信,在手機(jī)上點擊按鈕,點亮單片機(jī)上面的小燈。
使用到的器件是HC05藍(lán)牙模塊,單片機(jī)(51或者stm32都可以),杜邦線若干。 手機(jī)端的調(diào)試工具為“藍(lán)牙串口助手app”
先稍微介紹一下HC05藍(lán)牙模塊,管腳如下:
HC05 藍(lán)牙串口模塊所有功能都是通過 AT 指令集控制,比較簡單,該部分使用的詳細(xì)信息,請參考 HC05 藍(lán)牙指令集。 今天主要是介紹建立通信的過程,對于模塊具體的一些其他方面的應(yīng)用暫時不多說。
HC05 藍(lán)牙串口模塊有兩種狀態(tài),一種是AT指令狀態(tài),一種是連接狀態(tài)。 在AT指令狀態(tài)下,可以向模塊發(fā)送一些指令,退出AT狀態(tài)后,可以與藍(lán)牙設(shè)備比如手機(jī)建立連接。
進(jìn)入AT 指令狀態(tài)有兩種方法:①上電同時/上電之前將 SET 腳設(shè)置為 VCC,上電后,模塊即進(jìn)入 AT 指令 狀態(tài)。 ②模塊上電后,通過將SET 腳接 VCC,使模塊進(jìn)入AT 狀態(tài)。 方法1進(jìn)入AT 狀態(tài)后,模塊的波特率為:38400(8位數(shù)據(jù)位, 1位停止位)。 方法2進(jìn)入 AT 狀態(tài)后,模塊波特率和通信波特率一致。 在編程中我們通過改變SET管腳電平來切換狀態(tài)。
從模塊管腳可以看出,它是利用串口通信的,所以,帶串口的單片機(jī)都可以作為主控芯片。 我們分別使用stm32和51單片機(jī)進(jìn)行了驗證,完全是沒有問題的。
一、連線
根據(jù)管腳說明來與單片機(jī)連線,VCC接3.3V或5V都可以。 模塊發(fā)送管腳連單片機(jī)接收管腳,接收管腳連發(fā)送管腳,這個千萬要注意,SET腳隨便連一個IO口即可,STATE管腳可連可不連,不影響。
二、整體編程思路
藍(lán)牙模塊接收手機(jī)發(fā)送的信號,將信號通過串口發(fā)送給單片機(jī),單片機(jī)接收到信號后,執(zhí)行相應(yīng)的操作。 如果要向模塊發(fā)送指令,通常是采用按鍵的方式,可以使用掃描按鍵,也可以使用外部中斷,按下按鍵就執(zhí)行發(fā)送指令的程序,比如通過按鍵來切換模塊主從模式,修改密碼,修改波特率,修改名字等等。
涉及到的單片機(jī)部分主要是串口和定時器,串口用來向模塊發(fā)送指令或者接收來自外部的信號,定時器主要用來產(chǎn)生定時中斷,用來界定兩幀數(shù)據(jù),比如約定接收的相鄰兩個字節(jié)時間間隔超過5ms,則認(rèn)定為是兩幀數(shù)據(jù),這個間隔是自定義的。
三、具體編程思路
1、串口部分
串口部分是整個最重要的一部分,大致要完成一下事情:
初始化串口,設(shè)置好串口的通信波特率,開啟串口中斷,編寫串口中斷函數(shù)。在串口中斷函數(shù)里面把接收的數(shù)據(jù)存入一個數(shù)組當(dāng)中。編寫串口發(fā)送函數(shù),用來向模塊發(fā)送指令。stm32有現(xiàn)成函數(shù)可以調(diào)用,51單片機(jī)要自己去編寫單字節(jié)的發(fā)送函數(shù)和字符串發(fā)送函數(shù)。
2、定時器部分
初始化定時器,設(shè)置好定時時間,使能中斷,在中斷函數(shù)里面關(guān)閉定時器(后面再解釋為什么)。
上面是我大致畫的一個思路圖。其實在整個過程當(dāng)中,我們定義了一個全局變量sta,初始值為0,它有兩個作用,最高位用來標(biāo)記一幀數(shù)據(jù)是否接收完成,為1表示一幀數(shù)據(jù)接收完成,為0相反。剩下的位用來記錄接收字節(jié)的個數(shù)。
我們來大致理一下思路:sta初始值為0,假設(shè)現(xiàn)在收到一串?dāng)?shù)據(jù)若干個字節(jié),那么就會觸發(fā)串口中斷。第一個字節(jié)觸發(fā)中斷時,顯然sta為0,此時程序?qū)⒍〞r器計數(shù)值清零,并且開啟定時器,然后sta+1,把數(shù)據(jù)存放在數(shù)組里面,表示接收到了一個數(shù)據(jù),那么緊接著可能第二個字節(jié)也收到了,再次觸發(fā)中斷,這個時候因為sta為1,所以不必開啟定時器,只要把計數(shù)值清零即可,此時定時器仍在計時,只是因為你把計數(shù)值清零了,所以不會發(fā)生定時中斷,然后重復(fù)這樣的動作直到接收完最后一個字節(jié)。接收完最后一個字節(jié)后就不再觸發(fā)串口中斷,也就是不再將定時器清零,也就意味著會發(fā)生定時器中斷,而在定時器中斷函數(shù)里面,我們將sta最高位置1,表示一幀數(shù)據(jù)接收完成,同時關(guān)閉定時器。
這樣我們就可以把剛剛接收后存放在數(shù)組里的數(shù)據(jù)拿來用了,比如對接收的數(shù)據(jù)進(jìn)行判斷,然后執(zhí)行不同的操作。使用完之后一定要及時把sta清零,這樣進(jìn)入串口中斷之后才會保存數(shù)據(jù)。
所以sta的最高位主要就是用來標(biāo)記一幀數(shù)據(jù)是否接收完成。 當(dāng)接收的兩個字節(jié)數(shù)據(jù)時間間隔超過了定時器設(shè)置的時間時,定時器中斷函數(shù)就會把它最高位置1,置1后串口中斷函數(shù)里面將不再保存后面接收的數(shù)據(jù)(認(rèn)為這不是同一幀數(shù)據(jù)),使用完后把sta最高位及時清零,方便后面再次進(jìn)入串口中斷并保存數(shù)據(jù)。
這個是接收部分。 對于發(fā)送部分來說就更簡單了,直接通過串口把數(shù)據(jù)發(fā)送至藍(lán)牙模塊即可。
另外需要注意的就是,使用51單片機(jī)要注意串口會占用一個定時器來產(chǎn)生波特率,所以要使用另一個定時器避免干擾。 經(jīng)過實驗驗證,stm32接收一串字符時能夠很好的還原,而51單片機(jī)則容易丟失數(shù)據(jù),可能是因為51單片機(jī)代碼執(zhí)行速度太慢,接收一個字節(jié)之后還沒處理完就又來了一個數(shù)據(jù),從而導(dǎo)致數(shù)據(jù)丟失,所以最好只發(fā)送一個字節(jié)。
總的來說,51的代碼會更簡單一些,但是51非常不方便調(diào)試,每次修改程序后都要重新燒錄,51單片機(jī)燒錄必須冷啟動,燒錄時還得把杜邦線拔了(至少要拔掉VCC才能燒錄進(jìn)去),所以反復(fù)的修改程序和燒錄是一件非常麻煩的事情。 當(dāng)然,在考慮成本的清空下,同樣都能完成功能,肯定是選擇51了。
-
單片機(jī)
+關(guān)注
關(guān)注
6043文章
44622瀏覽量
638533 -
通信
+關(guān)注
關(guān)注
18文章
6070瀏覽量
136424 -
STM32
+關(guān)注
關(guān)注
2272文章
10923瀏覽量
357559 -
編程
+關(guān)注
關(guān)注
88文章
3637瀏覽量
93981 -
藍(lán)牙模塊
+關(guān)注
關(guān)注
30文章
578瀏覽量
55886
發(fā)布評論請先 登錄
相關(guān)推薦
請問安卓手機(jī)怎么與HC05藍(lán)牙模塊通信?
藍(lán)牙HC05是什么?hc05藍(lán)牙模塊如何使用
hc05和hc06有什么不同_hc05和hc06區(qū)別
![<b class='flag-5'>hc05</b>和<b class='flag-5'>hc</b>06有什么不同_<b class='flag-5'>hc05</b>和<b class='flag-5'>hc</b>06區(qū)別](https://file1.elecfans.com//web2/M00/A7/27/wKgZomUMQrKAaLvjAABhTjSFQDU785.png)
hc05藍(lán)牙模塊如何使用_兩個hc05藍(lán)牙模塊配對
HC05主從機(jī)一體藍(lán)牙模塊資料合集免費下載
![<b class='flag-5'>HC05</b>主從機(jī)一體<b class='flag-5'>藍(lán)牙</b><b class='flag-5'>模塊</b>資料合集免費下載](https://file.elecfans.com/web1/M00/91/6D/pIYBAFzP_CKASjiTAAEv9vRe4OQ306.png)
HC05藍(lán)牙串口模塊的原理圖和源代碼配套軟件及實驗說明
![<b class='flag-5'>HC05</b><b class='flag-5'>藍(lán)牙</b>串口<b class='flag-5'>模塊</b>的原理圖和源代碼配套軟件及實驗說明](https://file.elecfans.com/web1/M00/B8/67/pIYBAF5xf6uAKt7LAAGpwe8zCCc338.png)
嵌入式單片機(jī)基礎(chǔ)篇(二十八)之藍(lán)牙模塊HC05與BT05 AT指令
![嵌入式單片機(jī)基礎(chǔ)篇(二十八)之<b class='flag-5'>藍(lán)牙</b><b class='flag-5'>模塊</b><b class='flag-5'>HC05</b>與BT<b class='flag-5'>05</b> AT指令](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
HC05 藍(lán)牙模塊 連接 ESP32 經(jīng)典藍(lán)牙
![<b class='flag-5'>HC05</b> <b class='flag-5'>藍(lán)牙</b><b class='flag-5'>模塊</b> 連接 ESP32 經(jīng)典<b class='flag-5'>藍(lán)牙</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論