今天分享一個(gè)實(shí)踐項(xiàng)目——HC05藍(lán)牙模塊的編程。
實(shí)現(xiàn)的目標(biāo)是利用藍(lán)牙模塊,實(shí)現(xiàn)手機(jī)與單片機(jī)通信,在手機(jī)上點(diǎn)擊按鈕,點(diǎn)亮單片機(jī)上面的小燈。
使用到的器件是HC05藍(lán)牙模塊,單片機(jī)(51或者stm32都可以),杜邦線若干。 手機(jī)端的調(diào)試工具為“藍(lán)牙串口助手app”


先稍微介紹一下HC05藍(lán)牙模塊,管腳如下:

HC05 藍(lán)牙串口模塊所有功能都是通過(guò) AT 指令集控制,比較簡(jiǎn)單,該部分使用的詳細(xì)信息,請(qǐng)參考 HC05 藍(lán)牙指令集。 今天主要是介紹建立通信的過(guò)程,對(duì)于模塊具體的一些其他方面的應(yīng)用暫時(shí)不多說(shuō)。
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)有兩種方法:①上電同時(shí)/上電之前將 SET 腳設(shè)置為 VCC,上電后,模塊即進(jìn)入 AT 指令 狀態(tài)。 ②模塊上電后,通過(guò)將SET 腳接 VCC,使模塊進(jìn)入AT 狀態(tài)。 方法1進(jìn)入AT 狀態(tài)后,模塊的波特率為:38400(8位數(shù)據(jù)位, 1位停止位)。 方法2進(jìn)入 AT 狀態(tài)后,模塊波特率和通信波特率一致。 在編程中我們通過(guò)改變SET管腳電平來(lái)切換狀態(tài)。
從模塊管腳可以看出,它是利用串口通信的,所以,帶串口的單片機(jī)都可以作為主控芯片。 我們分別使用stm32和51單片機(jī)進(jìn)行了驗(yàn)證,完全是沒(méi)有問(wèn)題的。
一、連線
根據(jù)管腳說(shuō)明來(lái)與單片機(jī)連線,VCC接3.3V或5V都可以。 模塊發(fā)送管腳連單片機(jī)接收管腳,接收管腳連發(fā)送管腳,這個(gè)千萬(wàn)要注意,SET腳隨便連一個(gè)IO口即可,STATE管腳可連可不連,不影響。
二、整體編程思路
藍(lán)牙模塊接收手機(jī)發(fā)送的信號(hào),將信號(hào)通過(guò)串口發(fā)送給單片機(jī),單片機(jī)接收到信號(hào)后,執(zhí)行相應(yīng)的操作。 如果要向模塊發(fā)送指令,通常是采用按鍵的方式,可以使用掃描按鍵,也可以使用外部中斷,按下按鍵就執(zhí)行發(fā)送指令的程序,比如通過(guò)按鍵來(lái)切換模塊主從模式,修改密碼,修改波特率,修改名字等等。
涉及到的單片機(jī)部分主要是串口和定時(shí)器,串口用來(lái)向模塊發(fā)送指令或者接收來(lái)自外部的信號(hào),定時(shí)器主要用來(lái)產(chǎn)生定時(shí)中斷,用來(lái)界定兩幀數(shù)據(jù),比如約定接收的相鄰兩個(gè)字節(jié)時(shí)間間隔超過(guò)5ms,則認(rèn)定為是兩幀數(shù)據(jù),這個(gè)間隔是自定義的。
三、具體編程思路
1、串口部分
串口部分是整個(gè)最重要的一部分,大致要完成一下事情:
初始化串口,設(shè)置好串口的通信波特率,開啟串口中斷,編寫串口中斷函數(shù)。在串口中斷函數(shù)里面把接收的數(shù)據(jù)存入一個(gè)數(shù)組當(dāng)中。編寫串口發(fā)送函數(shù),用來(lái)向模塊發(fā)送指令。stm32有現(xiàn)成函數(shù)可以調(diào)用,51單片機(jī)要自己去編寫單字節(jié)的發(fā)送函數(shù)和字符串發(fā)送函數(shù)。
2、定時(shí)器部分
初始化定時(shí)器,設(shè)置好定時(shí)時(shí)間,使能中斷,在中斷函數(shù)里面關(guān)閉定時(shí)器(后面再解釋為什么)。

上面是我大致畫的一個(gè)思路圖。其實(shí)在整個(gè)過(guò)程當(dāng)中,我們定義了一個(gè)全局變量sta,初始值為0,它有兩個(gè)作用,最高位用來(lái)標(biāo)記一幀數(shù)據(jù)是否接收完成,為1表示一幀數(shù)據(jù)接收完成,為0相反。剩下的位用來(lái)記錄接收字節(jié)的個(gè)數(shù)。
我們來(lái)大致理一下思路:sta初始值為0,假設(shè)現(xiàn)在收到一串?dāng)?shù)據(jù)若干個(gè)字節(jié),那么就會(huì)觸發(fā)串口中斷。第一個(gè)字節(jié)觸發(fā)中斷時(shí),顯然sta為0,此時(shí)程序?qū)⒍〞r(shí)器計(jì)數(shù)值清零,并且開啟定時(shí)器,然后sta+1,把數(shù)據(jù)存放在數(shù)組里面,表示接收到了一個(gè)數(shù)據(jù),那么緊接著可能第二個(gè)字節(jié)也收到了,再次觸發(fā)中斷,這個(gè)時(shí)候因?yàn)閟ta為1,所以不必開啟定時(shí)器,只要把計(jì)數(shù)值清零即可,此時(shí)定時(shí)器仍在計(jì)時(shí),只是因?yàn)槟惆延?jì)數(shù)值清零了,所以不會(huì)發(fā)生定時(shí)中斷,然后重復(fù)這樣的動(dòng)作直到接收完最后一個(gè)字節(jié)。接收完最后一個(gè)字節(jié)后就不再觸發(fā)串口中斷,也就是不再將定時(shí)器清零,也就意味著會(huì)發(fā)生定時(shí)器中斷,而在定時(shí)器中斷函數(shù)里面,我們將sta最高位置1,表示一幀數(shù)據(jù)接收完成,同時(shí)關(guān)閉定時(shí)器。
這樣我們就可以把剛剛接收后存放在數(shù)組里的數(shù)據(jù)拿來(lái)用了,比如對(duì)接收的數(shù)據(jù)進(jìn)行判斷,然后執(zhí)行不同的操作。使用完之后一定要及時(shí)把sta清零,這樣進(jìn)入串口中斷之后才會(huì)保存數(shù)據(jù)。
所以sta的最高位主要就是用來(lái)標(biāo)記一幀數(shù)據(jù)是否接收完成。 當(dāng)接收的兩個(gè)字節(jié)數(shù)據(jù)時(shí)間間隔超過(guò)了定時(shí)器設(shè)置的時(shí)間時(shí),定時(shí)器中斷函數(shù)就會(huì)把它最高位置1,置1后串口中斷函數(shù)里面將不再保存后面接收的數(shù)據(jù)(認(rèn)為這不是同一幀數(shù)據(jù)),使用完后把sta最高位及時(shí)清零,方便后面再次進(jìn)入串口中斷并保存數(shù)據(jù)。
這個(gè)是接收部分。 對(duì)于發(fā)送部分來(lái)說(shuō)就更簡(jiǎn)單了,直接通過(guò)串口把數(shù)據(jù)發(fā)送至藍(lán)牙模塊即可。
另外需要注意的就是,使用51單片機(jī)要注意串口會(huì)占用一個(gè)定時(shí)器來(lái)產(chǎn)生波特率,所以要使用另一個(gè)定時(shí)器避免干擾。 經(jīng)過(guò)實(shí)驗(yàn)驗(yàn)證,stm32接收一串字符時(shí)能夠很好的還原,而51單片機(jī)則容易丟失數(shù)據(jù),可能是因?yàn)?1單片機(jī)代碼執(zhí)行速度太慢,接收一個(gè)字節(jié)之后還沒(méi)處理完就又來(lái)了一個(gè)數(shù)據(jù),從而導(dǎo)致數(shù)據(jù)丟失,所以最好只發(fā)送一個(gè)字節(jié)。
總的來(lái)說(shuō),51的代碼會(huì)更簡(jiǎn)單一些,但是51非常不方便調(diào)試,每次修改程序后都要重新燒錄,51單片機(jī)燒錄必須冷啟動(dòng),燒錄時(shí)還得把杜邦線拔了(至少要拔掉VCC才能燒錄進(jìn)去),所以反復(fù)的修改程序和燒錄是一件非常麻煩的事情。 當(dāng)然,在考慮成本的清空下,同樣都能完成功能,肯定是選擇51了。
-
單片機(jī)
+關(guān)注
關(guān)注
6076文章
45495瀏覽量
670285 -
通信
+關(guān)注
關(guān)注
18文章
6391瀏覽量
140038 -
STM32
+關(guān)注
關(guān)注
2309文章
11162瀏覽量
373417 -
編程
+關(guān)注
關(guān)注
90文章
3716瀏覽量
97184 -
藍(lán)牙模塊
+關(guān)注
關(guān)注
30文章
662瀏覽量
57855
發(fā)布評(píng)論請(qǐng)先 登錄
請(qǐng)問(wèn)安卓手機(jī)怎么與HC05藍(lán)牙模塊通信?
藍(lán)牙HC05是什么?hc05藍(lán)牙模塊如何使用
HC05藍(lán)牙手冊(cè),藍(lán)牙的調(diào)試手冊(cè)
hc05和hc06有什么不同_hc05和hc06區(qū)別
hc05藍(lán)牙模塊如何使用_兩個(gè)hc05藍(lán)牙模塊配對(duì)
HC05藍(lán)牙串口模塊的原理圖和源代碼配套軟件及實(shí)驗(yàn)說(shuō)明
嵌入式單片機(jī)基礎(chǔ)篇(二十八)之藍(lán)牙模塊HC05與BT05 AT指令
HC05 藍(lán)牙模塊 連接 ESP32 經(jīng)典藍(lán)牙
HC05藍(lán)牙開源項(xiàng)目
HC05藍(lán)牙模塊編程實(shí)例
評(píng)論