#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1=P3^2;//按钮
sbit k2=P3^3;
sbit k3=P3^4;
sbit k4=P3^5;
sbit k5=P3^6;
sbit red1=P1^0; //南北方向
sbit yellow1=P1^1;
sbit green1=P1^2;
sbit red2=P1^3; //东西方向
sbit yellow2=P1^4;
sbit green2=P1^5;
sbit smg1=P2^0;//数码管引脚
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
uchar code tabel[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar sec=0,miao=0; //定时
uchar nan=0,dong=0;//东西南北时间
uchar mode=0; //路灯工作顺序
uchar nan_lim=6,dong_lim=6;//自由调整时主次干道绿灯时间
uchar moshi=0;
uchar bei=0;//备份
void delay(uint i)//延时
{
while(i--);
}
void control()//控制路灯
{
switch(mode)
{
case 0:red1=0;yellow1=1;green1=1;red2=1;yellow2=1;green2=0;//南北红灯亮
nan=dong_lim+5;dong=dong_lim+1;//设置初始时间
break;
case 1:red1=0;yellow1=1;green1=1;red2=1;yellow2=0;green2=1;//东西黄灯亮
dong=4;nan=4;
break;
case 2:red1=1;yellow1=1;green1=0;red2=0;yellow2=1;green2=1;//东西红灯亮
nan=nan_lim+1;dong=nan_lim+5;//设置初始时间
break;
case 3:red1=1;yellow1=0;green1=1;red2=0;yellow2=1;green2=1;//南北黄灯亮
nan=4;dong=4;
}
}
void display() //显示各路口时间
{
P0=tabel[nan/10];//南北
smg1=1;
delay(100);
smg1=0;
P0=tabel[nan%10];
smg2=1;
delay(100);
smg2=0;
P0=tabel[dong/10];//东西
smg3=1;
delay(100);
smg3=0;
P0=tabel[dong%10];
smg4=1;
delay(100);
smg4=0;
}
void main()//主函数
{
TMOD=0x01;//定时器设置
TH0=0x3c; //50ms
TL0=0xb0;
ET0=1; //开中断
EA=1;
TR0=1; //启动定时器
control();
nan=dong_lim+4;dong=dong_lim;//设置初始时间
while(1)
{
if(moshi==0)
display();//显示
if(!k1)
{ //模式切换
if(moshi<2)
moshi++;
else
moshi=0;
while(!k1);
}
if(moshi==1)//调节南北时间
{
if(!k2)
{
if(nan_lim<99)
nan_lim++;
while(!k2);
}
if(!k3)
{
if(nan_lim>1)
nan_lim--;
while(!k3);
}
P0=tabel[nan_lim/10];//南北
smg1=1;
delay(100);
smg1=0;
P0=tabel[nan_lim%10];
smg2=1;
delay(100);
smg2=0;
}
if(moshi==2)//调节东西时间
{
if(!k2)
{
if(dong_lim<99)
dong_lim++;
while(!k2);
}
if(!k3)
{
if(dong_lim>1)
dong_lim--;
while(!k3);
}
P0=tabel[dong_lim/10];//东西
smg3=1;
delay(100);
smg3=0;
P0=tabel[dong_lim%10];
smg4=1;
delay(100);
smg4=0;
}
if(!k4)//夜间
{
if(bei==0)
{
bei=P1;
P1=0xff;
moshi=3;
}
else
{
P1=bei;
moshi=0;
}
while(!k4);
}
if(!k5)//管制
{
if(moshi!=4)
{
moshi=4;
bei=P1;
P1=0xff;
red1=0;
red2=0;
}
else
{
moshi=0;
P1=bei;
}
while(!k5);
}
}
}
void timer0() interrupt 1//定时器0中断
{
if(moshi==0)
{
if(sec<20)
sec++;
else
{
sec=0;
if((dong==0)||(nan==0))//一轮结束
{
if(mode<3)
mode++;
else
mode=0;
control();//显示
}
if(nan>0)//倒计时
nan--;
if(dong>0)
dong--;
}
}
if(moshi==3)//夜间模式
{
if(sec<10)
sec++;
else
{
sec=0;
yellow1=!yellow1;
yellow2=!yellow2;
}
}
TH0=0x3c;//重装定时器
TL0=0xb0;
}