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
|