51单片机数码管倒计时程序,从999999开始倒计时,用定时器T1的中断完成 10
展开全部
#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();
}
}
#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();
}
}
深圳市兴威帆电子技术有限公司
2023-08-24 广告
2023-08-24 广告
作为深圳市兴威帆电子技术有限公司的工作人员,我建议选择实时时钟模块时,可以考虑以下几个因素:1. 精度和稳定性:实时时钟模块需要保持高精度和稳定性,以确保系统时间的准确性。2. 兼容性:需要确保实时时钟模块与您的硬件平台和操作系统兼容。3....
点击进入详情页
本回答由深圳市兴威帆电子技术有限公司提供
展开全部
以下程序适合在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--;}
}
//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--;}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
定时器程序段配合数码管显示程序段完成。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在定时器内部计数,然后定时刷新数码管,
懂事电子设计 Vgongzhon
懂事电子设计 Vgongzhon
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询