一、藍牙模塊
藍牙選用【HC-05主從機一體藍牙模塊 無線藍牙串口透傳 無線模塊 電子模塊】,淘寶鏈接地址為:https://detail.tmall.com/item.htm?id=41281471872&spm=a1z09.2.0.0.u7iKss&_u=m10qactucc9f
二、手機端APP
手機端藍牙串口調試助手,如圖一所示:
圖一
用手機數據線連接手機,下載上圖所示【藍牙串口調試助手】。下載完畢后,打開手機APP,如圖二所示:
圖二 圖三
三、原理介紹
1、串口的概念
首先,我們應該知道,什么叫串口?然后再次解釋什么叫藍牙串口。所謂串口,在很長的一段時間內,雖然我自學了單片機,也看到了串口通訊那一節,可是我並沒有理解什么叫串口,停留在我腦海中串口的概念,如圖三所示,以為圖中紅線里的公母頭插口叫做串口,這也難怪,講串口的也需要用到它,它跟串口還是有關系的,但是它與串口是並列的兩個概念,而不是同一個概念,確切的說就是,串口是串口,插口是插口,但是他們還是有關系的,關系就是:要想使用單片機內部的串口功能,總是需要外部接線的,這一點沒錯,當我們使用單片機內部串口的時候,上面所述的公母頭插口就是我們與單片機串口的橋梁,單片機內部串口的外部表現就是單片機的P3^0(接收端)和P3^1(發射端)管腳。當我們想使用單片機的內部串口時,只需要操作單片機的這兩個管腳就可以了,當然,51單片機的接收端和發送端是這兩個管腳,其他單片機如果想使用其內部串口,個人認為不一樣,需要的請讀者自己查找資料。講到這里大家已經知道,單片機串口其實只是一個虛擬的概念,它是封裝在單片機內部的一種邏輯電路,這個我們不去管它,我們要做到的就是會用它就可以了,知道它是個什么概念也就行了。相信說到這里,大家已經對串口有所理解了那么接下來就來看看串口有什么用吧。
2、串口的啟動方法和作用
(1)怎么打開串口
打開了單片機的內部串口,這樣我們就可以實時跟單片機通訊了,簡稱【實時通訊】,我認為這也是單片機的一個重要功能。首先,我們說,怎么打開單片機的內部串口,上面我們說到,單片機的內部串口可以說是一個虛擬的概念,或者說是封裝在單片機內部的一種邏輯電路,沒錯,打開單片機的串口,用的是程序。下面是打開51單片機內部串口的代碼(節選):
TMOD=0x20;串口的工作需要在時間的運行下進行,所以這是確定定時器的工作方式;
TH1=0xfd;
TL1=0xfd;TH1,TL1裝入0xfd這個十六進制代碼的原因是:確定串口的傳輸速率,也就是波特率,0xfd確定的波特率是9600,這一點也很重要,波特率設置的不正確,串口是不工作的,或者說不能正常運行;
TR1=1;這是啟動定時器,上面說過串口工作在時間里,所以要把“手表”啟動,讓它計時。這一段代碼就是讓它啟動“手表”;
REN=1;允許接受位,置1的目的是,開啟串口接受功能;
SM0=0;
SM1=1;SM0,SM1組合確定串口的工作方式,由於每種的工作方式其各種配置也不相同,但是也不常用,所以一般情況sm0=0,sm1=1確定串口工作方式1;
至此,串口的基本程序設置完畢,將這段程序導入到單片機內部就可以打開單片機內部串口功能了;
(2)串口的作用
上面說過,串口的作用其實我個人認為就是實現了上位機或者說終端與單片機實時通訊的功能,舉個例子,相信大家就都明白了:一般情況下我們的單片機開發板都是電腦端寫好程序,通過下載線將程序輸入到單片機內部,然后單片機去執行,這樣有一點不好的地方就是,假如我需要調試哪個led燈亮,哪個滅,我們做法是,程序里改一下,然后下載到開發板里,看結果現象是不是與期望的一樣,如果不一樣,就要重復之前的過程,那這樣是不是就很麻煩呢。是的確實很麻煩,但是有了串口就不一樣了,我們用下載線將上面的一段串口程序燒錄進入51單片機后,就可以實時通訊了,什么意思呢?就是你可以在電腦上實時修改你的參數,然后發送給單片機,直接觀察led的亮滅情況,一直修改到滿意為止。講到這里相信大家該明白了吧,串口的作用總結起來說,就是起到了【實時通訊】的功能,不用程序里改動一下,重新燒寫到單片機里實驗運行來看結果了。所以說串口的作用是不是很明顯呢?
(3)串口調試助手
上面我們說到【你可以在電腦上實時修改你的參數】,怎么修改,這里一般我們程序的下載軟件里都會有,例如,ISP下載器中的串口調試助手,如圖四所示:
圖四
下面對這個軟件做一些簡單介紹,當把串口程序燒寫進入單片機后,單片機的串口也就打開的,或者說處於工作狀態了,然后可以實時通訊了,接下來我們要做的,是針對串口程序,在圖四中進行必要的設置,當時我第一次用這個就是不能夠實時通訊,后來查半天才發現,串口波特率沒有選對,所以使用串口調試助手的時候,首先要選對波特率,上面解釋程序時我們又說道,波特率選擇9600,因此,在串口調試助手里面,【打開串口】按鈕按下之前,先選好波特率,是必要的。一切准備做好之后,就可以進行調試了。
四、關於藍牙與單片機的內部串口之間的關系
上面我們所說的是,電腦端的ISP下載器上的串口調試助手對單片機內部串口的操作,顧名思義,通訊的橋梁使用的是我們的單片機的下載線,由於下載線下載數據時也是通過P3^0和P3^1兩個管腳,而51單片機的內部串口的外部表現也為P3^0和P3^1,所以,我們可以通過下載線,對單片機串口的進行操作。講到這里我們都知道,任何時候如果想使用串口,都需要連接着一根線,那樣是不是很麻煩呢。所以這時候,藍牙應運而生了,什么意思呢?通俗一點說,就是藍牙代替了下載線,實現了單片機開發板與電腦端物理上的斷開。當然,藍牙的用處其實也很簡單,你可以簡單地認為,藍牙模塊充當了一根很長的下載線的功能,如果應用到遠程控制小車上,就是充當了一根遠程控制線的功能,說到這里,相信大家都應該明白了,藍牙模塊用在單片機上,其實就是一根虛擬的下載線或者說無形的下載線。
上面介紹了一下,藍牙模塊的基本概念,接下來我將繼續闡述一下藍牙模塊與51單片機物理上的連接關系,如圖五所示:
圖五
其實藍牙模塊的使用非常簡單,並沒有想象中的那么難,拿到藍牙模塊后,一般情況下並不需要設置,如圖五所示連接電路即可。當單片機中燒寫進去串口程序后,加上上面的藍牙模塊連接完畢,那么相當於單片機和手機已經能夠通訊了,前提是手機端下載好了前面所述的藍牙串口調試APP。
【注意】:不是電腦端,如果需要電腦端給藍牙發送信息,則還需要一個藍牙和TTL轉串口模塊才可以實現電腦端與單片機的無線連接。
五、藍牙串口調試實驗
本實驗的目的是驗證藍牙串口的效果如何,也是本研究課題重要的一個環節。
1、實驗描述
在手機端藍牙串口調試助手中給單片機發送十六進制代碼,由於程序中已經寫好了關於單片機收到代碼后的執行動作,所以我們只需要觀察實驗現象是否與理論一致即可驗證藍牙串口效果。
2、實驗物理連接
如圖六所示,藍牙模塊實際上只用到了六根線中的兩根,其他兩根是設置藍牙模塊使用的,我們買來的藍牙模塊內部已經設置好了,基本上滿足了我們的需求,所以基本不用設置,可以直接用。連接線路如圖六所示,由於本項目為【基於hc-05藍牙模塊控制的步進電機指定旋轉角度】,所以單片機外面又做了一個步進電機步進角度的指示盤。
圖六
下面對上述電路作簡要解釋:上述電路實現的總體功能為,單片機接收到手機藍牙串口發送回來的十六進制代碼后,會作出相應的反應,具體會作出什么反應?接下來我們解讀完程序后再作解釋。下面敘述一下電路詳細連接:
(1)藍牙模塊
藍牙模塊用到四根線,分別是VCC,GND,TXD,RXD,接線VCC和GND分別接單片機的VCC和GND,藍牙模塊的TXD接單片機的RXD,藍牙模塊的RXD接單片機的TXD,如圖六所示。黑色串口線給單片機開發板提供電源用。
(2)單片機外接元器件
單片機外接元器件在本例程中為單片機P1口輸出的8個led燈組和步進電機步進角度指示盤,其中led燈的作用是增加實驗現象,檢測是否程序正常運行。步進電機角度指示盤為本項目的核心要點。其中步進電機的電氣連接為3S鋰電池供電,信號線由單片機P0^0—P0^3四個管腳口控制,步進電機的四根信號線連接步進電機驅動的信號輸入插針,輸出插針連接步進電機即可,其中步進電機為28BYJ-48 5VDC,其中每個字母具體為啥意思,大家有興趣可自行去網上查找,我們只需要知道,這個類型的電機為四相八拍工作模式即可,什么叫四相八拍呢?四相可以理解為四對,即定子上有4對繞組,同一對繞組的繞線方向要相同,八拍是說此步進電機有八個工作節拍,為A-AB-B-BC-C-CD-D-DA,具體還有兩項四拍,但是我們如果想要更細小的步進角,就選擇四相八拍的工作模式最佳,四相八拍的工作模式是一種什么概念呢?這個主要在程序中體現,一種電機的幾相幾拍,幾相是物理特質,我們無法改變,但是幾拍就是我們可以改變的,這個主要在程序中體現。步進電機驅動用的是ULN2003,驅動模塊用的電源是3S的鋰電池經過LM2596穩壓過后傳輸過來的。
3、程序解讀
下面將附上本項目所使用的程序,程序的編譯器為keil3,下載器前面有說過為ISP下載器。
#include<reg52.h> //單片機包含的頭文件,里面包含了一些端口的定義
#define uchar unsigned char
#define uint unsigned int //宏定義
void delay(uint t);
void jiudu();
void badu();
void qidu();
void liudu();
void wudu();
void sidu();
void sandu();
void liangdu();
void yidu(); //子函數聲明
uint i;
float j; //定義變量類型
uchar code step_table[]={
0x01,0x03,0x02,0x06,
0x04,0x0c,0x08,0x09}; //前面我們有說過,幾相幾拍,那么我們這個步進電機使用的是八拍模式,在此設置
uchar flag,a,temp; //定義變量類型
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1; //前面有說過,此處為串口中斷設置,串口已處於工作狀態
while(1);//程序卡在這兒,等待中斷產生
}
void ser() interrupt 4 //中斷服務程序
{
if(RI==1) //RI置高,說明單片機收到數據
{
RI=0;//重新置低,等待下次接收數據
temp=SBUF;//將接收到的數據賦給局部變量temp
P1=temp;//將接收到的數值賦給P1口,控制Led組亮滅
flag=1;//接收標志
}
if(flag==1)// 說明串口收到數據
{
ES=0;//關閉串口中斷
flag=0; //將標志請0,等待下次判斷是否接收完數據
SBUF=temp;//將串口收到的數據返回
while(!TI);//判斷是否發送完畢,沒發送完,卡在這兒
TI=0;//發送完畢后清0
ES=1;//開啟串口中斷,繼續計時等待下次中斷
}
switch(temp)
{
case 1: yidu();break;
case 2: liangdu();break;
case 3: sandu();break;
case 4: sidu(); break;
case 5: wudu(); break;
case 6: liudu(); break;
case 7: qidu(); break;
case 8: badu(); break;
case 9: jiudu(); break;
default: break;
}//按手機端的輸入值,步進電機轉過相應的角度
}
void delay(uint t)
{
while(t--);
}//延時函數
void yidu() //轉過角度子函數,以下類似
{
for(j=8*1.51;j>0;j--)//控制輸入脈沖數,從而實現一定角度旋轉
{
for(i=8;i>0;i--)//循環換節拍,實現持續旋轉
{
P0=step_table[i];
delay(200);//此項主要控制電機轉速
}
}
} 備注:以下程序類似yidu()分析,即可
void liangdu()
{
for(j=8*3.2;j>0;j--)
{
for(i=8;i>0;i--)
{
P0=step_table[i];
delay(200);
}
}
}
void sandu()
{
for(j=8*4.5;j>0;j--)
{
for(i=8;i>0;i--)
{
P0=step_table[i];
delay(200);
}
}
}
void sidu()
{
for(j=8*6;j>0;j--)
{
for(i=8;i>0;i--)
{
P0=step_table[i];
delay(200);
}
}
}
void wudu()
{
for(j=8*7.5;j>0;j--)
{
for(i=8;i>0;i--)
{
P0=step_table[i];
delay(200);
}
}
}
void liudu()
{
for(j=8*9;j>0;j--)
{
for(i=8;i>0;i--)
{
P0=step_table[i];
delay(200);
}
}
}
void qidu()
{
for(j=8*10.5;j>0;j--)
{
for(i=8;i>0;i--)
{
P0=step_table[i];
delay(200);
}
}
}
void badu()
{
for(j=8*12;j>0;j--)
{
for(i=8;i>0;i--)
{
P0=step_table[i];
delay(200);
}
}
}
void jiudu()
{
for(j=8*13.5;j>0;j--)
{
for(i=8;i>0;i--)
{
P0=step_table[i];
delay(200);
}
}
}
4、實驗過程
首先,通過ISP下載器將上述程序下載到單片機中,然后連接藍牙模塊,此處應注意,在下載程序時,應該斷開藍牙模塊的連接,因為藍牙模塊如果不斷電,會占用單片機內部串口,影響單片機程序的下載。下載完程序后,給實驗版通電,也就是給單片機通電,同時也給步進電機通電,如圖七所示(備注:數碼管亮不用去管,內部電路有關聯),此時可以看到藍牙模塊的指示燈在快閃,說明此藍牙沒有被連接,然后在手機端打開藍牙串口調試助手,如圖八所示,點擊搜索,可以搜索到藍牙模塊,名稱為hc-05,還有設備地址,點擊即可,然后就會發現藍牙指示燈慢閃,說明藍牙已被連接,可以進行數據通信了。如圖九所示,我們輸入第一個數值01,這個值其實是0x01,它是一個十六進制代碼,點擊發送,然后我們可以看到,按照程序里說明的這個數值等於1,那么swith語句中選擇case 1執行,那么步進電機便會轉動一度,這里一度等於刻度盤上一個格,如圖十所示,(程序里為了好理解才這么寫的)。同時相應的led燈只有第一個不亮,我們的LED燈是共陰的,只有低電平才亮。為了驗證程序的正確性我們再次輸入05,如圖十一所示,那么電機應該相應的轉過五個格,如圖十二所示,說明程序是正確的,只是格數還不是那么准確,可以在程序中的【控制脈沖數】,作持續修改即可,直到達到滿意值。
圖七 圖八
圖九 圖十
說明:這些圖均可以放大觀看實驗現象更加明顯,圖十二與圖十是兩個銜接的圖,電機轉動角度承接上一次。主要觀察電機轉動角度與led燈亮滅情況與程序的對應情況,通過實驗發現,完全一致。
圖十一 圖十二
六、未來展望
深刻理解了藍牙串口的功能和作用后,這相當於掌握了一套無線傳輸系統,利用這個技術,就可以做一些遠程控制了,例如藍牙小車,藍牙通訊等,這些功能都有待我們去開發。