1. 程式人生 > >HC-05藍芽模組連線STC89C52微控制器控制LED燈

HC-05藍芽模組連線STC89C52微控制器控制LED燈

**首先宣告我用的是52微控制器,板子型號為HC6800-ES V2.0;如果
非同型別,實現不了,概不認賬。**
要實現這個玩法,首先得掌握串列埠通訊的知識,不需要太多,只要知道如何接收/傳送資料就行。
序列通訊:
按照資料傳送方向分為:
*單工
資料傳輸只支援資料在一個方向上傳輸。
*半雙工
允許資料在兩個方向上傳輸,但是,在某一時刻,只允許資料在一個方向上傳輸,它實際上是一種切換方向的單工通訊。
*全雙工
允許資料同時在兩個方向上傳輸,因此,全雙工通訊是兩個單工通訊方式的結合,它要求傳送裝置和接收裝置都有獨立的接收和傳送能力。
通訊方式:


*同步通訊:
帶時鐘同步訊號傳輸。 SPI,IIC通訊介面。
*非同步通訊:
不帶時鐘同步通訊。 UART(通用非同步收發器),單匯流排。
串列埠通訊:(簡單介紹)
同步通訊:簡單來說,同步通訊是一種位元(bit)同步通訊技術,要求發收雙方具有同頻同相的同步時鐘訊號,只需在傳送報文的最前面附加特定的同步字元,使發收雙方建立同步,此後便在同步時鐘的控制下逐位傳送/接收。但這時還有兩種不同的同步方式.一種是使用全網同步,用一個非常精確的主時鐘對全網所有結點上的時鐘進行同步.另一種是使用準同步,各結點的時鐘之間允許有微小的誤差,然後採用其他措施實現同步傳輸。
非同步通訊:非同步通訊在傳送字元時,所傳送的字元之間的時隙可以是任意的。但是接收端必須時刻做好接收的準備(如果接收端主機的電源都沒有加上,那麼傳送端傳送字元就沒有意義,因為接收端根本無法接收)。傳送端可以在任意時刻開始傳送字元,因此必須在每一個字元的開始和結束的地方加上標誌,即加上開始位
停止位,以便使接收端能夠正確地將每一個字元接收下來。非同步通訊的好處是通訊裝置簡單、便宜,但傳輸效率較低(因為開始位和停止位的開銷所佔比例較大,每幀之間還有間隔)。
先來看一下過程圖:
這裡寫圖片描述
有兩個物理上獨立的接收,傳送緩衝器SBUF,它們佔用同一個地址99H;接收器是雙緩衝結構。傳送緩衝器:因為傳送時CPU是主動的,所以不會產生重疊錯誤。
TXD和RXD:T 代表 Transmit(傳送)
R 代表 Receive(接收)
X 代表要交叉,也就是說A方的TX接B方的RX、B方的TX接A方的RX。
序列通訊的資料結構:
這裡寫圖片描述

起始位+資料位(資料的最低位,8位或9位看工作方式,資料的最高位)+校驗位+停止位
工作方式暫存器SCON:
這裡寫圖片描述
*RI:接收中斷標誌位
接受結束時,會由硬體置1,向CPU發出中斷請求。(要由軟體復位)
*TI:傳送中斷標誌位
傳送結束時,會由硬體置1,向CPU發出中斷請求。(要由軟體復位)
*TB8:用來存放傳送的第9位
*RB8:用來存放接收的第9位。
*REN:是序列接收允許位
0時:禁止序列接收
1時:允許序列接收
序列口的工作方式:
這裡寫圖片描述
SM2:多機通訊控制位
* 因為多級通訊控制是在工作方式2和工作方式3下進行的,因此SM2主要是用在工作方式2和工作方式3。
當SM2=0時:不論接收的第9位是0還是1,都接收資料產生中斷。當SM1=1時:只有在接收到第9位為1時,才接收資料,併產生中斷:
而如果接收到的第9位為0 時,則將接收到的資料丟棄,不產生中斷。
工作方式暫存器PCON:
這裡寫圖片描述
要注意的是:PCON是沒有位定址的,也就是說不能直接操作,SMOD是直接操作PCON暫存器
*SMOD:是波特率是否加倍的選擇位。
0時:波特率不加倍。
1時:波特率加倍。
波特率的概念
* 波特率的定義是:序列口每秒鐘傳送的位數稱為波特率。
比如說2400的波特率就是每秒鐘傳送2400個位數。
* 序列口的波特率是定時器T1作為波特率發生器的,這時定時器設定在工作方式2(可自動重灌初值)
* 波特率=(2*SMOD)/32*定時器T1的溢位率 (當SMOD是0(2*SMOD)=1,為1時值為2)
* 定時器T1的溢位率=微控制器內部時鐘頻率/(256-X) X是定時器的初值
* 波特率=(2*SMOD)/32*(微控制器內部時鐘頻率/(256-X))
串列埠的操作步驟:
*先設定波特率:
設定定時器T1為工作方式工作方式2(設定TMOD暫存器)
給計數器賦初值(工作方式會自動重灌)
*設定串列埠的工作方式
*設定SCON(如果允許)
*如果使用中斷方式,那麼開啟相應的中斷和總中斷。
*開啟定時器T1,開始產生波特率

void UsartConfiguration()
{
    SCON=0X50;          //設定為工作方式1
    TMOD=0X20;          //設定計數器工作方式2
    PCON=0X80;          //波特率加倍
    TH1=0XF3;           //計數器初始值設定,注意波特率是4800的
    TL1=0XF3;
    ES=1;               //開啟接收中斷
    EA=1;               //開啟總中斷
    TR1=1;              //開啟計數器1
}

下面介紹一下HC-05 藍芽模組:
引用一句話“模組就是拿來用的”。作為初學者剛開始拿到這個東西,也是很懵逼的,在網上找資料,看到這句話,覺得很有道理,這些新的事物對我們來說就是拿來用的,不用擔心,不要畏懼,即使多走點彎路也是值得的。前行的路上有了這些才顯得彌足珍貴!
說正事吧!首先可以看一下我分享的這個資料,對藍芽模組有個初步瞭解。連結:http://pan.baidu.com/s/1bpF2Z5H 密碼:uk88。(補充一下,進入AT指令模式,我的做法是:按住按鍵,然後再給它上電,慢閃就代表進入AT模式了,接線要用USB 轉TTL)用一個簡單的例子來解釋一下這個模組吧,我們可以把它當作一個傳話者,我們發訊息給她,她就把訊息傳給MCU,MCU再去執行相應的操作。
微控制器接線是3.0和3.1,記得TX和RX是交叉接線!
下面附上程式碼:

#include<reg52.h>
#define uchar unsigned char
uchar receiveData;
sbit led = P0^0;
sbit led2 = P0^1;
void UsartConfiguration();
void main()
{
        UsartConfiguration();
        led = 0;
        led2 = 0;                         //檢測是否接收到字元,即是否進入序列口中斷
        TI = 0;
        while(1)
        {
                if(receiveData == 'A')
               led = 1;                //點亮
                if(receiveData == 'B')
                   led = 0;                //熄滅
        }
}
void UsartConfiguration()
{
        SCON=0X50;                        //設定為工作方式1
        TMOD=0X20;                        //設定計數器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                         //計數器初始值設定,注意波特率是4800的(晶振為12.0MHz)
        TL1=0XF3;
        ES=1;                             //開啟接收中斷
        EA=1;                             //開啟總中斷
        TR1=1;                            //開啟計數器1
}

void Usart() interrupt 4                        //序列口中斷,為什麼是4可以參考上一篇中斷的文章
{
    receiveData=SBUF;                      //出去接收到的資料
        RI = 0;                                //清除接收中斷標誌位
        SBUF=receiveData;                      //將接收到的資料放入到傳送暫存器
        while(!TI);                            //等待發送資料完成
        TI=0;                                  //清除傳送完成標誌位
} 

忘了一點:還需要下載一個手機APP,“藍芽串列埠”這一類的APP,提醒一下,有的APP是不能用的,並非程式碼問題。
好了,,先說到這裡,繼續前行!