你使用for循环+delay延时处理闪烁灯,CPU几乎完全被占用,按键状态很难被捕捉到,而且按键抬起识别用了while(key==0);死循环等待,这就导致互相挤占CPU时间,程序运行不畅。给你把闪烁灯程序改在定时器中断里处理,你试试。
#include<reg51.h>
sbit key=P3^2;
sbit led1=P3^4;
sbit led2=P3^5;
sbit led3=P3^0;
sbit led4=P3^1;
unsigned char times=0;
unsigned char time=0;
unsigned char time1=0;
bit flag=1;
void delay(unsigned char a)
{
unsigned char i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
void Timer0Init() //50毫秒@12.000MHz
{
TMOD= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
EA=1; //开总中断
ET0=1; //开定时器0中断
}
void Twinkle()
{
static unsigned char i=0,j=0;
if(flag==1)
{
time1++;
if(time1==24)
time1=0;
if(time1<12)
{
switch(i)
{
case 0:led1=0;led2=1;led3=1;led4=1;i=1;break;
case 1:led1=1;led2=0;led3=1;led4=1;i=0;break;
}
j=0;
}
else
{
switch(j)
{
case 0:led1=1;led2=1;led3=0;led4=1;j=1;break;
case 1:led1=1;led2=1;led3=1;led4=0;j=0;break;
}
i=0;
}
}
}
void main()
{
unsigned char k = 0; //按键状态
Timer0Init();
while(1)
{
if(key==0)
{
delay(10);
if((key==0)&&(k==0))
{
k=1;
times++;
times%=3;
}
}
else k=0;
switch(times)
{
case 0:led1=led2=led3=led4=1;TR0=0;flag=0;time1=0;break;
case 1:led1=0;break;
case 2:flag=1;TR0=1;break;
}
}
}
void timer0() interrupt 1
{
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
time++;
if(time>=10) //0.5秒
{
time=0;
Twinkle();
}
}
|