assembly 8051单片机与AT89S52单片机集成开发环境汇编语言

68de4m5k  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(112)

我有一个关于单片机8051 IDE的汇编语言问题,用AT89S52单片机编写一个程序,复制一个一键输入的行人过街灯,系统会一直处于STOP状态,直到按下一个按钮,经过一段延时,状态将转换到GO状态,并将在此状态停留较长的延迟。然后系统将转换回STOP状态。有人有想法解决吗?是吗?非常感谢
这是我的代码。它没有像我预期的那样工作。正如我之前提到的,我使用MCU 8051 IDE与AT89S52微控制器。当我运行程序时,我连接到P1.0和P1.1的LED灯亮起。当我按下按钮时,过了一段时间,P1.0的LED灯熄灭了。不再亮了。P1.1的LED灯仍然继续亮着。在这种情况下,我的错误在哪里?

ORG 00H ; Start of code memory
    
    MOV A,#00H
    MOV P1,A    ; SET PORT 1 AS OUTPUT PORT
    MOV A,#0FFH
    MOV P2,A    ; SET PORT 2 AS INPUT PORT
    
WAIT_FOR_BUTTON_PRESS:
    MOV R2, #03H  ; Initialize a counter for stable button state

CHECK_BUTTON_STATE:
    JNB P2.0, BUTTON_RELEASED  ; If the button is released, proceed
    CALL DELAY_MS  ; Introduce a small delay
    JB P2.0, CHECK_BUTTON_STATE  ; If the button is still pressed, continue checking
    DEC R2  ; Decrement the counter
    JZ BUTTON_PRESSED  ; If the button state is stable, consider it pressed

BUTTON_RELEASED:
    MOV R2, #03H  ; Reset the counter if the button is released
    SJMP WAIT_FOR_BUTTON_PRESS  ; Continue waiting for a button press

BUTTON_PRESSED:
    MOV P1, #01H  ; Set initial state to STOP
    CALL DELAY_SEC  ; Wait for a delay

TRAFFIC_LIGHT_LOOP:
    MOV P1, #02H    ; Set state to GO
    CALL DELAY_SEC  ; Wait for a longer delay

    MOV P1, #01H    ; Set state to STOP
    CALL DELAY_SEC  ; Wait for a delay

    SJMP TRAFFIC_LIGHT_LOOP ; Repeat the traffic light sequence

DELAY_MS:
    MOV R1, #5
    
DELAY_MS_LOOP:
    MOV R0, #50
    
DELAY_LOOP:
    DJNZ R0, DELAY_LOOP
    DJNZ R1, DELAY_MS_LOOP
    RET

DELAY_SEC:
        MOV R1, #5
DELAY_SEC_LOOP:
    CALL DELAY_MS   ; Call the millisecond delay routine
    DJNZ R1, DELAY_SEC_LOOP
    RET

    END

字符串
有人发现了我上面代码中的错误吗?谢谢。

jv2fixgn

jv2fixgn1#

在循环TRAFFIC_LIGHT_LOOP:中没有退出条件测试,那么为什么你期望它永远做循环体所做的以外的事情呢?
(Only通过使用中断,你可以退出那个循环,但是你没有说过也没有展示过设置定时器或其他中断。)

相关问题