#include<reg51h>
#define uchar unsigned char
#define uint unsigned int
uchar DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//主程序
void main()
{
P0=0x06; //显示10
P2=0x3f;
i=0;
Second_Counts=100;
TMOD=0x01; //定时器0方式1
TH0=(65536-50000)/256; //定时器0: 5ms
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1
while(1) ;
}
//T0中断函数
void DSY_Refresh() interrupt 1
{
TH0=(65536-50000)/256; //恢复定时器0初值
TL0=(65536-50000)%256;
if(++i==2) //50ms2=01s转换状态
{
i=0;
Second_Counts--;
P0=DSY_CODE[Second_Counts/100];
P2=DSY_CODE[(Second_Counts/10)%10];
if(Second_Counts<=-1) Second_Counts=100; //显示10
}
}
K1 EQU P10
K2 EQU P11
K3 EQU P12
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
MOV R1,#9
MOV R2,#0
MOV R3,#99
CLR 00H
CLR 01H
LOOP:
JB K1,LP01
JNB K1,$
CLR 01H
INC R3
CJNE R3,#100,LOOP0
MOV R3,#0
SJMP LOOP0
LP01:
JB K2,LP02
JNB K2,$
CLR 01H
CJNE R3,#0,LP011
MOV R3,#99
SJMP LOOP0
LP011:
DEC R3
SJMP LOOP0
LP02:
JB K3,LOOP
JNB K3,$
SETB 01H
SJMP LOOP
LOOP0:
MOV A,R3
MOV B,#10
DIV AB
MOV R0,B
MOV R1,A
SJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB TR0
MOV DPTR,#TABLE
T0C:
CPL 00H
JB 00H,T001
MOV P3,#0FDH
MOV A,R1
MOVC A,@A+DPTR
MOV P2,A
SJMP T002
T001:
MOV P3,#0FEH
MOV A,R0
MOVC A,@A+DPTR
MOV P2,A
T002:
JNB 01H,T0E
INC R2
MOV A,R2
CJNE A,#100,T0E
MOV R2,#0
MOV A,R0
JZ T003
DEC R0
SJMP T0E
T003:
MOV A,R1
JZ T004
DEC R1
MOV R0,#9
T0E:
RETI
T004:
CLR 01H
MOV R4,#16
T005:
CPL P00
LCALL DELAY
DJNZ R4,T005
RETI
DELAY:
MOV R6,#200
DLY:
MOV R7,#250
DJNZ R7,$
DJNZ R6,DLY
RET
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6FH ;56789
END
C语言的我这里有。
以下是24倒计时的程序。你修改TABLE: 中的数据内容就可以达到你的要求的了。里面用到了两片7447芯片。。。
ORG 0000h
AJMP START
ORG 0030H
START: CLR P31 ;D1亮
JB P37,START ;按下K1倒计时启动
SETB P31 ;D1灭
CLR P30 ;D2亮
MOV TMOD,#01H ;设定时器TIMER0工作在模式1
MOV DPTR,#TABLE
NEXT: MOV A,#00H
MOVC A,@A+DPTR
MOV P1,A
MOV R3,#20 ;延时1秒
LCALL DELAY
INC DPTR ;数据指针加1
CJNE A,#0FFH,NEXT
MOV P1,#0FFH
SETB P30
LJMP START
; 延时05秒子程序
DELAY: SETB TR0 ;起动TIMER0开始计时
AGAIN: MOV TL0,#LOW(65536-50000) ;设定时器TL0的值
MOV TH0,#HIGH(65536-50000) ;设定时器TH0的值
LOOP2: JBC TF0,LOOP3 ;判断TF=1?,是则跳转至LOOP3,并清除TF0
JMP LOOP2 ;TF0不为1则跳转至LOOP2
LOOP3: DJNZ R3,AGAIN ;R3是否为0?不是则跳转至AGAIN
CLR TR0 ;是则停止TIMER0计数
RET
;显示数码表
TABLE:
DB 24H,23H,22H,21H,20H,19H,18H,17H,16H,15H,14H,13H
DB 12H,11H,10H,09H,08H,07H,06H,05H,04H,03H,02H,01H
DB 0FFH ;结束码
END
delay(int t)这个是延时子程序,如果采用20M晶振的话,调用一次延时t毫秒。
display()是数码管动态扫描显示子程序,位控位为P30、P31,段码控制为P1。扫描间隔时间为5毫秒左右。
#include<AT89X51H>
unsigned char flag1=0;
unsigned char counter=0;
unsigned char first=0;
unsigned char second=0;
unsigned char code dptable[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段码表
main()
{
TMOD=0x10;//定时器T1,方式1
TH1=0xfa;//晶振为36864MHz,每5ms进一次中断
TL1=0x00;
TR1=1;
ET1=1;
EA=1;
while(1)
{
P1_0=1;//P1口为位选
P2=dptable[second];//P2口为段选
P1_0=0;
while(flag1==0);//动态扫描,每个数码管亮5ms
flag1=0;
P1_0=1;
P2=dptable[first];
P1_1=0;
while(flag1==0);
flag1=0;
P1_1=1;
}
}
void interT1() interrupt 3//5ms进一次中断
{
TH1=0xfa;
TL1=0x00;
flag1=1;
counter++;
if(counter==200)//定时至1s
{
counter=0;
first--;
if(first==255)
{
first=9;
second--;
}
if(second==255)
{
second=7;
first=9;
}
}
}
从60秒到30秒再到90秒并循环倒计时显示。
----
有点不好理解。
从60秒到30秒,看来,是倒计时。
到了30之后,怎么办?是立即改为90吗?
到了90之后,再怎么办?是立即改为60吗?
以上就是关于51单片机编程2位数码管倒计时,从10秒开始每隔一秒减一当减到零有重复回到10秒全部的内容,包括:51单片机编程2位数码管倒计时,从10秒开始每隔一秒减一当减到零有重复回到10秒、用51单片机C语言版设计秒表倒计时、51单片机 汇编语言 两个七段共阳数码管 60S倒计时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)