📄 交通灯.txt
字号:
附 录
附录1
#include<AT89X51.H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char dispbuf[]={0,0,0,0,0,0,0,0};
unsigned char tempcount=0,temp=29,temp0,date=9;
unsigned char count=0,m=0;
unsigned int k=0,date0=0;
bit flag=1,flag0=0,flag1=0,flag2=0,flag3=0;
/*延时函数*/
void delay10ms(void)
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void main(void) //主函数
{
IP=0x01;
TMOD=0x01; //定义T0为计数中断INT0为下降沿触发
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
ET0=1;
EA=1;
EX0=1;
IT0=1;
while(1)
{
if(flag==1)
{
P1=0x9e; //东西方向绿灯亮,南北方向红灯亮
P3_0=1;
P3_1=1;
P3_3=1;
P3_7=0;
}
if(flag0==1) //东西方向黄灯亮,南北方向红灯闪烁
{
P1_0=1;
P1_1=0;
P1_2=1;
P1_3=1;
P1_4=1;
P1_6=1;
P1_7=0;
P3_0=1;
P3_1=1;
P3_3=1;
}
if(flag1==1) //东西方向红灯亮,南北方向绿灯亮
{
P1=0xf3;
P3_0=0;
P3_1=0;
P3_3=1;
P3_7=1;
}
if(flag2==1)
P1_0=1;
P1_1=1;
P1_3=1;
P1_4=0;
P1_5=1;
P1_6=1;
P1_7=1;
P3_1=1;
P3_3=0;
P3_7=1;
}
if(flag3==1)
{
P1=0xdb;
P3_0=0;
P3_1=1;
P3_3=1;
P3_7=0;
}
}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
P0=dispcode[dispbuf[count]];
P2=dispbitcode[count];
count++;
if(count==8)
count=0;
m++;
if(m==100) //使的红灯闪烁
{
m=0;
if(flag0==1)
{
P1_5=~P1_5;
P3_7=~P3_7;
}
if(flag2==1)
{
P1_2=~P1_2;
P3_0=~P3_0;
}
}
if(flag3==0) //警车或急救车到来时保存当前的状态
{
temp0=temp;
k++;
}
else
flag=0;
flag0=0;
flag1=0;
flag2=0;
temp0=date;
date0++;
if(date0==1000)
{
date0=0;
date--;
if(date==0xff)
{
date=9;
flag3=0;
}
}
}
if(k==1000)
{
k=0;
temp--;
tempcount++;
}
dispbuf[1]=temp0%10;
dispbuf[0]=temp0/10;
dispbuf[3]=temp0%10;
dispbuf[2]=temp0/10;
dispbuf[5]=temp0%10;
dispbuf[4]=temp0/10;
dispbuf[7]=temp0%10;
dispbuf[6]=temp0/10;
if(0<tempcount&&tempcount<=30)
{
if(tempcount==30)
{
temp=4;
flag=0;
if(flag3==0)
{
flag0=1;
dispbuf[2]=16;
dispbuf[3]=16;
dispbuf[4]=16;
dispbuf[5]=16;
}
}
else if(flag3==0)
flag=1;
}
if(30<tempcount&&tempcount<=35) //东西方向绿灯亮了30s后,东西方向黄灯亮 ,南北方向红灯闪烁
{
if(flag3==0)
flag0=1;
if(tempcount==35)
{
temp=19;
flag0=0;
if(flag3==0)
flag1=1;
}
else if(flag3==0) //黄灯亮时,如果警车或急救车到来时显示时间否者不显示时间
{
dispbuf[2]=16;
dispbuf[3]=16;
dispbuf[4]=16;
dispbuf[5]=16;
}
}
if(35<tempcount&&tempcount<=55) //东西方向黄灯亮了5s后,东西方向红灯亮,南北方向绿灯亮
{
if(flag3==0)
flag1=1;
if(tempcount==55)
{
temp=4;
flag1=0;
if(flag3==0)
{
flag2=1;
dispbuf[0]=16;
dispbuf[1]=16;
dispbuf[6]=16;
dispbuf[7]=16;
}
}
}
if(55<tempcount&&tempcount<=60) //南北方向绿灯亮了20s后,南北方向黄灯亮,东西方向红灯闪烁
{
if(flag3==0)
flag2=1;
if(tempcount==60) //南北方向黄灯亮了5s后,南北方向红灯亮,东西方向绿灯亮
{
tempcount=0;
temp=29;
flag2=0;
if(flag3==0)
flag=1;
}
else if(flag3==0) //黄灯亮时,如果警车或急救车到来时显示时间否者不显示时间
{
dispbuf[0]=16;
dispbuf[1]=16;
dispbuf[6]=16;
dispbuf[7]=16;
}
}
}
void into(void)interrupt 0 using 1
{
delay10ms();
IE0=0;
flag3=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -