|
單片機是stc89c52,晶振是11.0592M,用的是藍牙hc05,硬件連好后發送命令,問題在于發送前兩次命令正常,但第三次收到消息不對,并且之后發命令像死機一樣無反應怎么解決,已測任何命令發送都成功過,大部分都在第三次時候出現,順便問下hc05模塊en腳和state腳要接么,我沒接懸空了。代碼如下:
#include<reg52.h>
#include "intrins.h"
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
uchar date;
uint cmd;
sbit a=P2^0;
sbit b=P2^1;
sbit c=P2^2;
sbit d=P2^3;
uchar code at[]="get a";
uchar code bt[]="get b";
uchar code ct[]="get c";
uchar code dt[]="get d";
//------------------------------BLE---------------------------------------
void UartConfiguration() //串口初始化
{
TMOD=0x20; //定時器工作在模式2,8位自動重裝模式
TH1=0xfd;
TL1=0xfd;
PCON=0x00; //串口波特率,SMOD=0
SCON=0x50; //串口工作在模式1 10uart
EA=1; //總開關開
ES=1;
TR1=1; //計數器開
}
void sendDate(uchar buf) //發送字符
{
SBUF=buf;
while(!TI);
TI=0;
}
void SendString(uchar *p) //發送字符串
{
while(*p)
{
sendDate(*p);
p++;
}
}
void Iscmd()
{
if(date=='a'||date=='b'||date=='c'||date=='d')cmd=1; //判斷是否為命令
}
void Uart() interrupt 4 //串口判斷是否有收到或發送完畢
{
if(RI==1){date=SBUF;RI=0;Iscmd();} //獲取收到數據,RI置0,判斷是否是命令
if(TI==1){TI=0;} //發送完畢置0
}
//----------------------------------------------------------------
void main()
{
UartConfiguration(); //藍牙初始化
while(1)
{
if(cmd) //命令判斷
{
switch(date){ //根據命令選擇
case 'a':SendString(at);a=0;break;
case 'b':SendString(bt);b=0;break;
case 'c':SendString(ct);c=0;break;
case 'd':SendString(dt);d=0;break;
default:break;
}
cmd=0; //命令標志置0
}
}
}
|
|