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 ;主程序,选择设置红绿灯时间模式或自动调整模式 ORG 0000H LJMP MAIN ORG 0003H ;中断入口 LJMP INT0 ORG 0030H MAIN: MOV R3, #20 ;用于嵌套50ms软件方法计时1s MOV R0, #20 ;预设值红绿灯时间 MOV R1, #20 CLR EX0 K1: MOV C, P3.7 ;等待检测何种模式按键按下 ANL C, P3.2 JB C, K1 JNB P3.7, F ;F键按下为自动模式,进入扫描 K2: JNB P3.2, S ;S键按下并等待计数次数 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键按下并等待计数次数 SJMP K2 J: LCALL DELAY CJNZ R1, #40, V2 MOV R1, #20 V2: INC R1 JNB P3.6, $ JNB P3.7, START ;设置完毕为设定时间模式,进入扫描 JNB P3.6, J MOV P2, #0DDH ;预设信号灯状态,时间和车向 MOV R4, R0 SETB 01H SETB EX0 ;程序开始,进行每50ms扫描 START: MOV TMOD, #01H MOV TH0, #3CH MOV TL0, #0B0H CLR TF0 SETB TR0 ;开始50ms计时 DJNZ R3, Y ;1s是否计时完毕 MOV R3, #20 DJNZ R4, Y ;本状态是否结束,并进行下一状态设置 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倒计时显示 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 ;判断是否要计数车流量 JB P3.3, WAIT ;判断是否有车经过 WAIT: JNB TF0, WAIT ;50ms一次扫描完毕 SJMP START INT1: JNB 01H, U ;判断车向 INC R5 U: INC R6 RETI INT0: SETB P3.4 ;中断服务子程序,闯红灯或紧停按键 JB P3.7, $ LCALL DELAY CLR P3.4 RETI DATA: MOV A, R6 ;车流量数据处理及红绿灯时间调整 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
|