日期: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的控制。