在這個項目中,我們將使用8051微控制器和藍(lán)牙模塊構(gòu)建一個Android手機(jī)控制的機(jī)器人。該機(jī)器人是使用直流電機(jī)設(shè)計的,直流電機(jī)的方向?qū)⒂蓮陌沧繎?yīng)用程序收到的命令控制。機(jī)器人的狀態(tài)被發(fā)送回安卓應(yīng)用程序。該項目還將幫助HC-05藍(lán)牙模塊與8051微控制器的接口.
所需組件:
8051 微控制器 (AT89S52)
HC-05 藍(lán)牙模塊
L293D 電機(jī)驅(qū)動器
機(jī)器人底盤
直流電機(jī) (2)
輪子 (2)
腳輪
跳線
藍(lán)牙終端安卓應(yīng)用
電路圖:

?

8051 微控制器:
8051微控制器是一種8位微控制器,具有128字節(jié)的片上RAM,4K字節(jié)的片上ROM,兩個定時器,一個串行端口和四個8位端口。8052微控制器是8051微控制器的擴(kuò)展。在這個項目中,我們使用AT89S52微控制器。下表顯示了8051名家庭成員的比較。
?
| 特征 | 8051 | 8052 |
| 只讀存儲器(以字節(jié)為單位) | 4K | 8K |
| 內(nèi)存(字節(jié)) | 128 | 256 |
| 定時器 | 2 | 3 |
| I/O 引腳 | 32 | 32 |
| 串行端口 | 1 | 1 |
| 中斷源 | 6 | 8 |
?
HC-05 藍(lán)牙模塊:

HC-05 是一個串行藍(lán)牙模塊.可以使用 AT 命令對其進(jìn)行配置。它可以在三種不同的配置(主、從、環(huán)回)下工作。在我們的項目中,我們將它用作從屬。HC-05模塊的特點包括:
典型靈敏度為-80dBm。
默認(rèn)波特率:9600bps,8個數(shù)據(jù)位,1個停止位,無奇偶校驗。
自動配對 PIN 碼:“1234”默認(rèn) PIN 碼
它有 6 個引腳。
Vcc 和 Gnd 引腳用于為 HC-05 供電。
Tx 和 Rx 引腳用于與微控制器通信。
用于激活 HC-05 模塊的使能引腳。當(dāng)它為低時,模塊被禁用
狀態(tài)引腳行為狀態(tài)指示燈。當(dāng)它未與任何其他藍(lán)牙設(shè)備配對/連接時,LED 會持續(xù)閃爍。當(dāng)它與任何其他藍(lán)牙設(shè)備連接/配對時,LED 會以 2 秒的恒定延遲閃爍。
L293D 電機(jī)驅(qū)動器 IC:
L293D 是一款雙 H 橋電機(jī)驅(qū)動器 IC。它充當(dāng)電流放大器,L293D 的輸出驅(qū)動直流電機(jī)。它包含兩個內(nèi)置的H橋電路。在共模運行模式下,它可以在兩個方向上同時驅(qū)動兩個直流電機(jī)。下表顯示了L293D IC的引腳說明。

?

引腳說明
?
| 引腳編號 | 名字 | 功能 |
| 1 | 啟用 1,2 | 電機(jī) 1 的使能引腳 |
| 2 | 輸入 1 | 輸入 1 用于電機(jī) 1 |
| 3 | 產(chǎn)出 1 | 電機(jī) 1 的輸出 1 |
| 4 | 格德 | 接地 (0V) |
| 5 | 格德 | 接地 (0V) |
| 6 | 產(chǎn)出 2 | 電機(jī) 2 的輸出 1 |
| 7 | 輸入 2 | 輸入 2 用于電機(jī) 1 |
| 8 | Vcc 2 | 電機(jī)電源電壓(5V) |
| 9 | 啟用 3,4 | 電機(jī) 1 的使能引腳 |
| 10 | 輸入 3 | 輸入 1 用于電機(jī) 2 |
| 11 | 產(chǎn)出 4 | 電機(jī) 1 的輸出 2 |
| 12 | 格德 | 接地 (0V) |
| 13 | 格德 | 接地 (0V) |
| 14 | 產(chǎn)出 4 | 電機(jī) 2 的輸出 2 |
| 15 | 輸入 4 | 輸入 2 用于電機(jī) 2 |
| 16 | Vcc 1 | 電源電壓 (5V) |
?
安卓手機(jī)控制機(jī)器人的工作:
在這個智能手機(jī)控制的機(jī)器人中,android應(yīng)用程序的用戶通過HC-05模塊將數(shù)據(jù)發(fā)送到8051微控制器。在8051微控制器中比較接收到的數(shù)據(jù),并做出相應(yīng)的決定。下表顯示了不同接收字符的電機(jī)方向和機(jī)器人狀態(tài)。
?
| 接收的字符 | 電機(jī) 1 | 電機(jī) 2 | 機(jī)器人現(xiàn)狀 |
| f | 向前 | 向前 | 向前邁進(jìn) |
| b | 向后 | 向后 | 向后移動 |
| r | 向前 | 向后 | 向右移動 |
| l | 向后 | 向前 | 向左移動 |
| s | 關(guān)閉 | 關(guān)閉 | 停止 |
?

藍(lán)牙終端應(yīng)用程序允許我們模擬藍(lán)牙終端。此應(yīng)用程序支持雙向通信,此應(yīng)用程序與大多數(shù)設(shè)備兼容。
以下步驟顯示了如何安裝和使用此應(yīng)用。
1.在您的安卓手機(jī)上下載并安裝藍(lán)牙終端應(yīng)用程序。
2.安裝應(yīng)用程序后,打開應(yīng)用程序并打開藍(lán)牙。
3.選擇設(shè)備,然后單擊連接選項。連接成功后,我們可以開始向HC-05模塊發(fā)送數(shù)據(jù)。


查看下面的代碼說明,了解 8051 微控制器如何發(fā)送和接收字符以旋轉(zhuǎn)所需的電機(jī)。
代碼說明:
該項目的完整 C 程序和演示視頻在本項目結(jié)束時給出。代碼被分成有意義的小塊,并在下面解釋。
對于與 8051 微控制器的 L293D 接口,我們必須定義 L293D 連接到 8051 微控制器的引腳。電機(jī)1的In1引腳連接到P2.0,電機(jī)1的In2引腳連接到P2.1,電機(jī)2的In1引腳連接到P2.2,電機(jī)2的In2引腳連接到P2.3
sbit m1f=P2^0; // in1 pin of motor1
sbit m1b=P2^1; // in2 pin of motor1
sbit m2f=P2^2; // in1 pin of motor2
sbit m2b=P2^3; // in2 pin of motor2
接下來,我們必須定義一些在程序中使用的函數(shù)。延遲功能用于創(chuàng)建指定的時間延遲。Txdata功能用于通過串口傳輸數(shù)據(jù)。Rxdata功能用于從串口接收數(shù)據(jù)。
void delay(unsigned int) ; //function for creating delay
char rxdata(void); //function for receiving a character through serial port of 8051
void txdata(unsigned char); //function for sending a character through serial port of 8051
在代碼的這一部分中,我們將配置8051微控制器進(jìn)行串行通信。TMOD寄存器加載了定時器1模式2(自動重新加載)的0x20。SCON 寄存器加載了 8 個數(shù)據(jù)位、1 個停止位和接收啟用的0x50。TH1寄存器加載了波特率為每秒9600位的0xfd。TR1=1 用于啟動計時器。
TMOD=0x20;?
SCON=0x50;?
TH1=0xfd;?
TR1=1;?
在代碼的這一部分中,rxdata 函數(shù)的返回字符存儲在變量 's' 中以供進(jìn)一步使用。
s=rxdata(); //receive serial data from hc-05 bluetooth module
在代碼的這一部分中,我們必須將接收到的字符與不同方向的預(yù)分配字符進(jìn)行比較。如果接收到的字符是“f”,則機(jī)器人必須向前移動。這是通過使 m1f、m2f 引腳高而 m1b、m2b 引腳低來實現(xiàn)的。完成此操作后,接下來我們必須將機(jī)器人的狀態(tài)發(fā)送到Android應(yīng)用程序。這是在 txdata 功能的幫助下完成的。對收到的不同字符重復(fù)相同的過程,并做出相應(yīng)的決定。表1顯示了機(jī)器人不同運動方向的m1f,m1b,m2f,m2b的不同值。
if(s=='f') //move both the motors in forward direction
{
m1f=1;
delay(1);
m1b=0;
delay(1);
m2f=1;
delay(1);
m2b=0;
delay(1);
for(i=0;msg1[i]!='';i++) //send status of robot to android app through bluetooth
{
txdata(msg1[i]);
}
}
?
?
| M1F | M1B | M2F | M2B | 電機(jī) 1 旋轉(zhuǎn) | 電機(jī) 2 旋轉(zhuǎn) | 機(jī)器人現(xiàn)狀 |
| 1 | 0 | 1 | 0 | 向前 | 向前 | 前進(jìn) |
| 0 | 1 | 0 | 1 | 反向 | 反向 | 向后移動 |
| 1 | 0 | 0 | 1 | 向前 | 反向 | 向右移動 |
| 0 | 1 | 1 | 0 | 反向 | 向前 | 向左移動 |
| 0 | 0 | 0 | 0 | 停止 | 停止 | 停止 |
?
這是您可以通過使用 8051 微控制器控制四個電機(jī)來向任何方向旋轉(zhuǎn)機(jī)器人汽車。
/*this program is for controlling a robot using bluetooth and android app*/
#include
unsigned char ch1;
unsigned char s;
sbit m1f=P2^0; // in1 pin of motor1
sbit m1b=P2^1; // in2 pin of motor1
sbit m2f=P2^2; // in1 pin of motor2
sbit m2b=P2^3; // in2 pin of motor2
void delay(unsigned int) ; //function for creating delay
char rxdata(void); //function for receiving a character through serial port of 8051?
void txdata(unsigned char); //function for sending a character through serial port of 8051?
void main(void)
{
unsigned char i;
unsigned char msg1[]={"robot is moving forward"};
unsigned char msg2[]={"robot is moving backward"};
unsigned char msg3[]={"robot is moving right"};
unsigned char msg4[]={"robot is moving left"};
unsigned char msg5[]={"robot is stopped"};
TMOD=0x20; //timer 1 , mode 2 , auto reload
SCON=0x50; //8bit data , 1 stop bit , REN enabled
TH1=0xfd; //timer value for 9600 bits per second(bps)
TR1=1;?
while(1) //repeat forever
{
s=rxdata(); //receive serial data from hc-05 bluetooth module
if(s=='f') //move both the motors in forward direction
{
m1f=1;
delay(1);
m1b=0;
delay(1);
m2f=1;
delay(1);
m2b=0;
delay(1);
for(i=0;msg1[i]!='';i++)
{
txdata(msg1[i]);
}?
}
else if(s=='b')?
{
m1f=0;
delay(1);
m1b=1;
delay(10);
m2f=0;
delay(10);
m2b=1;
delay(10);
for(i=0;msg2[i]!='';i++)?
{
txdata(msg2[i]);
}
}
else if(s=='r')
{
m1f=1;
delay(1);
m1b=0;?
delay(10);
m2f=0;
delay(10);
m2b=1;
delay(10);
for(i=0;msg3[i]!='';i++)?
{
txdata(msg3[i]);
}?
}
else if(s=='l')
{
m1f=0;
delay(1);
m1b=1;
delay(1);
m2f=1;
delay(1);
m2b=0;
delay(1);
for(i=0;msg4[i]!='';i++)
{
txdata(msg4[i]);
}?
}
else if(s=='s')?
{
m1f=0;
delay(1);
m1b=0;
delay(1);
m2f=0;
delay(1);
m2b=0;
delay(1);
for(i=0;msg5[i]!='';i++)
{
txdata(msg5[i]);
}
}
txdata('n');?
}
}
char rxdata()
{
while(RI==0); //wait till RI becomes HIGH
RI=0; //make RI low
ch1=SBUF; //copy received data?
return ch1; //return the received data to main function.
}
void txdata(unsigned char x)
{
SBUF=x; //copy data to be transmitted to SBUF
while(TI==0); //wait till TI becomes high
TI=0; //mae TI low for next transmission
}
void delay(unsigned int z)
{
unsigned int p ,q;
for(p=0 ; p
{
for(q=0 ; q<1375 ; q++); //repeat for 1375 times
}
}
?
?
電子發(fā)燒友App



















評論