波特率設置為9600,無奇偶校驗,晶振11.0592MHz,STC89C52.
單片機通過串口接收到 字符“a",單片機反饋”a"並打開p1.0 =1 。
如果單片機持續30S 沒收到“a" P1.0= 0 。
存在問題:1.延時、端口 要根據妳的實際情況改壹下參數。
2.上電or復位後,第壹次P1.0=0的轉換時間要比以後動作轉換時間長,不壹致。之後正常。
******************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar buf;
sbit out = P1^0;
void delay(unsigned char s) //11.0592MHz下,帶參數延時
{
unsigned char i, j,k;
for(k=s;k>0;k--)
{
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
}
void main(void)
{
SCON=0x50; //設定串口工作方式
PCON=0x00; //波特率不倍增
TMOD=0x20; //定時器1工作於8位自動重載模式, 用於產生波特率
EA=1;
ES = 1; //允許串口中斷
TL1=0xfd;
TH1=0xfd; //波特率9600
TR1=1;
while(1)
{
delay(100); //延時,此處要根據實際修改成妳需要的數值
out = 0; //正常上電,延時後,會使P1.0等於0
//從串口收到a後, 會使P1.0馬上等於1,
//然後如果在延時時間內沒有再次接收到a ,那程序將再次使P1.0等於0,循環。。。
}
}
/*********************************************************
串行中斷服務函數
*********************************************************/
void serial() interrupt 4
{
ES = 0; //關閉串行中斷
RI = 0; //清除串行接受標誌位
buf = SBUF; //從串口緩沖區取得數據
switch(buf)
{
case 0x61: out = 1;break; //接受到字符a,使P2.0為高(0x61為"a"的ASCII碼十六進制形式)
// case 0x32: out = 0;break; //接受到字符2,使P2.0為低(測試使用)
default: break; //接受到其它數據,無動作
}
ES = 1; //允許串口中斷
}