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

作者&投稿:言祁 (若有异议请与网页底部的电邮联系)
51单片机数码管倒计时程序,从999999开始倒计时,用定时器T1的中断完成~

这个和代码顺序有关系:
while (1) { if (flag1s == 1) //判断1秒定时标志 { flag1s = 0; //1秒定时标志清零 sec--; //秒计数自减1【这里是先减一,后面再送显示】 //将sec按十进制位从低到高依次提取到buf数组中 buf[0] = sec%10; buf[1] = sec/10%10; buf[2] = sec/100%10; buf[3] = sec/1000%10; buf[4] = sec/10000%10; buf[5] = sec/100000%10; //从最高为开始,遇到0不显示,遇到非0退出循环 } }如果初值要改为999999,代码可以改成如下: while (1) { if (flag1s == 1) //判断1秒定时标志 { flag1s = 0; //1秒定时标志清零 // sec--; //秒计数自减1【屏蔽】 //将sec按十进制位从低到高依次提取到buf数组中 buf[0] = sec%10; buf[1] = sec/10%10; buf[2] = sec/100%10; buf[3] = sec/1000%10; buf[4] = sec/10000%10; buf[5] = sec/100000%10; sec--; //秒计数自减1【这里是先送显示,后面再减一】 //从最高为开始,遇到0不显示,遇到非0退出循环 } }

这个和代码顺序有关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

while (1)
{
if (flag1s == 1) //判断1秒定时标志
{
flag1s = 0; //1秒定时标志清零
sec--; //秒计数自减1【这里是先减一,后面再送显示】
//将sec按十进制位从低到高依次提取到buf数组中
buf[0] = sec%10;
buf[1] = sec/10%10;
buf[2] = sec/100%10;
buf[3] = sec/1000%10;
buf[4] = sec/10000%10;
buf[5] = sec/100000%10;
//从最高为开始,遇到0不显示,遇到非0退出循环
}
}
如果初值要改为999999,代码可以改成如下:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

while (1)
{
if (flag1s == 1) //判断1秒定时标志
{
flag1s = 0; //1秒定时标志清零
// sec--; //秒计数自减1【屏蔽】
//将sec按十进制位从低到高依次提取到buf数组中
buf[0] = sec%10;
buf[1] = sec/10%10;
buf[2] = sec/100%10;
buf[3] = sec/1000%10;
buf[4] = sec/10000%10;
buf[5] = sec/100000%10;
sec--; //秒计数自减1【这里是先送显示,后面再减一】
//从最高为开始,遇到0不显示,遇到非0退出循环
}
}

#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();
}
}

以下程序适合在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--;}
}

定时器程序段配合数码管显示程序段完成。

在定时器内部计数,然后定时刷新数码管,
懂事电子设计 Vgongzhon


单片机一位数码管实现4小时倒计时。。
1 利用单片机的定时器1 工作在方式1 允许中断 定时时间=50毫秒 2 设一个软件计数器 初始值=20 每当定时器50毫秒到 进入定时器1的中断服务程序时,重新给定时器1送初值 连续定时下一个50毫秒 同时使软件计数器减1 每当软件计数器减到0时 要重新给软件计数器送初值20.同...

如何用单片机和数位管实现倒计天数的功能?
(1)数码管可以静态显示也可以动态显示。静态显示,所需的I\/O口较多,硬件连线较多,软件相对简单;动态显示,所需的I\/O口较少,硬件连线较少,软件相对复杂。(2)倒计时可以这样实现:用一个定时器做个10毫秒中断作为时钟节拍;假设用变量tmp表示要倒计的数字,在中断服务程序中:tmp--;\/\/倒计 刷新...

单片机电压表后面显示倒计时
利用定时器和计数器的原理将倒计时过程显示在LED数码管上。先上电之后先调整定时时间,每按一次加键定时加十分钟,减键同理,当设置好分钟之后按下设置键等到数码管闪动后松开按键进入小时设置,每按一次加键定时增加一小时。设置好分钟和小时后再次按下设置键就会启动定时,此时控制三极管的I\/O口为1,...

如何用单片机做一个简单的倒计时器
IE=0x82; \/\/这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时 TR0=1; \/\/开定时器0while(1) { P0=shiwei; \/\/99的十位 P2=0; \/\/99的个位, delay(300); \/\/动态扫描数码管延时 P0=gewei; P2=1; delay(300); } }void tim(void) interrupt 1 using 1 \/\/...

如何用单片机和数码管制作倒计时表
CJNE A,#100,T0E MOV R2,#0 MOV A,R0 JZ T003 DEC R0 SJMP T0ET003: MOV A,R1 JZ T004 DEC R1 MOV R0,#9T0E: RETIT004: CLR TR0 RETITABLE: ; 共阴极数码管显示代码表 DB 3FH,06H,5BH,4FH,66H ;01234 DB 6DH,7DH,07H,7FH,6FH ;56789END ...

C51单片机 制作一个数码管24秒倒计时的源程序 求大神
很简单啊,用单片机定时器先定时20ms,再计数50次,即1s,再计数24次,即24秒。计时结束后输出 控制信息 值LED端口就行了!手打不易,如有帮助请采纳,谢谢!!

急求单片机数码管显示交通灯倒计时的汇编程序
2秒 DE1: MOV R6,#200 DE2: MOV R7,#126 DE3: DJNZ R7,DE3 DJNZ R6,DE2 DJNZ R5,DE1 RET DISP: MOV DPTR,#PORT ;273显示单元 CPL A MOVX @DPTR,A RET END 你看看行不行 如果不行你自己再稍微改一下吧 反正大概就这些了 ...

单片机怎么写才能让led灯每隔5秒亮下一个并且数码管一直从5到0显示倒...
设为共阳极七段数码管;char segCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} \/\/共阳极七段码 char bitCode[]={0x01,0x02,0x04,0x08,0x10,0x20} \/\/共阳极6位位码,高电平有效 \/***在指定位显示数据***\/ \/\/ m为待显示的七段码数据 \/\/ k为指定的位显示...

单片机数码管倒计时结束 LED小灯亮 这段程序怎么写呢
首先进行位定义 如果led接在p1.0口 可以sbit led=P1^0;然后在定时器sec=0后面加语句led=~led;

单片机编程:用数码管和led实现,用数码管倒计时10秒,LED左移闪烁一次...
\/\/关闭数码管 for(m=0; m<5; m++){\/\/LED闪烁 led=0; Delay(100); led=1; Delay(100); } j=11; } j--; m=0; } }}\/\/经过测试的。。。

阿克塞哈萨克族自治县18464284326: 单片机99秒倒计时 -
惠力洛威: 用定时器,很简单的,我这里有个程序你可以参考一下#include "clock.h" void delay(uint t) { uint i; while(t--) { /* 对于12M时钟,约延时1ms */ for (i=0;i<100;i++) {} } } void main() { initial(); P0=0x00; sec=min=hour=0; flag=1; while(1) { while(flag) { ...

阿克塞哈萨克族自治县18464284326: 利用AT89C51单片机实现两个共阳数码管倒数计时99秒,求程序!!要求是C语言的 -
惠力洛威: 这是正时,改动一下 #include unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00}; unsigned char second; unsigned char keycnt; unsigned int tcnt; void main(void) { unsigned...

阿克塞哈萨克族自治县18464284326: 51单片机 数码管实现九秒倒计时的程序 -
惠力洛威: void main() {uchar i;GPIO_P1=0x00;while(1){for(i=9;i>0;i--){GPIO_P1=Nixie[i];delay(300);}} }

阿克塞哈萨克族自治县18464284326: AT98C51单片机数码管显示0.0秒到9.9秒循环计时C语言程序 -
惠力洛威: #include<reg51.h>#define uchar unsigned char uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9 unsigned char times=0,sec=0,sec01,scanled; unsigned char disdat[2]; void dischg() { disdat[0]=sec01; disdat[1]=sec; } ...

阿克塞哈萨克族自治县18464284326: 用C语言51单片机编写数码管从00到99的循环程序 -
惠力洛威: {TMOD=0x01;ET0=1;EA=1;TR0=1;TH0=0x3c;TL0=0xaf; }void time_1s (void) interrupt 1 {int ncount;TH0=0x3c;TL0=0xaf;ncount++;if(ncount<20) return;{ncount=0;i++;if(i==100) i=0;} }

阿克塞哈萨克族自治县18464284326: 51单片机数码管倒计时程序,从999999开始倒计时,用定时器T1的中断完成 -
惠力洛威: 这个和代码顺序有关系: while (1) { if (flag1s == 1) //判断1秒定时标志 { flag1s = 0; //1秒定时标志清零 sec--; //秒计数自减1【这里是先减一,后面再送显示】 //将sec按十进制位从低到高依次提取到buf数组中 buf[0] = sec%10; buf[1] = sec/10%10; ...

阿克塞哈萨克族自治县18464284326: 51单片机做一个10秒倒计时的程序 -
惠力洛威: C语言 #include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit p27=P2^7;//数码管位选端定义 uchar c,i; //数码管译码表 unsigned char code NumDecode[] = { 0XC0,//;0 0XF9,//;1 0XA4,//;2 0XB0,//;3 0X99,//;4 0X92,//;5 0X...

阿克塞哈萨克族自治县18464284326: 『求助』用51单片机定时器实现99秒表倒计时功能 -
惠力洛威: K1 EQU P1.0 K2 EQU P1.1 K3 EQU P1.2 ORG 0000H LJMP MAIN ORG 000BH LJMP T0ISR ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-10000) MOV TL0,#LOW(65536-10000) SETB ET0 SETB TR0 SETB EA MOV R0,#9 ...

阿克塞哈萨克族自治县18464284326: 单片机求助C语言编程 实现99秒倒计时到0秒停止! 求好心人哪! -
惠力洛威: #include<reg51.h> // 包含51单片机寄存器定义的头文件 unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示0~9的段码表 unsigned char int_time; //记录中断次数 unsigned char second; //储存秒/**...

阿克塞哈萨克族自治县18464284326: 关于单片机AT89C51程序,利用两个数码管,利用按键控制实现“数字减一”显示99到00. -
惠力洛威: #include "reg52.h" #include<intrins.h> #define uchar unsigned char uchar code LED_TAB[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned int x=9999; void delay(unsigned int z) { unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网