该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include //我们对51单片机编程,要引用头函数
sbit led_A=P0^0; //数码管位
sbit led_B=P0^1; //数码管位
//***************led指示灯引脚定义*****************//
sbit dx_R=P0^2;
sbit dx_Y=P0^3;
sbit dx_G=P0^4;
sbit nb_R=P0^7;
sbit nb_Y=P0^6;
sbit nb_G=P0^5;
bit flag=0;
sbit key_stop=P3^3;
char N=25; //初始时间是25
char tab_disp[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极码表
/*延时子函数*/
void delay(int t ){while(t--);}
/*显示子函数*/
void display(char dat)
{
led_A=led_B=0; //先位灭显
P2=0XFF; //再段灭显
P2=tab_disp[dat/10]; //赋显示的数
if(dat/10)led_A=1;
delay(1000);//延时
P2=0XFF;led_A=led_B=0; //段灭显位灭显
P2=tab_disp[dat%10]; //赋显示的数
led_B=1;
delay(1000); //延时
}
//这个是循环显示60遍显示的函数
void deal(char m)
{
int t=60;
while(t--)display(m); //循环显示60遍显示的函数
}
void KEY() //按键函数
{
unsigned char save; //定义保存灯状态的变量
if(key_stop==0) //按键是否按下
{
delay(20); //延时去抖
if(key_stop==0) //再次判断按键是否按下
{
flag=1; //紧急状态标志位置1,进入紧急通行状态
save=P0; //保存灯的状态
P0=0x84; //全部亮红灯
while(key_stop==0); //按键释放,当按键一直按下的时候,程序就会一直执行这里,直到按键按下
while(flag==1) //如果是紧急状态就一直执行下面的程序
{
if(key_stop==0) //在紧急状态时判断按键是否按下
{
delay(50); //延时去抖
if(key_stop==0) //再次判断按键是否按下
{
flag=0; //紧急状态标志位清零,退出紧急状态
P0=save; //LED灯恢复到之前状态
while(key_stop==0); //按键释放
}
}
}
}
}
}
/*主函数*/
void main(void)
{
char i;
EA=1; //全局中断开关
IT1=1; //外部中断下降沿有效
EX1=1;
while(1)
{
N=25; //初始时间是25
dx_R=1;dx_Y=0;dx_G=0;//指示灯0是亮,1是灭
nb_R=0;nb_Y=0;nb_G=1;//指示灯0是亮,1是灭
for(i=N;i>0;i--) //一秒一秒的减
{
deal(i);
KEY();
}
dx_R=1;dx_Y=0;dx_G=0;//指示灯0是亮,1是灭
nb_R=0;nb_Y=1;nb_G=0;//指示灯0是亮,1是灭
N=5; //时间变成5
for(i=N;i>0;i--) //一秒一秒的减
{
deal(i);
KEY();
}
dx_R=0;dx_Y=0;dx_G=1;//指示灯0是亮,1是灭
nb_R=1;nb_Y=0;nb_G=0;//指示灯0是亮,1是灭
N=25;//时间变成25
for(i=N;i>0;i--) //一秒一秒的减
{
deal(i);
KEY();
}
dx_R=0;dx_Y=1;dx_G=0;//指示灯0是亮,1是灭
nb_R=1;nb_Y=0;nb_G=0; //指示灯0是亮,1是灭
N=5; //时间变成5
for(i=N;i>0;i--) //一秒一秒的减
{
deal(i);
KEY();
}
}
}