#include
sbit Nred=P2^2;
sbit Nyellow=P2^1;
sbit Ngreen=P2^0;
sbit Wred=P2^3;
sbit Wyellow=P2^4;
sbit Wgreen=P2^5;
sbit Sred=P3^7;
sbit Syellow=P3^6;
sbit Sgreen=P3^5;
sbit Ered=P3^2;
sbit Eyellow=P3^0;
sbit Egreen=P3^1;
unsigned char n,step=1;
void traffic()
{
switch(step)
{
case 1: //南北红,东西黄
if(n==100)
{
n=0;
step=2;
P2=0;P3=0;
Sred=1;
Nred=1;
Eyellow=1;
Wyellow=1;
}
break;
case 2: //南北绿,东西红
if(n==20)
{
n=0;
step=3;
P2=0;P3=0;
Sgreen=1;
Ngreen=1;
Ered=1;
Wred=1;
}
break;
case 3: //南北黄,东西红
if(n==100)
{
n=0;
step=4;
P2=0;P3=0;
Syellow=1;
Nyellow=1;
Ered=1;
Wred=1;
}
break;
case 4: //南北红,东西绿
if(n==20)
{
n=0;
step=1;
P2=0;P3=0;
Sred=1;
Nred=1;
Egreen=1;
Wgreen=1;
}
break;
}
}
void t0()interrupt 1
{
TH0=15536>>8;//50000次溢出中断,50ms
TL0=15536;
++n;
}
void main()
{
EA=1;
TMOD=0x01;//定时器0工作方式1
ET0=1;
TH0=15536>>8;//50000次溢出中断,50ms
TL0=15536;
TR0=1;
P2=0;P3=0;
Sred=1; //南北红,东西绿
Nred=1;
Egreen=1;
Wgreen=1;
while(1)
traffic();
}
晶振12M,计时器计数50000次溢出,每溢出一次50毫秒,程序中的100和20分别对应5秒和1秒,但这只是理论数据,与实际值有较大误差,需根据观察修改,呵呵