#include<reg52.h>
#define uint unsigned int
int code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,
};
sbit hongA=P0^0;
sbit huangA=P0^1;
sbit lvA=P0^2;
sbit hongB=P0^3;
sbit huangB=P0^4;
sbit lvB=P0^5;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
int t=0,t1=0,flag=0,tt0,tt1;
void delay();
void ziyou();
void Bfangxing();
void Afangxing();
void zhongduan();
void main()
{
EA=1;//开总中断
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
P0=0xff;
lvA=0;//打开绿灯
hongB=0;
while(1)
{
if(flag==0) ziyou();//自由状态
if(flag==1) Afangxing();//B放行期间改变
if(flag==2) Bfangxing();//B放行期间改变
if(flag==3) zhongduan();//B放行期间改变
if(tt0==-1) {tt1--;tt0=9;}
P3=0X01;
P2=table[tt1];
delay();
P3=0X02;
P2=table[tt0];
delay();
}
}
void delay()
{
int i;
for(i=0;i<200;i++);
}
void ziyou()//自由状态
{
if(t==20)//达到1s
{
t=0;
t1=t1+1;
tt0--;//减少秒
}
if(t1==0)
{
hongB=0;lvB=1;huangB=1;//B道
lvA=0;huangA=1;hongA=1;//A道
tt1=3;tt0=0;
}
if(t1==30)//30
{
hongB=0;lvB=1;huangB=1;//B道
lvA=1;huangA=0;hongA=1;//A道
tt1=0;tt0=5;
}
if(t1==35)//35
{
hongB=1;lvB=0;huangB=1;//B道
hongA=0;huangA=1;lvA=1;//A道
tt1=2;tt0=0;
}
if(t1==55)//55
{
hongA=0;lvA=1;huangA=1;//A道
lvB=1;huangB=0;hongB=1;//B道
tt1=0;tt0=5;
}
if(t1==60)//60
{
t1=0;
tt1=0;tt0=0;
}
}
void Afangxing()//A放行
{
hongB=0;lvB=1;huangB=1;//B道
lvA=0;huangA=1;hongA=1;//A道
if(t==20)//达到1s
{
t=0;
t1=t1+1;
tt0--;
}
if(t1==15)
{
t1=30;//跳至30
flag=0;
}
}
void Bfangxing()//B放行
{
hongB=1;lvB=0;huangB=1;//B道
hongA=0;huangA=1;lvA=1;//A道
if(t==20)//达到1s
{
t=0;
t1=t1+1;
tt0--;
}
if(t1==15)
{
t1=55;//跳至55
flag=0;
}
}
void zhongduan()//key3
{
hongB=0;lvB=1;huangB=1;//B道
hongA=0;huangA=1;lvA=1;//A道
if(t==20)//达到1s
{
t=0;
t1=t1+1;
tt0--;
}
if(t1==20)
{
t1=0;//跳至55
flag=0;
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
t++; //tt=20为1s
if(key1==0)
{
if(t1>30){flag=1;t=0;t1=0;tt1=1;tt0=5;}//35
}
if(key2==0)
{
if(t1<35){flag=2;t=0;t1=0;tt1=1;tt0=5;}//35
}
if(key3==0)
{tt1=2;tt0=0;
flag=3;t=0;t1=0;
}
}