设计思路:

6个基本状态保持循环

①东西绿灯亮,南北红灯亮: 6秒

②东西绿灯闪,南北红灯亮: 2秒 0.5s一次

③东西黄灯亮,南北红灯亮: 2秒

④南北绿灯亮,东西红灯亮: 6秒

⑤南北绿灯闪,东西红灯亮: 2秒

⑥南北黄灯亮,东西红灯亮: 2秒

 


特殊情况

①:按下按键1,东西方向绿灯,南北方向红灯,保持5秒,之后恢复到被打断时的情况。

②:按下按键2,东西方向红灯,南北方向红灯,保持5秒,之后恢复到被打断时的情况。

③;用一个数码管显示目前的状态还要持续多久,闪烁时可以不显示。

④:用一个数码管显示按下按键后,打断状态还需要持续多久。

 

仿真元器件清单:

7SEG-MPX1-CA

AT89C51

BUTTON

CAP

CAP-ELEC

CRYSTAL

RES

RESPACK-7

LED-GREEN

LED-YELLOW

LED-RED

实现程序:

#include <reg51.h>
unsigned char duan[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char i;
unsigned char table[]={0xF3,0xFB,0xEB,0xDE,0xDF,0xDD};
sbit   AG=P1^0;
sbit   AY=P1^1;
sbit   AR=P1^2;
sbit   BG=P1^3;
sbit   BY=P1^4;
sbit   BR=P1^5;
 
void delay(unsigned int z)
{
     unsigned int x,y;
     for(x=z;x>0;x--)
          for(y=125;y>0;y--);
}
 
void main()
  {   
     TMOD=0x01;
     EX0=1;
     IT0=1;
     EX1=1;
     IT1=1;
     EA=1;
     while(1)
     {
          BY=1;
          AR=1;
          AG=0;
          BR=0;
          P0=duan[6];          
          delay(1000);
          P0=duan[5];
          delay(1000);
          P0=duan[4];
          delay(1000);
          P0=duan[3];
          delay(1000);
          P0=duan[2];
          delay(1000);
          P0=duan[1];
		  delay(1000);
          P0=duan[0];
          for(i=0;i<2;i++)
          {
               AG=1;
               BR=0;
               delay(500);
               AG=0;
               BR=0;
               delay(500);
          }
          AG=1;
          AY=0;
          BR=0;
          P0=duan[2];
          delay(1000);
          P0=duan[1];
          delay(1000);
          P0=duan[0];
          AY=1;
          BR=1;
          BG=0;
          AR=0;
          P0=duan[6];
          delay(1000);
          P0=duan[5];
          delay(1000);
          P0=duan[4];
          delay(1000);
          P0=duan[3];
          delay(1000);
          P0=duan[2];
          delay(1000);
          P0=duan[1];
          delay(1000);
          P0=duan[0];
          for(i=0;i<2;i++)
          {
               BG=1;
               AR=0;
               delay(500);
               BG=0;
               AR=0;
               delay(500);
          }
          BG=1;
          BY=0;
          AR=0;
   }
}
void int_0()  interrupt 0   //紧急情况中断
{
     unsigned char j,l,m;
     j=P1;                      //保护现场,暂存P1口、t0、t1、TH1、TL0 
     l=TH1;
     m=TL1;
     BY=1;
     BR=0;
     BG=1;
     AR=1;
     AG=0;
     AY=1;
     P0=duan[5];
     delay(1000);
     P0=duan[4];
     delay(1000);
     P0=duan[3];
     delay(1000);
     P0=duan[2];
     delay(1000);
     P0=duan[1];
     delay(1000);
     P0=duan[0];
     P1=j;                                
     TH1=l;
     TL1=m; 
}
 
void int_1() interrupt 2  
{
     unsigned char  h,s,t;
     h=P1;   
     s=TH1;
     t=TL1;
     BY=1;
     BR=0;
     BG=1;
     AR=0;
     AG=1;
     AY=1;
     P0=duan[5];
     delay(1000);
     P0=duan[4];
     delay(1000);
     P0=duan[3];
     delay(1000);
     P0=duan[2];
     delay(1000);
     P0=duan[1];
     delay(1000);
     P0=duan[0]; 
     P1=h; 
     TH1=s;
     TL1=t; 
}

:上面代码复制有些许额外乱码,需要自行审查

实现仿真图;

实现效果视频: