You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

8051双七段显示99倒计时器高位递减时低位异常问题求助

问题描述

我在Multisim中搭建了如下电路:8051单片机搭配两个七段数码管,其中一个七段数码管连接至74LS373锁存器,一个按键连接至8051的P3.2端口。
Multisim电路

我编写了99倒计时循环代码(计数至00后无限循环),但目前出现高位递减时低位也变为相同数值的异常,请问该如何解决?

以下是我的代码:

$MOD51  
start:
MOV R1,#9
MOV R2,#9
SETB P3.5
MOV A,R1
LCALL display
MOV P1,A
CLR P3.5
MOV A,R2
LCALL display
MOV P1,A
mov r1,#10
check_button:
jnb p3.2,button
dec r1
CJNE R1,#255, disp_ones
dec R2
CJNE R2,#255,disp_tens
lcall finish 
disp_tens:
SETB P3.5
MOV a,R2
LCALL display
MOV P1,a
lcall wait
CLR P3.5
MOV R1,#10
sjmp check_button
disp_ones:
CLR P3.5
MOV a,R1
LCALL display
MOV P1,a
lcall wait
sjmp check_button
button:
jnb p3.2,button_2
sjmp button
button_2:
sjmp check_button

wait:
MOV TMOD, #01H 
MOV TH0, #244 
MOV TL0, #0 
SETB TR0 
wait_loop:
JNB TF0, wait_loop 
CLR TR0 
CLR TF0 
RET
display:
INC A
MOVC A,@A+PC
RET
DB 0C0H ;0
DB 0F9H ;1
DB 0A4H ;2
DB 0B0H ;3
DB 99H ;4
DB 92H ;5
DB 82H ;6
DB 0F8H ;7
DB 80H ;8
DB 90H ;9
DB 88H ;A
DB 83H ;B
DB 0C6H ;C
DB 0A1H ;D
DB 86H ;E
DB 8EH ;F
finish:
sjmp finish
end

问题分析与解决

异常根源

  1. 显示逻辑漏洞:低位数码管直接连接P1口,单独刷新高位时,P1口会被写入高位的显示码,导致低位同步显示该数值,出现“高低位数值一致”的异常。
  2. 初始化对应关系错误:控制高位锁存器(SETB P3.5)后,错误地将低位寄存器R1的数值送显,而非高位R2。
  3. 单一位刷新逻辑缺陷:仅刷新某一位的操作,会导致另一位显示停留在P1口的旧数值上,无法同步更新。

修改方案

  1. 同步刷新两位数码管:每次显示更新时,先锁存高位显示码,再输出低位显示码,确保两位各自显示对应数值。
  2. 修正初始化显示逻辑:初始化时同步刷新两位,确保初始显示正确。
  3. 简化计数逻辑:低位减到0后直接重置为9,逻辑更直观,避免依赖CJNE的特殊值判断。

修改后的代码

$MOD51  
start:
MOV R1,#9    ; R1存储低位数值
MOV R2,#9    ; R2存储高位数值
LCALL refresh_display  ; 初始化同步显示99

check_button:
JNB P3.2, button_wait  ; 检测按键,按下则等待释放
; 未按键,执行倒计时逻辑
DEC R1
CJNE R1,#0FFH, refresh_display  ; 低位未到0,刷新显示
; 低位减至-1(0FFH),重置低位为9,高位减1
MOV R1,#9
DEC R2
CJNE R2,#0FFH, refresh_display  ; 高位未到0,刷新显示
; 高位也减至-1,进入00后死循环
SJMP finish

button_wait:
JNB P3.2, button_wait  ; 等待按键释放,避免误触发
SJMP check_button

; 同步刷新两位数码管子程序
refresh_display:
; 刷新高位:置高锁存控制端,送高位显示码到P1,锁存后置低
SETB P3.5
MOV A,R2
LCALL display
MOV P1,A
CLR P3.5
; 刷新低位:直接送低位显示码到P1(低位直接连P1)
MOV A,R1
LCALL display
MOV P1,A
LCALL wait  ; 延时保持显示效果
RET

wait:
MOV TMOD, #01H 
MOV TH0, #244 
MOV TL0, #0 
SETB TR0 
wait_loop:
JNB TF0, wait_loop 
CLR TR0 
CLR TF0 
RET

display:
INC A
MOVC A,@A+PC
RET
DB 0C0H ;0
DB 0F9H ;1
DB 0A4H ;2
DB 0B0H ;3
DB 99H ;4
DB 92H ;5
DB 82H ;6
DB 0F8H ;7
DB 80H ;8
DB 90H ;9
DB 88H ;A
DB 83H ;B
DB 0C6H ;C
DB 0A1H ;D
DB 86H ;E
DB 8EH ;F

finish:
SJMP finish
end

修改说明

  • 新增refresh_display子程序,确保每次更新时同步刷新高低位,彻底解决P1口数值覆盖导致的显示异常。
  • 优化计数逻辑,低位重置和高位递减的逻辑更清晰,可读性更强。
  • 调整按键处理逻辑,增加释放等待,避免单次按键触发多次计数。

内容的提问来源于stack exchange,提问作者Linfoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:45:22