#include<reg52.h>
#include<delay.h>
/*************************函数声明**************************/
void show(); //显示函数
void init();
/************************端口定义**************************/
sbit k1=P3^7; // K1 时间加
sbit k2=P3^6; // K2 时间减
sbit k3=P3^5; // K3 暂停,确认
sbit led_red_a=P2^0; //
sbit led_red_b=P2^2; //
sbit led_green_a=P2^1; //
sbit led_green_b=P2^3; //
sbit WX_a_1=P2^4; //
sbit WX_a_2=P2^5; //
sbit WX_b_1=P2^6; //
sbit WX_b_2=P2^7; //
/************************变量定义**************************/
char temp1 = 30; // 初始红绿灯时间
uchar temp2; //产生1秒 计数变量...........................................................这个出错
uchar temp4=30; //存储时间更改变量
uchar flag1=0; //a,b,两个方向红路灯切换标志
uchar flag2=0; //暂停标志
/**********************数组定义***************************/
uchar tab_dx[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴,不带小数点
/************************显示**************************/
void show()
{
if(flag1==0) //a 红灯亮 绿灯灭 b 红灯灭 绿灯亮
{
led_red_a=0;
led_red_b=1;
led_green_a=1;
led_green_b=0;
}
else //a 红灯灭 绿灯亮 b 红灯亮 绿灯灭
{
led_red_a=1;
led_red_b=0;
led_green_a=0;
led_green_b=1;
}
if(flag1==0)
{
WX_a_1=1;
WX_a_2=1;
WX_b_1=1;
WX_b_2=0;
P0=tab_dx[temp1%10];
delayxms(3);
P0=0x00;
WX_a_1=1;
WX_a_2=1;
WX_b_1=0;
WX_b_2=1;
P0=tab_dx[temp1/10];
delayxms(3);
P0=0x00;
}
else
{
WX_a_1=1;
WX_a_2=0;
WX_b_1=1;
WX_b_2=1;
P0=tab_dx[temp1%10];
delayxms(3);
P0=0x00;
WX_a_1=0;
WX_a_2=1;
WX_b_1=1;
WX_b_2=1;
P0=tab_dx[temp1/10];
delayxms(3);
P0=0x00;
}
}
/************************显示1**************************/
void show_1()
{
static uchar kk;
kk++;
led_red_a=0;
led_red_b=0;
led_green_a=1;
led_green_b=1;
WX_a_1=1;
WX_a_2=1;
WX_b_1=1;
WX_b_2=0;
P0=tab_dx[temp4%10];
delayxms(kk/126);
P0=0x00;
WX_a_1=1;
WX_a_2=1;
WX_b_1=0;
WX_b_2=1;
P0=tab_dx[temp4/10];
delayxms(kk/126);
P0=0x00;
WX_a_1=1;
WX_a_2=0;
WX_b_1=1;
WX_b_2=1;
P0=tab_dx[temp4%10];
delayxms(kk/126);
P0=0x00;
WX_a_1=0;
WX_a_2=1;
WX_b_1=1;
WX_b_2=1;
P0=tab_dx[temp4/10];
delayxms(kk/126);
P0=0x00;
}
/************************按键检测**************************/
void key()
{
if(k1==0) //时间加
{
delayxms(10);
while(k1==0) ;
temp4++;
temp1=temp4;
if(temp4==91)
{
temp4=0;
}
}
if(k2==0) // 时间减
{
delayxms(10);
while(k2==0);
temp4--;
temp1=temp4;
if(temp4==-1)
{
temp4=90;
}
}
if(k3==0) // 暂停,确认
{
delayxms(10);
while(k3==0);
flag2=~flag2;
}
}
/************************中断初始化**************************/
void init()
{
TMOD=0x11; //设置定时器0,1为工作方式1
TH0=(65536-50000)/256; //初值
TL0=(65536-50000)%256;
// TH1=(65536-50000)/256; //初值
// TL1=(65536-50000)%256;
EA=1; //打开中断总开关
ET0=1; //开定时器0中断
// ET1=1; //开定时器1中断
TR0=1; //启动定时器0
EX0 = 1; /* 允许外部中断0中断 */
PX0 = 1; /* 外部中断0为高优先级 */
}
/************************************************************
主函数
*************************************************************/
void main()
{
init();
while(1)
{
key();
if(flag2==0)
{
TR0=1;
show(); //显示函数
}
else
{
TR0=0;
show_1(); //显示函数
}
}
}
/* ----------------- t0中断函数 ----------------- */
void time1() interrupt 1
{
TH0=(65536-50000)/256; //
TL0=(65536-50000)%256;
temp2++;
if(temp2 == 20)
{
temp2=0;
temp1=temp1-1;
if(temp1==-1)
{
temp1=temp4;
flag1=~flag1;
}
}
}
/* ----------------- 外部中断函数 ----------------- */
int0_srv( ) interrupt 0 using 2
{
uchar a,b,c,d;
int i;
for (i = 0;i<10000;i++);
if ( INT0 ==0)
{
a=led_red_a; //保留指示灯状态
b=led_red_b;
c=led_green_a;
d=led_green_b;
while(INT0==0)
{
led_red_a=0;
led_red_b=0;
led_green_a=1;
led_green_b=1; /* 使两边亮起红灯 */
if(flag1==0)
{
WX_a_1=1;
WX_a_2=1;
WX_b_1=1;
WX_b_2=0;
P0=tab_dx[temp1%10];
delayxms(3);
P0=0x00;
WX_a_1=1;
WX_a_2=1;
WX_b_1=0;
WX_b_2=1;
P0=tab_dx[temp1/10];
delayxms(3);
P0=0x00;
}
else
{
WX_a_1=1;
WX_a_2=0;
WX_b_1=1;
WX_b_2=1;
P0=tab_dx[temp1%10];
delayxms(3);
P0=0x00;
WX_a_1=0;
WX_a_2=1;
WX_b_1=1;
WX_b_2=1;
P0=tab_dx[temp1/10];
delayxms(3);
P0=0x00;
}
}
led_red_a=a;
led_red_b=b;
led_green_a=c;
led_green_b=d; /* 恢复指示灯状态 */
}
}
|