要求:
实验平台:MDK5 Proteus8 单片机:AT89C51
1、当A、B道均有车时轮流放行。A道放行10秒,B道放行10秒,转换时黄灯亮0.5秒。时间显示采用数码管显示。
2、一道有车时,另一道无车时,立即让有车的道放行。
3、当有紧急车辆时(如警车,救护车)通行时,禁止普通的车辆通行(A、B道皆亮红灯)。
说明:外部中断0 -¬¬¬¬------救护车、警车通行时,全亮红灯
外部中断1 -------只有一个车道有车时,有车车道处亮绿灯,无车车道亮红灯。
定时器1-------A,B两车道轮流放行,红绿黄三色灯按规定点亮
源代码:
;交通信号灯实验程序LED_BIT EQU P1DIG_TUBE EQU P2DIS_RAM EQU 30HCLOCK EQU 40HNUM EQU 20LEN EQU 10HINIT_LED EQU 20HORG 0000HLJMP MAINORG 0003HLJMP EXINT_0 ;外部中断0 救护车服务函数ORG 0013HLJMP EXINT_1 ;外部中断1 只有一车道有车服务函数ORG 001BHLJMP TIMER1 ;定时器1 延时服务函数
MAIN:MOV LEN, #9MOV LED_BIT,#0FFH ; LEDOFF ;熄灭led灯MOV CLOCK, #00H ;软时钟初始化MOV P1, #0EEH ;初始化交通灯MOV DIG_TUBE,#6FH ;初始化数码管读数 高电平点亮 9;定时器1初始化MOV TMOD, #10HMOV TL1, #0B0HMOV TH1, #3CHSETB TR1 ;启动定时器SETB ET1 ;开T1中断 ;外部中断初始化SETB IT0 ;下降沿触发SETB IT1SETB EX0 ;使能INT_0SETB EX1SETB EA ;使能总中断 SJMP $
EXINT_0: ;救护车通行时MOV LED_BIT,#0EDH ;点亮A B的红灯JNB P3.2, $CJNE R6, #00H,TIM2MOV LED_BIT,#0DBH TIM2:CJNE R5, #01H,TIM1MOV LED_BIT,#0EEH RETITIM1:MOV LED_BIT,#0F5HRETI
EXINT_1: ;只有一车道有车时JB P0.6, TIM3 MOV LED_BIT,#0F5H JNB P3.2, TIM4JNB P0.6, $TIM3: JNB P0.7, A_CHRETIA_CH:MOV LED_BIT,#0EEHJNB P3.2, TIM4JNB P0.7, $TIM4:RETI
TIMER1: ;正常的交通模式INC CLOCKMOV A, CLOCKCJNE 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 第一个绿灯时为1MOV R6, #1SJMP CLOCK_T1SAVE2:MOV R5, #0 ;CLR PSW.5 ;第二个灯点亮时MOV R6, #1SJMP CLOCK_T1TRANS: ;黄灯执行程序MOV R6,#00HCJNE R5,#01H,NEXT2 ;上一次第一个绿灯亮MOV LED_BIT,#0F5H MOV LEN,#9SJMP CLOCK_T1NEXT2: ;第二个灯点亮时 MOV LED_BIT,#0EEH MOV LEN,#9CLOCK_T1:MOV R0, #LENMOV A, @R0MOV DPTR, #TABMOVC A, @A+DPTRMOV DIG_TUBE,A DJNZ LEN,GOONMOV LED_BIT,#0DBHGOON:MOV TL1,#0B0H MOV TH1,#3CH RETI TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND
实验原理图:

注:外部中断1处的电路是为了辅助程序上的较好的实现,并不影响实验现象。
写于 2020.06.25晚 端午节


















