要求是先按K1,單片機會向電腦發hello,然后我用串口助手向單片機發m1,L1,beep,單片機會做相應操作。現在我遇到的問題就是按下電源后如果先執行后三個操作,最后按K1則都會執行。但是我先按K1的話,后三個都不會執行。求大佬解答。
單片機源程序:
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit DU = P2^6; //位定義段選
sbit WE = P2^7; //位定義位選
sbit beep = P2^3;
sbit key1 = P3^0;
void UARTInit(); //串口初始化
uchar dat;
uint idata a[10];
uchar i;
void delay_ms(uint z)
{
int x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void main()
{
UARTInit();
while(1) //也可以直接在中斷中判斷,不過需要字符串的結束標志
{
if(!key1)
{
delay_ms(20);
if(!key1)
{
ES = 0;
TI = 1;
printf("hello\n");
while(!TI);
TI = 0;
ES = 1;
while(!key1);
}
}
else if(a[0]=='m' && a[1]=='1')
{
i=0;
WE = 0;
P0 = 0xfe;
WE = 1;
WE = 0;
DU = 0;
P0 = 0xff;
DU = 1;
DU = 0;
delay_ms(1);
}
else if(a[0]=='L' && a[1]=='1')
{
i=0;
P1 = 0xfe;
}
else if(a[0]=='b' && a[1]=='e' && a[2]=='e' && a[3]=='p')
{
i=0;
beep = 0;
delay_ms(1000);
beep = 1;
break;
}
}
}
void UARTInit()
{
EA = 1; //打開總中斷
ES = 1; //打開串口中斷
SM0 = 0; SM1 = 1; //串口工作方式1,8位UART波特率可變
TR1 = 1; //啟動定時器1
TMOD = 0x20; //定時器1工作模式2,8位自動重裝
REN = 1; //串口允許接收
TH1 = 0xfd; //比特率9600
TL1 = 0xfd;
}
void UART() interrupt 4
{
if(RI) //判斷是否接收完成
{
RI = 0; //軟件清零接受標志位
a[i++] = SBUF; //讀SBUF,讀出串口收到的數據
}
if(TI) //判斷是否發送完成
{
TI = 0; //清零發送完成標志位
}
}
|