📄 xinhaodeng.c
字号:
#include <AT89X51.h>
void display(unsigned int A,unsigned int B);//数码管显示控制函数
void delay10ms();
void status();
void status1();
void status2();
void status3();
void status4();
void status5();
void status6();
void status7();
void xhd();//信号灯控制函数
unsigned int na;//a道信号灯显示时间
unsigned int nb;//b道信号灯显示时间
unsigned char flag;//1s到状态标志
unsigned int count;
unsigned int sum;
unsigned char state;//灯状态标志
unsigned char old_state;//灯中断前状态标志
unsigned char old_sum;
unsigned char old_na;
unsigned char old_nb;
unsigned char spstate0;//特殊状态标志
unsigned char spstate1;
main()
{flag=0;
count=0;
P1=0xff;
P0=0xff;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
ETI=1;
TR1=1;
TR0=1;
EX0=1;
EX1=1;
state = 0;
spstate0 = 0;
spstate1=0;
xhd();
}
//........中断函数.........//
T0_srv() interrupt 1 using 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{count=0;
flag=1;
}
}
int0_srv() interrupt 0 using 2
{unsigned int i;
for(i=0;i<10000;i++);
if(P3_2==0)
{ if (spstate0 == 1)
{
}
else
{ spstate0 = 1;
spstate1 = 1;//紧急状态下不可过街
old_state = state;//保存中断前的状态
old_sum = sum;
old_na = na;
old_nb = nb;
state = 5;
sum = 5;
na=5;
nb=5;
}
}
}
int1_srv() interrupt 2 using 3
{unsigned int i;
for(i=0;i<10000;i++);
if(P3_3==0)
{ if (spstate1 == 1)
{
}
else
{ spstate1 = 1;
state = 7;
sum = 5;
na=5;
nb=5;
}
}
}
//.........子函数.........//
void xhd()
{
while(1)
{status();
}
}
void status()
{ switch(state)
{ case 0: sum = 30 ; na =30; nb=35; state = 1;break;
case 1:status1();break;
case 2:status2();break;
case 3:status3();break;
case 4:status4();break;
case 5:status5();break;
case 6:status6();break;
case 7:status7();break;
}
if (flag == 1)
{ sum--;
na--;
nb--;
flag = 0;
}
display(na,nb);
}
void status1()
{ P1=0xdb;
spstate1=1;
if (sum == 0)//A绿30s到
{ state = 2;
sum = 5;
na = 5;
nb = 5;
spstate1=0;
}
}
void status2()
{P1=0xdd;
if (sum == 0)
{ state = 3;
sum = 15;
na=20;
nb=15;
}
}
void status3()
{P1=0xf6;
if (sum == 0)
{ state = 4;
sum = 5;
na=5;
nb=5;
}
}
void status4()
{P1=0xee;
if (sum == 0)
{ state = 0;
}
}
void status5()
{ P1=0xed;
if (sum == 0)
{ state = 6;
sum = 20;
na=20;
nb=20;
}
}
void status6()
{P1=0xde;
if (sum == 0)
{ state = old_state;//恢复中断前的状态
sum = old_sum;
na = old_na;
nb = old_nb;
spstate0 = 0;//一次紧急状态结束后,允许第二次紧急状态情况发生
spstate1 = 0;//紧急状态结束后,可以过街
}
}
void status7()
{P1=0xee;
if(sum==0)
{ state = 0;
spstate1 = 0;
}
}
void display(unsigned int A,unsigned int B)
{
P0=A%10+0x70;
delay10ms();
P0=A/10+0xB0;
delay10ms();
P0=B%10+0xD0;
delay10ms();
P0=B/10+0xE0;
delay10ms();
}
void delay10ms()
{unsigned int i;
unsigned int j;
for(i=2;i>0;i--)
for(j=248;j>0;j--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -