#include<reg51.h>
char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80
,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//把数组放入ROM中
//第一个红绿灯控制端
sbit L1=P3^0;
sbit L2=P3^1;
sbit L3=P3^2;
sbit L4=P3^3;
sbit green=P1^0;
sbit yellow=P1^1;
sbit red=P1^2;
//第二个红绿灯控制端
sbit g2=P1^3;
sbit y2=P1^4;
sbit r2=P1^5;
//设计绿灯70s,黄灯3s,红灯60s,所以时间周期是133s
int tmp=0,sec=133,s2=15;//红黄绿灯都是倒计时
main()
{
//定时器的初始化
TMOD=0x01;//定时器方式一的设置
TR0=1;//time run
ET0=1;//定时器的使能
EA=1; //总中断打开
TH0=(65536-50000)/256;//50ms定时一次,高8位
TL0=(65536-50000)%256;//50ms定时一次,低8位
P3=0;//一开始,把所有的P3口都置0,相当于把所有的三极管都关闭
while(1)
{
//第二个路口//
if(s2==0)//说明第二个路口的周期也是133s
{
s2=133;
}
if(s2>63)//绿灯时间点,数码管显示的数字70-1,133>=sec>=64
{
g2=0;//绿灯亮
y2=1;//黄灯灭
r2=1;//红灯灭
P2=table[(s2-63)/10];//绿灯部分的十位数
L3=0;//低电平
L3=1;//高电平锁住
L3=0;//低电平保持
P2=table[(s2-63)% 10];//绿灯部分的个位数
L4=0;//低电平
L4=1;//高电平锁住
L4=0;//低电平保持
}
else if(s2>60)//此时sec满足63>=sec>=61
{
g2=1;//绿灯灭
y2=0;//黄灯亮
r2=1;//红灯灭
P2=table[(s2-60)/10];//显示的数字3到1
L3=0;//低电平
L3=1;//高电平锁住
L3=0;//低电平保持
P2=table[(s2-60)% 10];//显示的数字3到1
L4=0;//低电平
L4=1;//高电平锁住
L4=0;//低电平保持
}
else
{
g2=1;//绿灯灭
y2=1;//黄灯灭
r2=0;//红灯亮
P2=table[s2/10];//显示的数字60到1
L3=0;//低电平
L3=1;//高电平锁住
L3=0;//低电平保持
P2=table[s2%10];//显示的数字60到1
L4=0;//低电平
L4=1;//高电平锁住
L4=0;//低电平保持
}
//第一个路口///
if(sec==0)//说明一个周期已经运行完了,进入下一个周期
{
sec=133;
}
if(sec>63)//绿灯时间点,数码管显示的数字70-1,133>=sec>=64
{
green=0;//绿灯亮
yellow=1;//黄灯灭
red=1;//红灯灭
P2=table[(sec-63)/10];
L1=0;//低电平
L1=1;//高电平锁住
L1=0;//低电平保持
P2=table[(sec-63)% 10];
L2=0;//低电平
L2=1;//高电平锁住
L2=0;//低电平保持
}
else if(sec>60)//此时sec满足63>=sec>=61
{
green=1;//绿灯灭
yellow=0;//黄灯亮
red=1;//红灯灭
P2=table[(sec-60)/10];//显示的数字3到1
L1=0;//低电平
L1=1;//高电平锁住
L1=0;//低电平保持
P2=table[(sec-60)% 10];//显示的数字3到1
L2=0;//低电平
L2=1;//高电平锁住
L2=0;//低电平保持
}
else
{
green=1;//绿灯灭
yellow=1;//黄灯灭
red=0;//红灯亮
P2=table[sec/10];//显示的数字60到1
L1=0;//低电平
L1=1;//高电平锁住
L1=0;//低电平保持
P2=table[sec%10];//显示的数字60到1
L2=0;//低电平
L2=1;//高电平锁住
L2=0;//低电平保持
}
}
}
void time0()interrupt 1//interrupt是中断标志号1一定要与中断类型对应上,50ms进入一次中断函数
//CPU接收到了中断的请求后,会自动执行这个函数,不要在main函数中调用
//定时器与延时相比,延时是需要调用,定时就像后台自动执行
//定时器的CPU工作效率比较高
{
TH0=(65536-50000)/256;//50ms定时一次,高8位
TL0=(65536-50000)%256;//50ms定时一次,低8位
//如果不重置TH0和TL0,那下一轮的中断就变成了65.536ms
tmp++;//每隔50ms加一,加到多少就变成1s,20次
if(tmp==20)//这逻辑成立,代表是1s到
{
tmp=0;//计算下一轮的1s,让tmp置0
sec--;//每隔一秒要减一
s2--;
}
}//时间处理
第二个路口的红绿灯会比第一个慢15秒