有个题目,要求使用 51 单片机驱动两个数码显示器,以 0.1s 递增,从 0.0 增到 10s。
设计一个按键,按下一次,启动,再按,暂停,再按一次,清零。循环不已。
做而论道先写了一个 0.0 ~ 9.9s 的。后来百度 Hi 传来信息,说是有追问。

但是,点击《查看详细》后,百度却找不到问题网页了。

唉,无奈的百度,迷失了自我。
做而论道只好把电路和程序,发表在下面了。
仿真电路:

程序:
;---------------------------------------
;http://zhidao.baidu.com/question/485975186.html
;0.0 ~ 9.9
;P0, P2静态显示
;设系统晶振为12MHz。
;按键连接在P3.7,
;按一下,计时,再按一下,停止,再按一下,清零。
;---------------------------------------
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
;---------------------------------------
ORG 0100H
INIT: ;初始化
MOV P0, #3FH
MOV P2, #3FH
MOV R1, #0
MOV R2, #0
MOV R3, #20
MOV DPTR, #TAB ;表首址送DPTR
MOV TMOD, #01H
MOV TL0, #(65536 - 5000) MOD 256
MOV TH0, #(55536 - 5000) / 256
CLR TR0
CLR P3.6
RET
;---------------------------------------
MAIN:
CALL INIT
MOV R4, #255
SETB ET0
SETB EA
;---------------------------------------
M_LOOP:
JB P3.7, M_LOOP
CALL DLY
JB P3.7, M_LOOP
JNB P3.7, $
INC R4
CJNE R4, #3, M1
MOV R4, #0
M1: CJNE R4, #2, M2
CALL INIT
SJMP M_LOOP
M2: CPL TR0
SJMP M_LOOP
;---------------------------------------
T0_INT:
MOV TL0, #(65536 - 5000) MOD 256
MOV TH0, #(55536 - 5000) / 256
DJNZ R3, T0_E
MOV R3, #20
INC R1
CJNE R1, #10, T0_1
MOV R1, #0
INC R2
CJNE R2, #10, T0_2
MOV R2, #0
MOV P0, #06H
MOV P2, #3FH
SETB P3.6
CLR TR0
MOV R4, #1
RETI
T0_2:
MOV A, R2 ;显示十位
MOVC A, @A + DPTR
SETB ACC.7
MOV P0, A
T0_1:
MOV A, R1 ;显示个位
MOVC A, @A + DPTR
MOV P2, A
T0_E:
RETI
;---------------------------------------
TAB: DB 3FH, 06H, 5BH, 4FH, 66H;0~4
DB 6DH, 7DH, 07H, 7FH, 6FH;5~9
;---------------------------------------
DLY:
MOV R6, #20 ;10ms延时.
D1: MOV R7, #248
DJNZ R7, $
DJNZ R6, D1
RET
;---------------------------------------
END
本文介绍了一种利用51单片机驱动两个数码显示器进行0.1秒递增计时的方法,并通过按键实现启动、暂停与清零功能。程序代码包括初始化、主循环、中断服务等关键部分,展示了如何实现时间显示与控制的基本步骤。
1767

被折叠的 条评论
为什么被折叠?



