#include
sbit P1_0 = P1^0; //测试口,可用可不用
sbit P1_3 = P1^3; //输出口
unsigned char 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_3 = 0;
TI = 0;
while(1)
{
if(tempbuf == 0x31) //可以使用
P1_3 = 1;
if(tempbuf == 0) //不可以使用
P1_3 = 0;
if(tempbuf == 'A') //可以使用
P1_3 = 1;
if(tempbuf == 'B') //可以使用
P1_3 = 0;
}
}
void Serial(void) interrupt 4
{
tempbuf = SBUF;
RI = 0; //读标志清零
SBUF = tempbuf; //将内容返回到手机端,可在手机查看发送的内容
while(!TI);
TI = 0; //写标志清零
}
该程序为最简单的测试程序,利用蓝牙接收手机发来的信息,控制P1.3口输出高或者低电平,以测试是否正确接收到信息。while(1)
{
if(tempbuf == 0x31) //可以使用
P1_3 = 1;
if(tempbuf == 0) //不可以使用
P1_3 = 0;
if(tempbuf == 'A') //可以使用
P1_3 = 1;
if(tempbuf == 'B') //可以使用
P1_3 = 0;
}
无法正确执行,P1.3口自然也无法根据需要来输出高或者低电平。第二步,用蓝牙模块与单片机最小模块接线,成功用手机连接收尝试发送信息,如下图所示:if(tempbuf == 0x31) //可以使用
P1_3 = 1;
if(tempbuf == 0) //不可以使用
P1_3 = 0;
当发送数字消息时,应为十六进制,因此在判断时,如接收到1,应判断是否等于0x31,而不是判断是否等于1。此处经过测试,发送1时,判断tempbuf == 0x31,该判断有效;当发送0时,判断tempbuf == 0,判断无效。判断字符加单引号即可。第三步,为什么使用两个相同的单片机会导致结果不同?这也是困扰了我很久的问题,后来经过检查,才知道原来就是晶振的问题。此处PO一下大神关于晶振的说明,暂时未看懂:https://www.zhihu.com/question/30930577但可以得出的结论就是,如果使用串口通信,应使用的晶振为11.0594MHZ,否则可能出现乱码的情况。另附:开发板上的晶振如图: