用AT89C52单片机控制一个交通信号灯系统,晶振采用12MHz。设A车道与B车道交叉组成十字路口,A是主道,B是支道。设计要求如下所示:
(1)用发光二极管模拟交通信号灯,用按键开关模拟车辆检测信号。
(2)正常情况下,A、B两车道轮流放行,A车道放行50s,其中5s用于警告,B车道放行30s,其中5s用于警告。
(3)在交替繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。在B车道放行期间,若A车道有车而B车道无车,按下开关K1使A车道放行15s;在A车道放行期间,若B车道有车而A车道无车,按下开关使B车道放行15s。
(4)有紧急车辆通行时,按下开关A3,使A、B车道均为红灯,禁行20s。
it k1=P3^2;//设置按钮
sbit k2=P3^3;
sbit k3=P3^4;
sbit k4=P3^5;//通行控制
sbit k5=P3^6;
sbit k6=P3^7;
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=50,dong_lim=30;//自由调整时主次干道绿灯时间
uchar moshi=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+7;dong=dong_lim+1;//设置初始时间
break;
case 1:red1=0;yellow1=1;green1=1;red2=1;yellow2=0;green2=1;//东西黄灯亮
dong=6;nan=6;
break;
case 2:red1=1;yellow1=1;green1=0;red2=0;yellow2=1;green2=1;//东西红灯亮
nan=nan_lim+1;dong=nan_lim+7;//设置初始时间
break;
case 3:red1=1;yellow1=0;green1=1;red2=0;yellow2=1;green2=1;//南北黄灯亮
nan=6;dong=6;
}
}
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()//主函数
{
uchar k=0;
TMOD=0x01;//定时器设置
TH0=0x3c; //50ms
TL0=0xb0;
ET0=1; //开中断
EA=1;
TR0=1; //启动定时器
control();
nan=dong_lim+6;dong=dong_lim;//设置初始时间
while(1)
{
if(moshi==0)
display();//显示
if(!k1 &&(k!=1))
{ //模式切换
if(moshi<2)
moshi++;
else
moshi=0;
k=1;
}
if(moshi==1)//调节南北时间
{
if(!k2 &&(k!=2))
{
if(nan_lim<99)
nan_lim++;
k=2;
}
if(!k3 &&(k!=3))
{
if(nan_lim>1)
nan_lim--;
k=3;
}
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 &&(k!=2))
{
if(dong_lim<99)
dong_lim++;
k=2;
}
if(!k3 &&(k!=3))
{
if(dong_lim>1)
dong_lim--;
k=3;
}
P0=tabel[dong_lim/10];//东西
smg3=1;
delay(100);
smg3=0;
P0=tabel[dong_lim%10];
smg4=1;
delay(100);
smg4=0;
}
//繁忙
if(!k4 &&(k!=4))//A放行15s
{
k=4;
if(mode==0)
{
mode=2;
阅读全文