嵌入式编程 交通灯显示

要求:

实验平台: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张图片
注:外部中断1处的电路是为了辅助程序上的较好的实现,并不影响实验现象。

写于 2020.06.25晚 端午节

你可能感兴趣的:(嵌入式编程 交通灯显示)