|
#include<reg52.h>
sbit P33=P3^3;
char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管,不带小数点
char code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //共阳数码管,带小数点
unsigned int num=0,b;
void show(int z);
void delay(unsigned char a);
void main(void)
{
SP=0x60;
TMOD=0x01;
IE=0x87;
TCON=0x05;
while(1)
{
unsigned char i;
P1=0x7b; //东西方向绿灯亮,南北方向红灯亮
show(14);
for(i=0;i<4;i++)
{
P1=0xbb;
show(1);
P1=0xfb;
show(1);
}
P1=0xde; //东西方向红灯亮,南北方向绿灯亮
show(12);
for(i=0;i<4;i++)
{
P1=0xdd;
show(1);
P1=0xdf;
show(1);
}
}
}
void show(int z) //用数码管显示的倒计时
{
int z1,z2;
TR0=1;
if(z>1)
{
while(z>0)
{
if(b==20) {b=0;z--;}
z1=z/10;
z2=z%10;
P0=tab[z1];
P2=0xfb;
delay(20);
P0=tab[z2];
P2=0xf7;
delay(20);
}
}
else
{
while(z>0)
{
if(b==10) {b=0;z--;}
P0=tab1[0];
P2=0xfb;
delay(20);
P0=tab[5];
P2=0xf7;
delay(20);
}
}
}
void delay(unsigned char a)
{
char k1;
for(k1=0;k1<=a;k1++);
}
void time0() interrupt 1
{
TH0=(65536-5*110592/12)/256;
TL0=(65536-5*110592/12)%256;
b++;
}
void int0(void) interrupt 0 //紧急车辆要通过,主干道、支道均为红灯亮6秒
{
unsigned char j1;
j1=P1;
P1=0xdb;
show(6);
P1=j1;
}
void int1(void) interrupt 2 //累计8辆车,放行支道
{
unsigned char i1;
if(P33==0)
{
delay(60);
if(P33==0){ num++; }
while(P33==0);
}
if(P1==0x7b){ //主干道放行期间
if(num>7){
for(i1=0;i1<4;i1++)
{
P1=0xbb;
show(1);
P1=0xfb;
show(1);
}
P1=0xde; //东西方向红灯亮,南北方向绿灯亮
show(12);
num=0;
}
}
else {num=0;}
}
|
|