要求是先按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; //清零发送完成标志位
}
}
|