#include "key.h"
#define GPIO_SEG P0
#define Time1 5 //初始红灯时间
#define Time2 10 //绿灯时间
#define Time3 2 //黄灯闪烁时间
#define Time4 8 //紧急情况时间
uchar SEG[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit REDa=P2^0; //东西路红灯
sbit YELLOWb=P2^1; //东西路黄灯
sbit GREENc=P2^2; //东西路绿灯
sbit RED1=P2^3; //东西路人行道红灯
sbit GREEN2=P2^4; //东西路人行道绿灯
sbit RED=P2^5; //南北路红灯
sbit YELLOW=P2^6; //南北路黄灯
sbit GREEN=P2^7; //南北路绿灯
sbit RED11=P3^6; //南北路人行道红灯
sbit GREEN22=P3^7; //南北路人行道绿灯
unsigned long Num;//总时钟计时
uint Count;//计循环时钟数
/*------------函数声明---------*/
void timer0Init(void);
void display1(uint time);//南北路数码管
void display2(uint time);//东西路
/*---------主函数----------*/
void main(void)
{
Num=0;
Count=0;
timer0Init();
while(1)
{
//初始全红灯
if(Num<=Time1&&Count<=Time1)
{
REDa=0; //东西路红灯
YELLOWb=1; //东西路黄灯
GREENc=1; //东西路绿灯
RED1=0; //东西路人行道红灯
GREEN2=1; //东西路人行道绿灯
RED=0; //南北路红灯
YELLOW=1; //南北路黄灯
GREEN=1; //南北路绿灯
RED11=0; //南北路人行道红灯
GREEN22=1; //南北路人行道绿灯
display1(Time1);
display2(Time1);
}
if(keyScan()==1)
{
Count=0;
while(1)
{
REDa=0; //东西路红灯
YELLOWb=1; //东西路黄灯
GREENc=1; //东西路绿灯
RED1=0; //东西路人行道红灯
GREEN2=1; //东西路人行道绿灯
RED=0; //南北路红灯
YELLOW=1; //南北路黄灯
GREEN=1; //南北路绿灯
RED11=0; //南北路人行道红灯
GREEN22=1; //南北路人行道绿灯
display1(Time4);
display2(Time4);
if(Count==Time4)
{
Count=0;
break;
}
}
}
else
{
if(Num>Time1&&Count==2*Time2+2*Time3)
{
Count=0;
}
//东西红,南北绿
else if(Num>Time1&&Count<=Time2)
{
if(Num<Time2&&Count==Time1+1) Count = 0;
REDa=0; //东西路红灯
YELLOWb=1; //东西路黄灯
GREENc=1; //东西路绿灯
RED1=0; //东西路人行道红灯
GREEN2=1; //东西路人行道绿灯
RED=1; //南北路红灯
YELLOW=1; //南北路黄灯
GREEN=0; //南北路绿灯
RED11=1; //南北路人行道红灯
GREEN22=0; //南北路人行道绿灯
display2(Time3+Time2);
display1(Time2);
}
//南北绿转黄,东西红
else if(Num>Time1&&Count<=Time3+Time2)
{
REDa=0; //东西路红灯
YELLOWb=1; //东西路黄灯
GREENc=1; //东西路绿灯
RED1=0; //东西路人行道红灯
GREEN2=1; //东西路人行道绿灯
RED=1; //南北路红灯
YELLOW=~YELLOW; //南北路黄灯
GREEN=1; //南北路绿灯
RED11=0; //南北路人行道红灯
GREEN22=1; //南北路人行道绿灯
//display1(Time2+Time3);
display2(Time3+Time2);
}
//南北红,东西绿
else if(Num>Time1&&Count<=Time3+2*Time2)
{
REDa=1; //东西路红灯
YELLOWb=1; //东西路黄灯
GREENc=0; //东西路绿灯
RED1=1; //东西路人行道红灯
GREEN2=0; //东西路人行道绿灯
RED=0; //南北路红灯
YELLOW=1; //南北路黄灯
GREEN=1; //南北路绿灯
RED11=0; //南北路人行道红灯
GREEN22=1; //南北路人行道绿灯
display2(2*Time2+Time3);
display1(2*Time2+2*Time3);
}
//东西绿转黄,南北红
else if(Num>Time1&&Count<2*Time3+2*Time2)
{
REDa=1; //东西路红灯
YELLOWb=~YELLOWb; //东西路黄灯
GREENc=1; //东西路绿灯
RED1=0; //东西路人行道红灯
GREEN2=1; //东西路人行道绿灯
RED=0; //南北路红灯
YELLOW=1; //南北路黄灯
GREEN=1; //南北路绿灯
RED11=0; //南北路人行道红灯
GREEN22=1; //南北路人行道绿灯
//display2(2*Time2+2*Time3);
display1(2*Time2+2*Time3);
}
}
}
}
/*----------显示函数-------*/
uchar y=0;
void display1(uint t)//南北路
{
GPIO_SEG=0xff;//消隐
switch(y)
{
case 0:GPIO_SEG=SEG[(t-Count)%10];P1=0x04;break;
case 1:GPIO_SEG=SEG[(t-Count)/10];P1=0x08;break;
}
y++;
if(y>1) y=0;
}
uchar x=0;
void display2(uint ti)//东西路
{
GPIO_SEG=0xff;//消隐
switch(x)
{
case 0:GPIO_SEG=SEG[(ti-Count)%10];P1=0x40;break;
case 1:GPIO_SEG=SEG[(ti-Count)/10];P1=0x80;break;
}
x++;
if(x>1) x=0;
}
/*----------初始化函数-------*/
void timer0Init(void) //1毫秒@11.0592
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0 = (65536-50000)/256; //50ms
TL0 = (65536-50000)%256;
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
EA=1; //总中断打开
}
/*----------定时器0服务函数-------*/
void Timer0_ISR() interrupt 1
{
uint time;
TH0 = (65536-50000)/256; //50ms
TL0 = (65536-50000)%256;
time++;
if(time==20)//1s
{
Count++;
Num++;
time=0;
}
}