單片機編程:鍵控定時燈
如圖所示的電路,要求開機時燈滅,按一下按鈕,燈D1亮,延時10秒后自動熄滅。
若在燈亮期間再按一下按鈕,則燈立即熄滅。
試編寫實現(xiàn)上述功能的完整程序。 要用匯編的哦,C俺還沒學(xué)。
;-------------------------------------------------------
這個題目,共有四人給出了程序,樓主選擇的,卻是一個最差的程序。
有位網(wǎng)友,已經(jīng)對做而論道的程序和另一個程序,進(jìn)行了對比,結(jié)果說明做而論道的程序是正確的。
下面把做而論道的程序?qū)懺谙旅?,供大家評論。
下列程序,經(jīng)過仿真,可以滿足要求。
;================================
ORG 0000H
START:
JNB P3.2, $
SETB P1.0
JB P3.2, $
CALL DL10ms
JB P3.2, START
JNB P3.2, $
CLR P1.0
MOV R4, #10
S2_DL1:
MOV R5, #100
S2_DL2:
JNB P3.2, START
CALL DL10ms
DJNZ R5, S2_DL2
DJNZ R4, S2_DL1
SJMP START
;--------------------------------
DL10ms:
MOV R6, #20 ;延時10ms
DELAY:
MOV R7, #248
DJNZ R7, $
DJNZ R6, $ - 4
RET
;================================
END
;本程序雖然沒有使用定時器,經(jīng)過仿真證明,時間的誤差在11毫秒之內(nèi),約為萬分之一。
最佳答案:
--------------------------------------
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INTI
ORG 0030H
MAIN:
MOV SP, #60H
SETB EX0
SETB EA
SETB IT0
JB P1.0, $ ;等待按鍵按下
LCALL DELAY ;延時
SETB P1.0
LJMP $ ;繼續(xù)等待
INTI:
CPL P1.0
RETI
DELAY: ;延時10.060秒
MOV R7, #80
D1: MOV R6, #250
D2: MOV R5, #250
DJNZ R5, $
DJNZ R6, D2
DJNZ R7, D1
RET
END
--------------------------------------
點評:
該程序,只是在第一次按鍵的時候,亮燈10秒后自動關(guān)閉;以后再按下按鍵,就沒有定時關(guān)燈的現(xiàn)象了。
該程序沒有消抖的功能,在亮燈10秒期間,再按下按鍵,會有什么現(xiàn)象?顯示將會很亂。
另外,延時10秒,誤差為60毫秒,在四個程序中,這個程序的誤差最大。
************************************************************