Ⅰ 51單片機中如何用匯編語言編寫流水燈
51單片機中可以用以下匯編語言程序實現流水燈效果:
程序啟動和中斷設置:
ORG 0000H:設置程序復位啟動地址。
AJMP START:跳轉到主程序開始處。
ORG 001BH:設置定時器1中斷向量地址。
AJMP T1INT:跳轉到定時器1中斷服務程序。
變數定義:
YSJS EQU 30H:定義延時計數器變數,用於記錄中斷次數。
LED EQU 31H:定義LED控制緩沖器變數,存儲當前點亮的LED狀態。
主程序初始化:
MOV LED,#0FEH:初始化LED狀態,假設低電平點亮,則從右往左第一個LED亮。
MOV YSJS,#0:清零延時計數器。
設置定時器1為方式1,並設置定時初值以實現50ms的定時。
SETB ET1:使能定時器1中斷。
SETB TR1:啟動定時器1。
SETB EA:開總中斷。
MOV P1,LED:將初始LED狀態輸出到P1口。
主程序循環:
LOOP: JMP LOOP:主程序進入一個無限循環,等待中斷。
定時器1中斷服務程序:
保護現場:PUSH PSW 和 PUSH ACC。
重新裝載定時初值以維持50ms的定時。
INC YSJS:中斷計數器加1。
檢查是否達到100ms:
如果是,執行MOV P1,LED。
將LED變數中的值循環左移一位,實現流水燈效果。
清零延時計數器YSJS。
恢復現場:POP ACC 和 POP PSW。
RETI:返回主程序。
注意事項: 在上述代碼中,有一處小錯誤:MOV A,YSJI 應為 MOV A,YSJS,因為YSJI並未定義,而YSJS是之前定義的延時計數器變數。 流水燈效果是通過在每次定時器中斷時,將LED控制變數循環左移一位來實現的,這樣每次只有一個LED被點亮,並且位置不斷移動,從而形成流水燈效果。