要求:
实验平台:MDK5 Proteus8 单片机:AT89C51
1、当A、B道均有车时轮流放行。A道放行10秒,B道放行10秒,转换时黄灯亮0.5秒。时间显示采用数码管显示。
2、一道有车时,另一道无车时,立即让有车的道放行。
3、当有紧急车辆时(如警车,救护车)通行时,禁止普通的车辆通行(A、B道皆亮红灯)。
说明:外部中断0 -¬¬¬¬------救护车、警车通行时,全亮红灯
外部中断1 -------只有一个车道有车时,有车车道处亮绿灯,无车车道亮红灯。
定时器1-------A,B两车道轮流放行,红绿黄三色灯按规定点亮
源代码:
;交通信号灯实验程序
LED_BIT EQU P1
DIG_TUBE EQU P2
DIS_RAM EQU 30H
CLOCK EQU 40H
NUM EQU 20
LEN EQU 10H
INIT_LED EQU 20H
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXINT_0 ;外部中断0 救护车服务函数
ORG 0013H
LJMP EXINT_1 ;外部中断1 只有一车道有车服务函数
ORG 001BH
LJMP TIMER1 ;定时器1 延时服务函数
MAIN:
MOV LEN, #9
MOV LED_BIT,#0FFH ; LEDOFF ;熄灭led灯
MOV CLOCK, #00H ;软时钟初始化
MOV P1, #0EEH ;初始化交通灯
MOV DIG_TUBE,#6FH ;初始化数码管读数 高电平点亮 9
;定时器1初始化
MOV TMOD, #10H
MOV TL1, #0B0H
MOV TH1, #3CH
SETB TR1 ;启动定时器
SETB ET1 ;开T1中断
;外部中断初始化
SETB IT0 ;下降沿触发
SETB IT1
SETB EX0 ;使能INT_0
SETB EX1
SETB EA ;使能总中断
SJMP $
EXINT_0: ;救护车通行时
MOV LED_BIT,#0EDH ;点亮A B的红灯
JNB P3.2, $
CJNE R6, #00H,TIM2
MOV LED_BIT,#0DBH
TIM2:
CJNE R5, #01H,TIM1
MOV LED_BIT,#0EEH
RETI
TIM1:
MOV LED_BIT,#0F5H
RETI
EXINT_1: ;只有一车道有车时
JB P0.6, TIM3
MOV LED_BIT,#0F5H
JNB P3.2, TIM4
JNB P0.6, $
TIM3:
JNB P0.7, A_CH
RETI
A_CH:
MOV LED_BIT,#0EEH
JNB P3.2, TIM4
JNB P0.7, $
TIM4:
RETI
TIMER1: ;正常的交通模式
INC CLOCK
MOV A, CLOCK
CJNE A, #NUM,GOON ;累加次数未到,进GOON
;定时时间到处理
MOV CLOCK,#00H ;软时钟清零
JNB P1.0, SAVE1 ;绿灯1点亮时
JNB P1.3, SAVE2 ;绿灯2点亮时
JNB P1.2, TRANS ;黄灯点亮时
SAVE1:
MOV R5, #1 ;SETB PSW.5 ;PSW.5 第一个绿灯时为1
MOV R6, #1
SJMP CLOCK_T1
SAVE2:
MOV R5, #0 ;CLR PSW.5 ;第二个灯点亮时
MOV R6, #1
SJMP CLOCK_T1
TRANS: ;黄灯执行程序
MOV R6,#00H
CJNE R5,#01H,NEXT2 ;上一次第一个绿灯亮
MOV LED_BIT,#0F5H
MOV LEN,#9
SJMP CLOCK_T1
NEXT2: ;第二个灯点亮时
MOV LED_BIT,#0EEH
MOV LEN,#9
CLOCK_T1:
MOV R0, #LEN
MOV A, @R0
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV DIG_TUBE,A
DJNZ LEN,GOON
MOV LED_BIT,#0DBH
GOON:
MOV TL1,#0B0H
MOV TH1,#3CH
RETI
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
实验原理图:
注:外部中断1处的电路是为了辅助程序上的较好的实现,并不影响实验现象。
写于 2020.06.25晚 端午节