51单片机编程2位数码管倒计时,从10秒开始每隔一秒减一当减到零有重复回到10秒

51单片机编程2位数码管倒计时,从10秒开始每隔一秒减一当减到零有重复回到10秒,第1张

#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倒计时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10113418.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存