問題都有:控制東西方向通行時間加一的按鍵按下(或者控制南北方向的按鍵按下)再次啟動后東西方向的數碼管會胡亂顯示數字,比如 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();}
}
}
}
|