1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| ; EW -> East & West,东西 ; SN -> South & North,南北
ORG 0000H SJMP MAIN
ORG 000BH ;T0(定时器)中断服务程序入口 LJMP T0_ISR
ORG 0030H MAIN: MOV A,#0FFH MOV P1,A ;所有灯熄灭 MOV TMOD,#61H ;0110 0001:设置T1为计数器,方式2;设置T0为定时器,方式1 MOV TH0,#4CH MOV TL0,#01H SETB ET0 ;允许T0中断 SETB TR0 ;启动T0 SETB EA ;开中断总控
LOOP: MOV TH1,#9CH ;10s MOV TL1,#9CH ;T1采用查询方式,不允许中断 SETB TR1 ;启动T1
CLR P1.5 ;点亮东西绿 CLR P1.1 ;点亮南北红 JNB TF1,$ ;若10s未到,等待 MOV R0,#06H ;10s到了,装载R0(为控制绿灯闪烁次数而设的计数变量) CALL_EW_GREEN_FLASH: ACALL GREEN_EW_FLASH ;绿灯闪烁(闪烁三秒--->调用六次) DJNZ R0,CALL_EW_GREEN_FLASH SETB P1.5;东西绿闪烁结束,熄灭东西绿 CLR TR1 ;停止T1 CLR P1.6;点亮东西黄 MOV TH1,#0ECH ;2s MOV TL1,#0ECH SETB TR1 ;启动T1 JNB TF1,$ ;若2s未到,等待 CLR TR1 ;2s到了,停止T1 CLR TF1 ;清中断标志位 SETB P1.6;熄灭东西黄 SETB P1.1;熄灭南北红 CLR P1.4;点亮东西红 CLR P1.2;点亮南北绿 MOV TH1,#9CH ;10s MOV TL1,#9CH SETB TR1;启动T1 JNB TF1,$ ;若10s未到,等待 MOV R0,#06H ;10s到了,装载R0(为控制绿灯闪烁次数而设的计数变量) CALL_SN_GREEN_FLASH: ACALL GREEN_SN_FLASH ;绿灯闪烁(闪烁三秒--->调用六次) DJNZ R0,CALL_SN_GREEN_FLASH SETB P1.2;南北绿闪烁结束,熄灭南北绿 CLR TR1 ;停止T1 CLR P1.3;点亮南北黄 MOV TH1,#0ECH ;2s MOV TL1,#0ECH SETB TR1 ;启动T1 JNB TF1,$ ;若2s未到,等待 CLR TR1 ;2s到了,停止T1 CLR TF1 ;清中断标志位 SETB P1.3;熄灭南北黄 SETB P1.4;熄灭东西红 SJMP LOOP
T0_ISR: ;50ms到了 MOV TH0,#4CH ;重装载 MOV TL0,#01H CPL P1.0 RETI
GREEN_EW_FLASH: JNB TF1,$ ;若0.5s未到,等待(第一次进入GREEN_EW_FLASH时,标志位TF1未清零,不会等待) CLR TR1 ;0.5s到了,停止T1 CLR TF1 ;清中断标志位 CPL P1.5 ;东西绿开始闪烁 MOV TH1,#0FBH ;0.5s MOV TL1,#0FBH SETB TR1 ;启动T1 RET
GREEN_SN_FLASH: JNB TF1,$ ;若0.5s未到,等待(第一次进入GREEN_SN_FLASH时,标志位TF1未清零,不会等待) CLR TR1 ;0.5s到了,停止T1 CLR TF1 ;清中断标志位 CPL P1.2 ;南北绿开始闪烁 MOV TH1,#0FBH ;0.5s MOV TL1,#0FBH SETB TR1 ;启动T1 RET
END
|