交通灯十字路口控制器程序.docx
《交通灯十字路口控制器程序.docx》由会员分享,可在线阅读,更多相关《交通灯十字路口控制器程序.docx(16页珍藏版)》请在冰豆网上搜索。
交通灯十字路口控制器程序
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40
};
//*************digitdisplayport*******
sbitled_w1=P1^1;
sbitled_w2=P1^0;
sbitled_w3=P1^3;
sbitled_w4=P1^2;
//*****defineledport**********
sbitR1=P2^4;//eastandwestredled
sbitY1=P2^3;//eastandwestyellowled
sbitG1=P2^2;//eastandwestgreenled
sbitR2=P2^5;//southandnorthredled
sbitY2=P2^6;//southandnorthyellowled
sbitG2=P2^7;//southandnorthgreenled
//*********definekey**************
sbitk0=P3^0;//emergency
sbitk1=P3^1;//eastandwestpass
sbitk2=P3^2;//southandnorthpass
sbitk3=P3^3;//startandsubtract1
sbitk4=P3^4;//pauseandadd1
sbitk5=P3^5;//settime
//*********definevariable*********
bitflag,flag_t;
uchardx_time,nb_time;
ucharcnt,pass_time,cnt1,y_time;
uchark0num,k1num,k2num,k3num,k4num,k5num;
//*********definekey********
voiddelay(uinti)
{
uintx,y;
for(x=i;x>0;x--)
for(y=110;y>0;y--);
}
voidtimer0_init()
{
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
}
voidled_display(uchardx,nb)
{
uchardx1,dx2,nb1,nb2;
dx2=dx/10;
dx1=dx%10;
nb2=nb/10;
nb1=nb%10;
if(dx>99)
{
led_w1=1;
led_w2=1;
}
else
{
led_w1=0;
P0=table[dx1];
delay(5);
led_w1=1;
if(dx<10&&dx>0)led_w2=1;
else
{
led_w2=0;
P0=table[dx2];
delay(5);
led_w2=1;
}
}
if(nb>99)
{
led_w3=1;
led_w4=1;
}
else
{
led_w3=0;
P0=table[nb1];
delay(5);
led_w3=3;
if(nb<10&&nb>0)led_w4=1;
else
{
led_w4=0;
P0=table[nb2];
delay(5);
led_w4=4;
}
}
}
//*************lightwork**********
voidcircle_led()
{
if(!
flag)
{
if(pass_time>5)
{
led_display(pass_time-5,pass_time);
R1=1;Y1=1;G1=0;//eastandwestpass
R2=0;Y2=1;G2=1;//southandnorthstop
}
if(pass_time<=5&&pass_time>0)
{
if(cnt>=10)led_display(pass_time,pass_time);
elseled_display(100,pass_time);
R1=1;G1=1;//eastandwestyellowledflash
if(cnt>=10)Y1=0;
elseY1=1;
R2=0;Y2=1;G2=1;
}
if(pass_time==0)
{
pass_time=nb_time;
flag=1;
}
}
else
{
if(pass_time>5)
{
led_display(pass_time,pass_time-5);
R1=0;Y1=1;G1=1;//eastandweststop
R2=1;Y2=1;G2=0;//southandnorthpass
}
if(pass_time<=5&&pass_time>0)
{
if(cnt>=10)led_display(pass_time,pass_time);
elseled_display(pass_time,100);
R1=0;Y1=1;G1=1;
R2=1;G2=1;//southandnorthyellowledflash
if(cnt>=10)Y2=0;
elseY2=1;
}
if(pass_time==0)
{
pass_time=dx_time;
flag=0;
}
}
}
voidemergency()//eastandwest,southandnorthstop
{
led_display(0,0);
R1=0;Y1=1;G1=1;
R2=0;Y2=1;G2=1;
}
voiddx_pass()//eastandwestpass,southandnorthstop
{
led_display(100,100);
if(y_time<=5&&y_time>0)
{
TR1=1;
R1=0;Y1=1;G1=1;
R2=1;G2=1;//southandnorthyellowledflash
if(cnt1>=10)Y2=0;
elseY2=1;
}
if(y_time==0)
{
TR1=0;
R1=1;Y1=1;G1=0;
R2=0;Y2=1;G2=1;
}
}
voidnb_pass()//southandnorthpass,eastandweststop
{
led_display(100,100);
if(y_time<=5&&y_time>0)
{
TR1=1;
R1=1;G1=1;
if(cnt1>=10)Y1=0;//eastandwestyellowledflash
elseY1=1;
R2=0;Y2=1;G2=1;
}
if(y_time==0)
{
TR1=0;
R1=0;Y1=1;G1=1;
R2=1;Y2=1;G2=0;
}
}
//***********keyboardscan************
voidkeyscan()
{
if(!
k5num)
{
if(k0==0)//*******emergency*******
{
delay(10);
if(k0==0)
{
while(!
k0);
TR0=0;
k0num=1;
}
}
if(!
k1num&&!
k0num)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
while(!
k1);
k1num=1;
k2num=0;
y_time=5;//单方向通行时,黄灯闪烁时间
TR0=0;
TR1=1;
}
}
}
if(!
k2num&&!
k0num)
{
if(k2==0)
{
delay(10);
if(k2==0)
{
while(!
k2);
k1num=0;
k2num=1;
y_time=5;//单方向通行时,黄灯闪烁时间
TR0=0;
TR1=1;
}
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!
k3);
if(k1num||k2num)pass_time=dx_time;//由东西或南北通行返回时,重新开始执行。
k0num=0;
k1num=0;
k2num=0;
k4num=0;
k5num=0;
TR0=1;
TR1=0;
flag_t=0;
}
}
if(!
k4&&!
k0num)//pause
{
delay(10);
if(k4==0)
{
while(!
k4);
TR0=0;
k4num=1;
}
}
}
if(k4num==1)//暂停键按下时,才可以调整两个方向通行时间
{
if(k5==0)
{
delay(10);
if(k5==0)
{
k5num++;
while(!
k5);
switch(k5num)
{
case1:
TR0=1;
flag_t=1;//调整时间时,pass_time值不变。
k5num=1;
break;
case2:
k5num=2;
break;
case3:
TR0=0;
k5num=0;
pass_time=dx_time;//重新赋值
break;
}
}
}
if(k5num!
=0)
{
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!
k3);
switch(k5num)
{
case1:
dx_time--;
if(dx_time<10)dx_time=99;
break;
case2:
nb_time--;
if(nb_time<10)nb_time=99;
break;
}
}
}
if(k4==0)
{
delay(10);
if(k4==0)
{
while(!
k4);
switch(k5num)
{
case1:
dx_time++;
if(dx_time>=100)dx_time=10;
break;
case2:
nb_time++;
if(nb_time>=100)nb_time=10;
break;
}
}
}
}
}
}
voidmain()
{
timer0_init();
dx_time=45;
nb_time=30;
pass_time=dx_time;
while
(1)
{
keyscan();
if(k0num)emergency();
else
{
switch(k4num)
{
case0:
if(!
k1num&&!
k2num)
circle_led();
else
{
if(k1num)dx_pass();
if(k2num)nb_pass();
}
break;
case1:
switch(k5num)
{
case0:
if(!
k1num&&!
k2num)
circle_led();
else
{
if(k1num)dx_pass();
if(k2num)nb_pass();
}
break;
case1:
R1=1;Y1=1;G1=1;//调整时间时,关闭所有灯
R2=1;Y2=1;G2=1;
if(cnt<=10)
led_display(100,nb_time);
else
led_display(dx_time,nb_time);
break;
case2:
R1=1;Y1=1;G1=1;//调整时间时,关闭所有灯
R2=1;Y2=1;G2=1;
if(cnt<=10)
led_display(dx_time,100);
else
led_display(dx_time,nb_time);
break;
}
break;
}
}
}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cnt++;
if(cnt==20)
{
cnt=0;
if(flag_t==0)pass_time--;//调整时间时,不执行此操作
}
}
voidtimer1()interrupt3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
cnt1++;
if(cnt1==20)
{
cnt1=0;
y_time--;//单方向通行时,黄灯闪烁时间。
}
}