问题都有:控制东西方向通行时间加一的按键按下(或者控制南北方向的按键按下)再次启动后东西方向的数码管会胡乱显示数字,比如 35 25 29这样,然而南北方向的数码管就不会,可是这两个按键采用的是一样的编程思想呀,求大神指教,另外想加一个夜间模式,所有黄灯闪烁,还请多多指教。
仿真图如下
程序如下
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code a[10]={ //数码管段选表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar code b[4]={0xfe,0xfd,0xfb,0xf7}; //数码管位码组合
uchar code c[4]={0xf3,0xf5,0xde,0xfe,}; //绿红,黄绿,红绿,红黄,黄黄
uchar H=5,NB=25,DX=30,NBG=15,DXG=15;
uchar i,k=0,cnt=0,j=0;
sbit K0=P3^4; //支干道通行
sbit K1=P3^5; //主干道通行
sbit K4=P3^6; //返回
sbit K3=P3^2; //设置时间
sbit K2=P3^3; //夜间模式
void delay(uchar t); //定义延时函数
void key(); //定义按键程序
void display(); //定义显示程序
void settime(); //定义时间设置显示程序
void init(void)
{ //程序初始化
TMOD=0x01; //使用定时器方式1
TH0=0x3c; //(65536-5000)/256
TL0=0xb0; //(65536-5000)%256
IT0=1;
ET0=1;
TR0=1;
EA=1;
EX0=1;
EX1=1;
P1=c[k]; //开启交通灯
}
void delay(uchar t)
{ //延时函数
uchar i;
for(;t>0;t--)
for(i=0;i<20;i++);
}
void int0(void) interrupt 0 //通行时间设置
{
EA=0;
P1=0xf6; //红灯全亮
for(;;)
{
settime();
if(K1==0) //P3^6=0设置主干道通行时间
{
delay(40);
if(K1==0)
{
while(!K1)
{settime();}
DXG++; //主干道通行时间加1
if(DXG==100)
DXG=0;
}
}
if(K0==0) //P3^5=0设置支干道通行时间
{
delay(40);
if(K0==0)
{
while(!K0)
{settime();}
NBG++; //支干道通行时间加1
if(NBG==100)
NBG=0;
}
}
if(K4==0) //P3^6=0返回
{
delay(40);
if(K4==0)
{
while(!K4)
{
}
k=0;P1=c[k];
NB=NBG;DX=DXG+H;
display();
EA=1;
break;
}
}
}
}
void time1(void) interrupt 1 //交通灯控制程序
{
TH0=0x3c; //定时50ms
TL0=0xb0;
cnt++;
if(cnt>=20) //每20*50ms=1s自减1
{
NB--;
DX--;
cnt=0;
if(NB==0||DX==0)
{
k++;
if(k>3)
k=0;
switch(k)
{
case 0:
NB=NBG,DX=NBG+H;j=0;P1=c[k];break; //主干道通行显示绿红
case 1:
NB=H;j=1;P1=c[k];break; //主干道黄灯闪烁
case 2:
NB=DXG+H,DX=DXG;j=0;P1=c[k];break; //支干道通行显示红绿
case 3:
DX=H;j=2;P1=c[k];break; //支干道黄灯闪烁
}
}
}
}
void key() //按键程序
{
if(K1==0) //主干道有车支干道无车
{
delay(40);
if(K1==0)
{
while(!K1)
{
display();
}
k=0,P1=c[k];cnt=0;
NB=NBG, DX=NBG+H;
display();
}
}
if(K0==0) //支干道有车主干道无车
{
delay(40);
if(K0==0)
{
while(!K0)
{
display();
}
k=2,P1=c[k];cnt=0;
NB=DXG+H,DX=DXG;
display();
}
}
}
void settime()
{
P2=b[0],P0=a[(NBG+H)%10]; //显示主干道通行时间
delay(20);
P2=b[1],P0=a[(NBG+H)/10];
delay(20);
P2=b[2],P0=a[(DXG+H)%10]; //显示支干道通行时间
delay(20);
P2=b[3],P0=a[(DXG+H)/10];
delay(20);
}
void display()
{ //显示程序
P2=b[0],P0=a[NB%10];
delay(20);
P2=b[1],P0=a[DX/10];
delay(20);
P2=b[2],P0=a[DX%10];
delay(20);
P2=b[3],P0=a[DX/10];
delay(20);
}
void main(void) //主程序
{
init();
for(;;)
{
display();
key();
//黄灯闪烁程序
while(j==1)
//主干道黄灯闪烁
{
P1=0xfd;
for(i=83;i>0;i--){display();}
P1=c[k];
for(i=83;i>0;i--){display();}
}
while(j==2)
//支干道黄灯闪烁
{
P1=0xef;
for(i=83;i>0;i--){display();}
P1=c[k];
for(i=83;i>0;i--){display();}
}
}
}
|