模拟十字路红绿灯显示程序 使用P1口控制红 绿 黄 三个灯,七段数码管显示35秒倒计时,如果是红灯,时间到则变绿灯.如果是绿灯时,最后3秒显示黄灯,然后再显示红灯!
//12M晶振
//共阴数码管
#include <reg51.h>
sbit red=P1^0;
sbit green=P1^1;
sbit yellow=P1^2;
bit flag=1;
unsigned char code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code wei[ ]={0xfd,0xfe};
unsigned char time=35;
void main()
{
void show_time();
void show_light();
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
red=0;
while(1)
{
show_time();
show_light();
}
}
void show_time()
{
void delay();
unsigned char num=time,i;
for(i=0;i<2;++i)
{
P2=wei[i];
P0=duan[num%10];
delay();
P0=0x00;
num/=10;
}
}
void delay()
{
int i;
for(i=1000;i;i--);
}
void show_light()
{
if(flag)
{
if(!time)
{
flag=0;
red=1;
green=0;
time=35;
}
}
else
{
if(time>0&&time<4)
{
green=1;
yellow=0;
}
if(!time)
{
yellow=1;
red=0;
flag=1;
time=35;
}
}
}
void dec_sec() interrupt 1
{
static count=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(++count==20)
{
count=0;
time--;
}
}