设计思路:
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;
}
注:上面代码复制有些许额外乱码,需要自行审查
实现仿真图;
实现效果视频:
Comments NOTHING