51单片机倒计时程序

#include
#define uint unsigned int
#define uchar unsigned char
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit key5=P2^4;
sbit key6=P2^5;
uint a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0到9
uint b[]={0xef,0xdF,0xbF,0x7F,0xfe,0xfb,0xfd,0xf7,};
int s=5,m=00,h=00;
uint timecount;
uint sg,ss,mg,ms,hg,hs,flag1=0,flag2=0;
int keycount=0;
void init()//初始化函数设置中断寄存器的值。
{
timecount=0;
TMOD=0x01;
TR0=1;
ET0=1;
EA=1;
TH0=0x3c;
TL0=0xb0;

}
void delay(x)//延时函数。
{
uint i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
void display()//把时分秒送到数码管显示。
{
uint i;
sg=s%10;
ss=s/10;
mg=m%10;
ms=m/10;
hg=h%10;
hs=h/10;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:P1=b[7];P0=a[sg];break;
case 1:P1=b[6];P0=a[ss];break;
case 2:P1=b[5];P0=0x40;break;
case 3:P1=b[4];P0=a[mg];break;
case 4:P1=b[3];P0=a[ms];break;
case 5:P1=b[2];P0=0x40;break;
case 6:P1=b[1];P0=a[hg];break;
case 7:P1=b[0];P0=a[hs];break;
}
delay(1);
}
}
void key_scan()//检测键是否按下按不同键实现不同的处理。
{
if(key1==0)
{
delay(2);
if(key1==0)
{
EA=0;
while(!key1);
keycount++;
if(keycount>=2)
keycount=0;
}
}
if(keycount==1)
{
if(key2==0)
{
delay(1);
if(key2==0)
{
if(key5==0)
{
delay(1);
while(!key5);
s++;
if(s>=60)
{
s=0;
m++;
}
}
if(key6==0)
{
delay(1);
while(!key6);
s--;
if(s<0)
{
s=59;
}
}
}
}
if(key3==0)
{
delay(1);
if(key3==0)
{
if(key5==0)
{
delay(1);
while(!key5);
m++;
if(m>=60)
{
m=0;
h++;
}
}
}
if(key6==0)
{
delay(1);
while(!key6);
m--;
if(m<0)
{
m=59;
}
}
}
if(key4==0)
{
delay(1);
if(key4==0)
{
if(key5==0)
{
delay(1);
while(!key5);
h++;
if(h>=24)
{
h=0;
}
}
if(key6==0)
{
delay(1);
while(!key6);
h--;
if(h<0)
{
h=23;
}
}
}
}
}
if(keycount==0)
EA=1;
}
void main()
{
init();
while(1)
{
display();
key_scan();

}
}
void timer() interrupt 1 //计时中断0工作方式1函数。
{
TH0=0x3c;
TL0=0xb0;
timecount++;
if(timecount==20)
{
timecount=0;
s--;
if(s<=-1&&(m!=0||h!=0))
{
s=59;
m--;
if(m<=-1&&h!=0)
{
m=59;
h--;
if(h<=0)
h=0;
}
else{
m-=0;
if(m<=-1)
{
m=0;
flag2=1;
}
}
}

else
{ s-=0;
if(s<=-1)
{ s=0;
flag1=1;
}

}
}
if(flag1==1&&flag2==1)
EA=0;
}

相关文档
最新文档