日期:2018.9.27
最近在研究藍牙模塊,先是手機藍牙串口通信的軟件開發,雖然有很多例子,但是對於小白的我還是弄了挺長時間。今天先介紹一下硬件部分的程序設計和仿真。硬件電路採用的是51單片機和藍牙模塊HC-05的連接。單片機程序如下:
#include <reg52.h>
sbit P1_0 = P1^0; //Êä³ö¿Ú1
sbit P1_1 = P1^1; //Êä³ö¿Ú2
#define uchar unsigned char; //´æ´¢½ÓÊÕµ½µÄÐÅÏ¢
uchar tempbuf;
/*³õʼ»¯´®¿Ú*/
void BlueteethInit()
{
SCON = 0x50; //´®¿Úģʽ1£¬ÔÊÐí½ÓÊÕ
TMOD = 0x20; //T1¹¤×÷ģʽΪ2£¬×Ô¶¯ÖØ×°
PCON = 0x00; //²¨ÌØÂʲ»±¶Ôö
REN = 1;
TH1 = 0xfd; //ÉèÖò¨ÌØÂÊΪ9600
TL1 = 0xfd;
RI = 0;
EA = 1; //¿ª×ÜÖжÏ
ES = 1; //¿ª´®¿Ú½ÓÊÕÖжÏ
TR1 = 1; //¶¨Ê±Æ÷¿ªÆô
}
void main()
{
BlueteethInit();
P1_0 = 0;
P1_1 = 1;
TI = 0;
while(1)
{
if(tempbuf == 0x31) //Ê®½øÖÆΪ49£¬¶ÔÓ¦ASCIIÂë¿ØÖÆ×Ö·ûΪ1
P1_0 = 1;
if(tempbuf == 0x30) //Ê®½øÖÆΪ48£¬¶ÔÓ¦ASCIIÂë¿ØÖÆ×Ö·ûΪ0
P1_0 = 0;
if(tempbuf == 'A') //Ê®½øÖÆΪ49£¬¶ÔÓ¦ASCIIÂë¿ØÖÆ×Ö·ûΪ1
P1_1 = 1;
if(tempbuf == 'B') //Ê®½øÖÆΪ48£¬¶ÔÓ¦ASCIIÂë¿ØÖÆ×Ö·ûΪ0
P1_1 = 0;
}
}
void Serial(void) interrupt 4
{
RI = 0; //¶Á±êÖ¾ÇåÁã
ES = 0; //¹Ø±Õ´®¿ÚÖжÏ
tempbuf = SBUF;
ES = 1;
SBUF = tempbuf; //½«ÄÚÈÝ·µ»Øµ½ÊÖ»ú¶Ë£¬¿ÉÔÚÊÖ»ú²é¿´·¢Ë͵ÄÄÚÈÝ
while(!TI)
TI = 0; //д±êÖ¾ÇåÁã
}
由於我是用KEIL編寫的,導致複製到這裏註釋全部亂碼,需要注意的就是while循環裏的判斷,0x31是ASCII數值,對應的十進制字符就是1,0x30對應的是0。然後生成我們需要使用的HEX文件。
protus仿真:
搭建仿真電路
用到的器件如下:
AT89C51、Resistor(Generic)、CRYSTAL、Capacitors(Generic)、LED-、button、compim
需要注意的是X1晶振的數值和U1單片機的數值設置到11.0592MHz,
P1端口的設置
最後在設置中的“program file”中選擇剛纔生成的HEX,就可以進行仿真了,仿真效果如下,
接下來就是如何測試串口通信效果了。
用Virtual Serial Port Driver 軟件實現虛擬串口的連接
虛擬出了com1和com2的連接,從設備管理器中看會更清晰
最後我們把仿真電路中的P1設置爲com1,然後打開串口調試助手AccessPort,設置相同的波特率,然後打開串口com2,寫入字符1或0,或者A或B,可以實現仿真。
當我輸入0後可以將D1的藍色關閉,同時我再次輸入B後可以打開D2爲藍色,
這樣我們就實現了硬件電路的仿真工作,將單片機的P1串口替換爲藍牙模塊後,通過手機發送相應的字符to那個樣會實現點亮和關閉D1和D2的控制。