H_RED BIT P2.1 ;定義IO端口 H_GREEN BIT P2.2 H_YELLOW BIT P2.3 L_RED BIT P2.4 L_GREEN BIT P2.5 L_YELLOW BIT P2.6 ;主程序,選擇設(shè)置紅綠燈時(shí)間模式或自動(dòng)調(diào)整模式 ORG 0000H LJMP MAIN ORG 0003H ;中斷入口 LJMP INT0 ORG 0030H MAIN: MOV R3, #20 ;用于嵌套50ms軟件方法計(jì)時(shí)1s MOV R0, #20 ;預(yù)設(shè)值紅綠燈時(shí)間 MOV R1, #20 CLR EX0 K1: MOV C, P3.7 ;等待檢測何種模式按鍵按下 ANL C, P3.2 JB C, K1 JNB P3.7, F ;F鍵按下為自動(dòng)模式,進(jìn)入掃描 K2: JNB P3.2, S ;S鍵按下并等待計(jì)數(shù)次數(shù) SJMP K2 F: LCALL DELAY MOV R0, #30 MOV R1, #30 SETB 00H SETB EA SETB EX1 SJMP START S: LCALL DELAY CJNZ R0, #40, V1 MOV R0, #20 V1: INC R0 JNB P0.1, $ JNB P3.6, J ;J鍵按下并等待計(jì)數(shù)次數(shù) SJMP K2 J: LCALL DELAY CJNZ R1, #40, V2 MOV R1, #20 V2: INC R1 JNB P3.6, $ JNB P3.7, START ;設(shè)置完畢為設(shè)定時(shí)間模式,進(jìn)入掃描 JNB P3.6, J MOV P2, #0DDH ;預(yù)設(shè)信號(hào)燈狀態(tài),時(shí)間和車向 MOV R4, R0 SETB 01H SETB EX0 ;程序開始,進(jìn)行每50ms掃描 START: MOV TMOD, #01H MOV TH0, #3CH MOV TL0, #0B0H CLR TF0 SETB TR0 ;開始50ms計(jì)時(shí) DJNZ R3, Y ;1s是否計(jì)時(shí)完畢 MOV R3, #20 DJNZ R4, Y ;本狀態(tài)是否結(jié)束,并進(jìn)行下一狀態(tài)設(shè)置 MOV A, P2 CJNZ A, #0DDH,D1 MOV P2, #BDH MOV R4, #5 D1: CJNZ A, BDH,D2 MOV P2, #EDH MOV R4, R1 CLR 01H D2: CJNZ A, #EDH,D3 MOV P2, #E7H MOV R4, #5 JNB 00H, D3 LCALL DATA D3: CJNZ A, #E7H,Y MOV R2, #DDH MOV R4, R0 SETB 01H Y: MOV A, R4 ;LED倒計(jì)時(shí)顯示 MOV B, #10 DIV A, B MOB DPTR,#LEDMAP MOVC A,@A+DPTR MOV P1, A MOV A, B MOVC A,@A+DPTR MOV P0, A LEDMAP: DB C0H,F9H,A4H,B0H,99H,92H,82H,F8H,80H,90H JNB 00H, WAIT ;判斷是否要計(jì)數(shù)車流量 JB P3.3, WAIT ;判斷是否有車經(jīng)過 WAIT: JNB TF0, WAIT ;50ms一次掃描完畢 SJMP START INT1: JNB 01H, U ;判斷車向 INC R5 U: INC R6 RETI INT0: SETB P3.4 ;中斷服務(wù)子程序,闖紅燈或緊停按鍵 JB P3.7, $ LCALL DELAY CLR P3.4 RETI DATA: MOV A, R6 ;車流量數(shù)據(jù)處理及紅綠燈時(shí)間調(diào)整 MOV B, R0 MUL A, B MOV R6, A MOV A , R5 MOV B, R1 MUL A, B MOV B, #10 MUL A, B MOV B, R6 DIV A, B CJNZ A, #7 M1 M2: MOV R2, #20 MOV R1, #40 SJMP OUT M1: JB C, M2 CJNZ A, #15 N1 N2: MOV R0, #30 MOV R1, #30 SJMP OUT N1: JB C, N2 MOV R0, #40 MOV R1, #20 OUT: CLR R5 CLR R6 RET DELAY: MOV R2, #14H A1: MOV R7, #0FFH DJNZ R2, $ DJNZ R7, A1 RET END
|