ORG 0000H LJMP START ORG 2000H START: MOV TMOD,#01H ;置T0為工作方式1 MOV TH0,#9EH ;置T0定時初值25ms MOV TL0,#57H CLR TF0 SETB TR0 ;啟動T0 ;*************************************************** MOV R2,#20 ;置1s計數初值,50ms*20=1s MOV R3,#5 ;紅燈亮5s WAIT0: LCALL STATE0 ;調用狀態0 JNB TF0,WAIT0 ;查詢50ms到否 CLR TF0 MOV TH0,#9EH ;置T0定時初值25ms MOV TL0,#57H DJNZ R2,WAIT0 ;判斷1s到否未到繼續狀態0 MOV R2,#20 ;置50ms計數初值 DJNZ R3,WAIT0 ;狀態0維持5s ;**************************************************** LOOP: MOV R2,#20 ;置50ms計數初值 MOV R3,#20 ;南北綠燈東西紅燈亮20s WAIT1: LCALL STATE1 ;調用狀態1 JNB TF0,WAIT1 ;查詢50ms到否 CLR TF0 MOV TH0,#9EH ;置T0定時初值25ms MOV TL0,#57H DJNZ R2,WAIT1 ;判斷1s到否未到繼續狀態1 MOV R2,#20 ;置100ms計數初值 DJNZ R3,WAIT1 ;狀態1維持20s ;**************************************************** MOV R2,#10 ;置循環次數 MOV R4,#10 ;閃爍間隔500ms LCALL STATE2 ;調用狀態2 WAIT2: JNB TF0,WAIT2 ;查詢50ms到否 CLR TF0 MOV TH0,#9EH ;置T0定時初值25ms MOV TL0,#57H DJNZ R4,WAIT2 ;判斷500ms到否未到繼續狀態2 CPL P1.1 ;南北黃燈閃 MOV R4,#10 ;閃爍間隔500ms DJNZ R2,WAIT2 ; ;******************************************* MOV R2,#20 ;置50ms計數初值 MOV R3,#10 ;紅燈亮10s WAIT4: LCALL STATE4 ;調用狀態4 JNB TF0,WAIT4 ;查詢50ms到否 CLR TF0 MOV TH0,#3CH ;恢復T0定時初值50ms MOV TL0,#0B0H DJNZ R2,WAIT4 ;判斷1s到否未到繼續狀態4 MOV R2,#20 ;置1s計數初值 DJNZ R3,WAIT4 ;狀態4維持10s ;******************************************* MOV R2,#10 ;置循環次數 MOV R4,#10 ;閃爍間隔500ms LCALL STATE5 ;調用狀態5 WAIT5: JNB TF0,WAIT5 ;查詢50ms到否 CLR TF0 MOV TH0,#9EH ;置T0定時初值25ms MOV TL0,#57H DJNZ R4,WAIT5 ;判斷500ms到否未到繼續狀態2 CPL P1.6 ;東西黃燈閃 MOV R4,#10 ;閃爍間隔500ms DJNZ R2,WAIT5 ; LJMP LOOP ;大循環 ;********************************************** STATE0: ;狀態0 CLR P1.0 ;南北路口紅燈亮 SETB P1.1 SETB P1.2 CLR P1.5 SETB P1.6 SETB P1.7 ;東西路口紅燈亮 RET STATE1: ;狀態1 SETB P1.0 ;南北路口綠燈亮 SETB P1.1 CLR P1.2 CLR P1.5 SETB P1.6 SETB P1.7 ;東西路口紅燈亮 RET STATE2: ;狀態2 SETB P1.0 ;南北路口黃燈亮 CLR P1.1 SETB P1.2 CLR P1.5 SETB P1.6 SETB P1.7 ;東西路口紅燈亮 RET STATE4: ;狀態4 CLR P1.0 ;南北路口紅燈亮 SETB P1.1 SETB P1.2 SETB P1.5 SETB P1.6 CLR P1.7 ;東西路口綠燈亮 RET STATE5: ;狀態6 CLR P1.0 ;南北路口紅燈亮 SETB P1.1 SETB P1.2 SETB P1.5 SETB P1.6 SETB P1.7 ;東西路口黃燈亮 RET END
|