正常模式:直行时间显示数码管显示60。此时南北段直行通行(绿灯)、东西段禁止(红灯)60s,倒计时到3s时,黄灯亮,提醒人们注意了。然后是东西段通行(绿灯),南北段禁行(红灯),一直循环下去。
繁忙模式:南北段、东西段的通行时间改为30s,其它与正常模式类似。
特殊模式:特殊模式红灯全亮,倒计时20s,到最后3秒黄灯闪3次后并转入正常模式
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar i,a;
uint counter,ge,shi,temp;
sbit A_0=P0^3; //南北红
sbit A_1=P0^4; //南北黄
sbit A_2=P0^5; //南北绿
sbit B_0=P0^0; // 东西红
sbit B_1=P0^1; // 东西黄
sbit B_2=P0^2; // 东西绿
sbit WE1=P3^1; // 十位位选
sbit WE2=P3^0; // 个位位
sbit number=P1^5; // 正常模式开
sbit busy=P1^6; // 繁忙模式开
sbit special=P1^7; // 特殊模式开
sbit number1=P1^0; // 正常指示灯
sbit busy1=P1^1; // 繁忙指示灯
sbit special1=P1^2; // 特殊指示灯
sfr WDT=0xe1; // 看门狗特殊存放器设置
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(uint time); //延时函数声明
void initial(); //初始化函数声明
void status1(); // 状态1函数声明
void status2(); // 状态2函数声明
//显示函数
void display(){
P0=table[shi];
WE1=0;delay(1);
WE1=1;
P0=0xff;//delay(1);
P0=table[ge];
WE2=0;delay(1);
WE2=1;}
//主函数
void main(){ //if(on==0){
//大循环
WDT=0x34;
initial();
while(1){
counter=temp;
status1();
// WDT=0x37;
counter=temp;
status2();
// WDT=0x37;
}}
//初始化函数
void initial(){
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1;
TR0=1;
EX0=1;
IT0=1; //边沿触发
temp=60;
a=0;
}
//状态函数1
void status1(){
A_1=1;B_1=1;
while(counter){
if(temp==60){
number1=0;busy1=1;special1=1;}
else{ if(temp==30){
number1=1;busy1=0;special1=1;}
else{if(temp==20){
number1=1;busy1=1;special1=0;} }
}
display();
if(a==1){
A_0=0;A_2=1;
B_0=0;B_2=1;}
else {
A_0=0;A_2=1; // 东西行,南北断
B_0=1;B_2=0;} //东西断,南北行
if(counter==3){
if(i<=10){
B_1=0;
A_1=0;}
else {B_1=1;A_1=1;}}
if(counter==2){
if(i<=10){ B_1=0;A_1=0;}
else {B_1=1;A_1=1;}}
if(counter==1){
if(i<=10){ B_1=0;A_1=0;}
else {B_1=1;A_1=1;}}
if(a==1&counter==0){temp=60;a=0;}
}
}
//状态函数1
void status2(){
A_1=1;B_1=1;
while(counter){
if(temp==60){
number1=0;busy1=1;special1=1;}
else{ if(temp==30){
number1=1;busy1=0;special1=1;}
else{if(temp==20){
number1=1;busy1=1;special1=0;} }
}
display();
if(a==1){
A_0=0;A_2=1;
B_0=0;B_2=1;}
else {
A_0=1;A_2=0; // 东西行,南北断
B_0=0;B_2=1;} //东西断,南北行
if(counter==3){
if(i<=10){
B_1=0;
A_1=0;}
else {B_1=1;A_1=1;}}
if(counter==2){
if(i<=10){ B_1=0;A_1=0;}
else {B_1=1;A_1=1;}}
if(counter==1){
if(i<=10){ B_1=0;A_1=0;}
else {B_1=1;A_1=1;}}
if(a==1&counter==0){temp=60;a=0;}
}
}
//延时函数
void delay(uint time){
uint a;
for(;time>0;time--)
for(a=10;a>0;a--);
}
//定时器中断0
void timer() interrupt 1{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==20){
counter--;
WDT=0x34;
i=0;
shi=counter/10;
ge=counter%10;}}
//外部中断0
void EXTR0() interrupt 0 {
if(number==0){
temp=60;}
if(busy==0){
temp=30;}
if(special==0){
temp=20;
counter=temp;
number1=1;busy1=1;special1=0;
a=1;
}
}