#define uchar unsigned char #define uint unsigned int
uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40 };
//*************digit display port******* sbit led_w1=P1^1;
1 / 35
sbit led_w2=P1^0; sbit led_w3=P1^3; sbit led_w4=P1^2;
//*****define led port **********
sbit R1=P2^4; //east and west red led sbit Y1=P2^3; //east and west yellow led sbit G1=P2^2; //east and west green led sbit R2=P2^5; //south and north red led sbit Y2=P2^6; //south and north yellow led sbit G2=P2^7; //south and north green led
//*********define key**************
2 / 35
sbit k0=P3^0; //emergency
sbit k1=P3^1; //east and west pass sbit k2=P3^2; //south and north pass sbit k3=P3^3; //start and subtract 1 sbit k4=P3^4; //pause and add 1 sbit k5=P3^5; //set time
//*********define variable********* bit flag,flag_t;
uchar dx_time,nb_time;
uchar cnt,pass_time,cnt1,y_time;
uchar k0num,k1num,k2num,k3num,k4num,k5num;
3 / 35
//*********define key******** void delay(uint i) {
uint x,y;
for(x=i;x>0;x--)
for(y=110;y>0;y--); }
void timer0_init() {
TMOD=0x11;
TH0=(65536-50000)/256; TL0=(65536-50000)%256;
4 / 35
TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET0=1; ET1=1; }
void led_display(uchar dx,nb) {
uchar dx1,dx2,nb1,nb2; dx2=dx/10; dx1=dx%10; nb2=nb/10;
5 / 35
nb1=nb%10; if(dx>99) {
led_w1=1; led_w2=1; } else {
led_w1=0; P0=table[dx1]; delay(5); led_w1=1;
6 / 35
if(dx<10&&dx>0) led_w2=1; else {
led_w2=0; P0=table[dx2]; delay(5); led_w2=1; }
}
if(nb>99) {
7 / 35
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 {
8 / 35
led_w4=0;
P0=table[nb2]; delay(5); led_w4=4; } } }
//*************light work********** void circle_led() {
if(!flag) {
9 / 35
if(pass_time>5) {
led_display(pass_time-5,pass_time);
R1=1;Y1=1;G1=0; //east and west pass R2=0;Y2=1;G2=1; //south and north stop }
if(pass_time<=5&&pass_time>0) {
if(cnt>=10) led_display(pass_time,pass_time); else led_display(100,pass_time);
R1=1;G1=1; //east and west yellow led flash if(cnt>=10) Y1=0;
10 / 35
else Y1=1;
R2=0;Y2=1;G2=1; }
if(pass_time==0) {
pass_time=nb_time; flag=1; } } else {
if(pass_time>5)
/ 35
11
{
led_display(pass_time,pass_time-5);
R1=0;Y1=1;G1=1; //east and west stop R2=1;Y2=1;G2=0; //south and north pass }
if(pass_time<=5&&pass_time>0) {
if(cnt>=10) led_display(pass_time,pass_time); else led_display(pass_time,100); R1=0;Y1=1;G1=1;
R2=1;G2=1; //south and north yellow led flash if(cnt>=10) Y2=0;
12 / 35
else Y2=1; }
if(pass_time==0) {
pass_time=dx_time; flag=0; } } }
void emergency() //east and west,south and north stop {
13 / 35
led_display(0,0); R1=0;Y1=1;G1=1; R2=0;Y2=1;G2=1; }
void dx_pass() //east and west pass,south and north stop {
led_display(100,100);
if(y_time<=5&&y_time>0) {
TR1=1;
R1=0;Y1=1;G1=1;
R2=1;G2=1; //south and north yellow led flash
14 / 35
if(cnt1>=10) Y2=0; else Y2=1; }
if(y_time==0) {
TR1=0;
R1=1;Y1=1;G1=0; R2=0;Y2=1;G2=1; } }
void nb_pass() //south and north pass,east and west stop
15 / 35
{
led_display(100,100);
if(y_time<=5&&y_time>0) {
TR1=1;
R1=1;G1=1;
if(cnt1>=10) Y1=0; //east and west yellow led flash else Y1=1;
R2=0;Y2=1;G2=1; }
if(y_time==0) {
16 / 35
TR1=0;
R1=0;Y1=1;G1=1; R2=1;Y2=1;G2=0; } }
//***********keyboard scan************ void keyscan() {
if(!k5num) {
if(k0==0) //*******emergency*******
17 / 35
{
delay(10); if(k0==0) {
while(!k0); TR0=0; k0num=1; } }
if(!k1num&&!k0num) {
if(k1==0)
/ 35
18 { delay(10); if(k1==0) {
while(!k1); k1num=1; k2num=0;
y_time=5; TR0=0; TR1=1; }
}
}
//单方向通行时,黄灯闪烁时间19 / 35
if(!k2num&&!k0num) {
if(k2==0) {
delay(10); if(k2==0) {
while(!k2); k1num=0; k2num=1;
y_time=5; //单方向通行时,黄灯闪烁时间 TR0=0;
20 / 35
TR1=1; } } }
if(k3==0) {
delay(10); if(k3==0) {
while(!k3);
if(k1num||k2num) 回时,重新开始执行。
pass_time=dx_time; 21 / 35
//由东西或南北通行返 k0num=0; k1num=0; k2num=0; k4num=0; k5num=0; TR0=1; TR1=0; flag_t=0; } }
if(!k4&&!k0num) {
delay(10);
//pause 22 / 35
if(k4==0) {
while(!k4); TR0=0; k4num=1; } } }
if(k4num==1) {
if(k5==0) {
//暂停键按下时,才可以调整两个方向通行时间23 / 35
delay(10); if(k5==0) {
k5num++; while(!k5); switch(k5num) {
case 1: TR0=1;
flag_t=1; k5num=1; break; case 2:
//调整时间时,24 / 35
pass_time值不变。 k5num=2; break; case 3: TR0=0; k5num=0;
pass_time=dx_time; break; } } }
if(k5num!=0) {
if(k3==0)
//重新赋值25 / 35
{
delay(10); if(k3==0) {
while(!k3); switch(k5num) {
case 1:
dx_time--;
if(dx_time<10) dx_time=99; break; case 2:
nb_time--;
26 / 35
if(nb_time<10) nb_time=99; break; } }
}
if(k4==0) {
delay(10); if(k4==0) {
while(!k4); switch(k5num)
27 / 35
{ }
}
}
case 1:
dx_time++;
if(dx_time>=100) dx_time=10; break; case 2:
nb_time++;
if(nb_time>=100) nb_time=10; break;
28 / 35
} } }
void main() {
timer0_init(); dx_time=45; nb_time=30;
pass_time=dx_time; while(1) {
keyscan();
29 / 35
if(k0num) emergency(); else {
switch(k4num) {
case 0:
if(!k1num&&!k2num) circle_led(); else {
if(k1num) dx_pass(); if(k2num) nb_pass(); }
30 / 35
break; case 1:
switch(k5num) {
case 0:
if(!k1num&&!k2num) circle_led(); else {
if(k1num) dx_pass(); if(k2num) nb_pass(); }
break;
31 / 35
case 1:
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; case 2:
R1=1;Y1=1;G1=1; //调整时间时,关闭所有灯 R2=1;Y2=1;G2=1; if(cnt<=10)
led_display(dx_time,100);
32 / 35
else
led_display(dx_time,nb_time); break; }
break; } } } }
void timer0() interrupt 1 {
TH0=(65536-50000)/256;
33 / 35
TL0=(65536-50000)%256;
cnt++; if(cnt==20) {
cnt=0;
if(flag_t==0) pass_time--; } }
void timer1() interrupt 3 {
TH1=(65536-50000)/256;
//调整时间时,不执行此操作34 / 35
TL1=(65536-50000)%256; cnt1++; if(cnt1==20) {
cnt1=0;
y_time--; }
}
//单方向通行时,黄灯闪烁时间。35 / 35