我有一个关于单片机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
字符串
有人发现了我上面代码中的错误吗?谢谢。
1条答案
按热度按时间jv2fixgn1#
在循环
TRAFFIC_LIGHT_LOOP:
中没有退出条件测试,那么为什么你期望它永远做循环体所做的以外的事情呢?(Only通过使用中断,你可以退出那个循环,但是你没有说过也没有展示过设置定时器或其他中断。)