刚学定时器和串口,项目要求是 按下key1之后led灯亮5s后熄灭(定时器定时),然后串口接收到6的时候led灯全部亮,然后按下key2之后让前面亮起来的led灯熄灭,并且向串口发送 “Hello World!”。 这三部分每一部分单独拿出来当作一个小程序都没有问题,但是这三部分合起来写成一个程序就出现问题了。
我写的这个程序运行之后,第一部分按下key1之后led灯亮五秒钟熄灭没任何问题; 第二部分串口接收到6的时候led灯也可以全亮,但是亮一段时间之后就会自动熄灭,按照要求应该是不让他熄灭的;第三部分是按下key2之后第二部分亮起来的led灯可以正常熄灭,但是不会向串口发送“Hello World!”。
请帮我看一下是哪里有问题。
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
sbit key1=P3^0;
sbit key2=P3^1;
void delay(unsigned char z)//zms延时
{
unsigned char i, j;
while(z>0)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
z--;
}
}
void timer0Init() //50ms
{
TR0=1;
TMOD|=0X01;
TH0=(65535-46082)/256;
TL0=(65535-46082)%256;
}
void UARTInit()
{
EA=1;
ES=1;
REN=1;
SM0=0; SM1=1;
TR1=1;//打开定时器1
TMOD|=0X20;
TH1=0XFD;
TL1=0XFD;
}
void main()
{
unsigned char msec;
while(1)
{
UARTInit();
if(key1==0)
{
delay(20); //消抖
if(key1==0)
while(!key1) ;//松手检测
P1=0x00;
timer0Init();
}
if(TF0==1)
{
TF0=0;
msec++;
TH0=(65535-46082)/256;
TL0=(65535-46082)%256;
if(msec==100)
{
P1=0XFF;
TR0=0;
}
}
if(key2==0)
{
delay(20);
if(key2==0)
while(!key2) ;
P1=0xff;
TI=1;
printf("Hello World!\n");
while(!TI) ;
TI=0;
}
}
}
void UART() interrupt 4
{
unsigned char temp;
if(RI)
{
RI=0;
temp=SBUF;
if(temp==6)
P1=0x00;
}
if(TI)
TI=0;
}
|