求C51单片机汇编语言控制两位数码管倒计时程序,从60秒到30秒再到90秒并循环倒计时显示。

以下是现成的程序,但只能显示60秒倒计时循环显示,请高手帮忙改下,能实现从60秒到30秒再到90秒并循环倒计时显示。谢谢啦

查询方式:

ORG 00H

START: MOV R0,#20
MOV R4,#60

LP0: MOV TMOD,#01H

MOV TH0,#3CH

MOV TL0,#0B0H

MOV DPTR,#TABLE
SETB TR0

LP1: JBC TF0,LP2
ACALL DISP
AJMP LP1

LP2: DJNZ R0,LP0
CLR TR0
MOV R0,#20
MOV A,R4
CJNE A,#0,DEC1
MOV R4,#60
AJMP JP1

DEC1: DEC A
MOV R4,A

JP1: ACALL DISP
AJMP LP0

DISP: MOV A,R4
MOV B,#10
DIV AB
;当前值除以10
MOV 20H,A
;得出的商送给十位
MOV 21H,B
;得出的余数送给个位

MOV A,20H
;十位显示
MOVC A,@A+DPTR
MOV P0,A
SETB P2.1
LCALL DELAY
CLR P2.1

MOV A,21H
;个位显示
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
LCALL DELAY
CLR P2.0
RET

DELAY: ;误差 0us
MOV
R6,#10

DL0:
MOV
R5,#50
DJNZ
R5,$
DJNZ
R6,DL0
RET

TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H ;共阳极0-9显示代码
DB 92H,82H,0F8H,80H,90H

END

第1个回答  推荐于2017-12-16
从60秒到30秒再到90秒并循环倒计时显示。
----
有点不好理解。

从60秒到30秒,看来,是倒计时。
到了30之后,怎么办?是立即改为90吗?
到了90之后,再怎么办?是立即改为60吗?追问

是倒计时,就像红绿灯的倒计时那样。从60秒倒计时开始到01,之后变成30秒倒计时到01,之后,变成90秒倒计时到01,之后再到60秒,就跟前边的接上了

追答

轮流使用三种初始时间:60、90、30,分别倒计时到1。

追问

如何编写程序呀?您能帮我改下我的程序吗?

追答

试试看,已经可以了:

ORG 0000H
START:
MOV DPTR, #TABLE
MOV TMOD, #01H
SETB TR0
MOV R0, #20
LL0:
MOV R2, #0
MOV R4, #60
LP0:
MOV TH0, #3CH
MOV TL0, #0B0H
LP1:
JBC TF0, LP2
CALL DISP
SJMP LP1
;-------------------------------
LP2:
DJNZ R0, LP0
MOV R0, #8 ;20
DJNZ R4, LP0
INC R2
CJNE R2, #1, LL1
MOV R4, #30
JMP LP0
;----------------------
LL1:
CJNE R2, #2, LL0
MOV R4, #90
JMP LP0
;-------------------------------
DISP:
MOV A, R4
MOV B, #10
DIV AB ;当前值除以10
MOVC A, @A + DPTR
MOV P0, A
SETB P2.1

DJNZ R5, $
DJNZ R5, $
CLR P2.1

MOV A, B ;个位显示
MOVC A, @A + DPTR
MOV P0, A
SETB P2.0

DJNZ R5, $
DJNZ R5, $
CLR P2.0

RET
;--------------------------
TABLE:
DB 0C0H, 0F9H, 0A4H, 0B0H, 99H ;共阳极0-9显示代码
DB 92H, 82H, 0F8H, 80H, 90H
;--------------------------
END

本回答被提问者采纳
第2个回答  2013-03-09
开始就有逻辑问题.
要做多次倒计时,应该做些改动...
再把主要的部分作为1个子程序:LP1: ----
----
RET
还要自己调一下. 希望能帮助你.
START: MOV TMOD,#01H

MOV TH0,#3CH

MOV TL0,#0B0H

MOV DPTR,#TABLE
SETB TR0

LPP: MOV R0,#20
MOV R4,#60
ACALL LP1
MOV R0,#20
MOV R4,#30
ACALL LP1
MOV R0,#20
MOV R4,#90
SJMP LPP

LP1: JBC TF0,LP2
.....

JP1: ACALL DISP
RET追问

请问您省略的这个子程序
LP1: ----
----
RET
如何编写呀?自己还是不知道如何编写...

追答

就是你原来的啊

追问

LP1: JBC TF0,LP2
ACALL DISP
AJMP LP1
LP2: DJNZ R0,LP0
CLR TR0
MOV R0,#20
MOV A,R4
CJNE A,#0,DEC1
MOV R4,#60
AJMP JP1
DEC1: DEC A
MOV R4,A
JP1: ACALL DISP
AJMP LP0

这样写对吗?

追答

就是把这段改成一个子程序...
最后一句;AJMP LP0 改为 RET
试一下吧!

追问

好的,谢谢~

追答

我还以为昨天你就搞定了呢...
不用谢.

第3个回答  2013-03-09
ORG 00H
START:
MOV R0,#20
MOV R4,#60
MOV R5,#0
LP0:
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
LP1:
JBC TF0,LP2
ACALL DISP
AJMP LP1
LP2:
DJNZ R0,LP0
CLR TR0
MOV R0,#20
MOV A,R4
CJNE A,#0,DEC1
INC R5
MOV DPTR,#TAB
MOV A,R5
CJNE A,#3,LP3
MOV R5,#0
LP3:
MOVC A,@A+DPTR
MOV R4,A
AJMP JP1
DEC1:
DEC A
MOV R4,A
JP1:
ACALL DISP
AJMP LP0
DISP:
MOV DPTR,#TABLE
MOV A,R4
MOV B,#10
DIV AB ;当前值除以10
MOV 20H,A ;得出的商送给十位
MOV 21H,B ;得出的余数送给个位
MOV A,20H ;十位显示
MOVC A,@A+DPTR
MOV P0,A
SETB P2.1
LCALL DELAY
CLR P2.1
MOV A,21H ;个位显示
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
LCALL DELAY
CLR P2.0
RET
DELAY: ;误差 0us
MOV R6,#10
DL0:
MOV R5,#50
DJNZ R5,$
DJNZ R6,DL0
RET
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H ;共阳极0-9显示代码
DB 92H,82H,0F8H,80H,90H
TAB:
DB 60,30,90
END追问

您编写的程序到30秒的时候,不能跳转到90秒而是一直保持30秒循环,请问如何修改?