51单片机数码管倒计时程序,从999999开始倒计时,用定时器T1的中断完成

如题所述

#include<reg51.h>
#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
uchar sec=0,min=0,hour;
uchar time;
uchar disdat[6];
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=min%10;
disdat[3]=min/10;
disdat[4]=hour%10;
disdat[5]=hour/10;
}
void t0isr() interrupt 1 //秒计时
{
TH0=0x3c;
TL0=0xb0;
time++;
if(time==20)
{
time=0;
if(sec>0)sec--;
else if(min>0){sec=99;min--;}
else if(hour>0){sec=99;min=99;hour--;}
}
dischg();
}
void t1isr() interrupt 3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P2=0x20;
P0=~ledtab[disdat[5]];
break;
case 1:
P2=0x10;
P0=~ledtab[disdat[4]];
break;
case 2:
P2=0x08;
P0=~ledtab[disdat[3]];
break;
case 3:
P2=0x04;
P0=~ledtab[disdat[2]];
break;
case 4:
P2=0x02;
P0=~ledtab[disdat[1]];
break;
case 5:
P2=0x01;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
TR1=1;
TR0=0;
ET0=1;
ET1=1;
EA=1;
fmq=0;
scanled=0;
time=0;
mode=1;
dischg();
while(1)
{
if(keyhu==0)
{
while(keyhu==0);
TR0=0;
hour++;
hour%=24;
}
if(keyhd==0)
{
while(keyhd==0);
TR0=0;
if(hour>0)hour--;
if(hour==0)hour=23;

}
if(keymu==0)
{
while(keymu==0);
TR0=0;
min++;
min%=60;
}
if(keymd==0)
{
while(keymd==0);
TR0=0;
if(min>0)min--;
if(min==0)min=59;
}
if(keysu==0)
{
while(keysu==0);
TR0=0;
sec++;
sec%=60;
}
if(keysd==0)
{
while(keysd==0);
TR0=0;
if(sec>0)sec--;
if(sec==0)sec=59;
}
if(keyst==0)
{
while(keyst==0);
TR0=~TR0;
}
dischg();
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-08-22
以下程序适合在TX-1C 51单 片机开发板
//0-99999计数
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned long int num=99999;
uchar a=0;
sbit dula=P2^6;
sbit wela=P2^7;
//共阴数码管七段码
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void Delay1ms(uint i) //1ms延时程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<164;j++)
{;}
}
}
void display(uchar a1,uchar a2,uchar a3,uchar a4,uchar a5)//显示程序

{
P0=table[a1];//显示第一个数
dula=1;
dula=0;

P0=0xfe;
wela=1;
wela=0;
Delay1ms(2);

P0=table[a2]; //显示第二个数
dula=1;
dula=0;

P0=0xfd;
wela=1;
wela=0;
Delay1ms(2);

P0=table[a3];
dula=1;
dula=0;

P0=0xfb;
wela=1;
wela=0;
Delay1ms(2);

P0=table[a4]; /
dula=1;
dula=0;

P0=0xf7;
wela=1;
wela=0;
Delay1ms(2);
P0=table[a5];
dula=1;
dula=0;

P0=0xef;
wela=1;
wela=0;
Delay1ms(2);
}

void main(void )//主程序
{
uchar b1,b2,b3,b4,b5;
TMOD=0x10;// 定时器1工作方式一
ET1=1;
EA=1;
TH1=(65536-50000)/256;//定时50ms
TL1=(65536-50000)%256;
TR1=1;
while(1)
{
b1=num/10000;//分离个十百千万
b2=num/1000%10;
b3=num/100%10;
b4=num/10%10;
b5=num%10;
display(b1,b2,b3,b4,b5);//显示
}
}

void Timer1(void) interrupt 3//中断程序
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
a++;
if(a==20)//20次是1 秒
{ a=0;num--;}
}
第2个回答  2017-08-21
定时器程序段配合数码管显示程序段完成。
第3个回答  2017-08-22
在定时器内部计数,然后定时刷新数码管,
懂事电子设计 Vgongzhon