|
自己做的交通燈,為什么倒計時顯示不對,程序我也沒發現哪里錯的
#include<stdio.h>
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar keyon;
//sbit control=P3^3;
p2=0;
int sn_g_time,ew_g_time,sn_y_time,ew_y_time,sn_r_time,ew_r_time;
int ew_g_time1,sn_y_time1,ew_y_time1,ew_r_time1,sn_r_time1;
int sntime=0,ewtime=0,ytime=0;
int sntime1=0,ewtime1=0,ytime1=0;
int sg,eg,sy,ey,sr,er,sg1,eg1,sy1,ey1,sr1,er1;
char mode=1;
bit model=1; //模式標志
char flag1,flag2,flag3; //普通模式的標志
char inl1,inl2; //智能模式的標志
char car,n=0,m=0;
int RR1=0,RR2=0,RR3=0,RR4=0;//普通模式的寄存器
int TT1=0,TT2=0,TT3=0; //智能模式的寄存器
char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar data buffer[4]={0};
uchar data buf[2]={0};
/**************************按鍵掃描***************************************/
void delay(uint z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar key()
{ uchar keyon,temp;
P1=0x0f;
delay(1);
temp=P1^0x0f;
switch(temp)
{
case 1:keyon=0;break;
case 2:keyon=1;break;
case 4:keyon=2;break;
case 8:keyon=3;break;
default:keyon=16;
}
P1=0xf0;
delay(1);
temp=P1>>4^0x0f;
switch(temp)
{
case 1:keyon+=0;break;
case 2:keyon+=4;break;
case 4:keyon+=8;break;
case 8:keyon+=12;break;
}
return keyon;
}
void smg_display(int sn,int ew) //數碼管顯示
{
buffer[0]=sn/10;
buffer[1]=sn%10;
buffer[2]=ew/10;
buffer[3]=ew%10;
P3=0x8f;P0=tab[buffer[0]];delay(3);
P3=0x1f;P0=tab[buffer[1]];delay(2);
P3=0x2f;P0=tab[buffer[2]];delay(2);
P3=0x4f;P0=tab[buffer[3]];delay(2);
}
void common() //普通模式
{
if(flag1==1)
{
if(flag2==1)
{
if(flag3==1)
{
P2=0xf5;//sn_red=0;ew_yellow=0;
smg_display(sr,ey);
if(n==20)
{
sr--;
ey--;
n=0;
}
}
else
{
P2=0xf3;//sn_red=0;ew_green=0;
smg_display(sr,eg);
if(n==20)
{
sr--;
eg--;
n=0; }
}
}
else
{
P2=0xee;//sn_yellow=0;ew_red=0;
smg_display(sy,er);
if(n==20)
{
sy--;
er--;
n=0;}
}
}
else
{
P2=0xde;//sn_green=0;ew_red=0;
smg_display(sg,er);
if(n==20)
{
sg--;
er--;
n=0;}
}
}
void intelligent( ) //智能模式
{
P0=0x00;
P2=0xde;//sn_green=0;ew_red=0;
if(car==1)
{
if(inl1==1)
{
if(inl2==1)
{
P2=0xf5;//sn_red=0;ew_yellow=0;
smg_display(sr1,ey1);
if(m==20)
{
sr1--;
ey1--;
m=0;}
}
else
{
P2=0xf3;//sn_red=0;ew_green=0;
smg_display(sr1,eg1);
if(m==20)
{
sr1--;
eg1--;
m=0;}
}
}
else
{
P2=0xee;//sn_yellow=0;ew_red=0;
smg_display(sy1,er1);
if(m==20)
{
sy1--;
er1--;
m=0;}
}
}
}
void zero_off(uchar *p) //去零函數
{
uchar i;
for(i=0;i<2;i++)
{
if(*p==0)
{*p=10;p++;}
else break;
}
}
void sn_display(int snew)
{
buf[0]=snew/10;
buf[1]=snew%10;
zero_off(buf);
P3=0x2f;P0=tab[buf[0]];delay(2);
P3=0x4f;P0=tab[buf[1]];delay(2);
}
void chage_sntime()
{
P3=0x00;
while(1)
{
if(P1!=0xf0)
{
keyon=key();
while(P1!=0xf0);
if(keyon<=9)
{
sntime=sntime*10+keyon;
}
if(keyon==10)
{
sntime++;
}
if(keyon>10)
{
if(keyon==13) //再按13鍵,確定并退出
{
sn_g_time=sntime;
sntime=0;
return;
}
}
}
sn_display(sntime);
}
}
void ew_display(int snew)
{
buf[0]=snew/10;
buf[1]=snew%10;
zero_off(buf);
P3=0x2f;P0=tab[buf[0]];delay(2);
P3=0x4f;P0=tab[buf[1]];delay(2);
}
void chage_ewtime()
{
P3=0x00;
while(1)
{
if(P1!=0xf0)
{
keyon=key();
while(P1!=0xf0);
if(keyon<=9)
{
if(model==1)
ewtime=ewtime*10+keyon;
else if(model==0)
ewtime1=ewtime1*10+keyon;
}
if(keyon==10)
{
ewtime++;
}
if(keyon>10)
{
if(keyon==12) //再按12鍵,確定并退出
{
if(model==1)
{
ew_g_time=ewtime;
ewtime=0;
return;
}
else if(model==0)
{
ew_g_time1=ewtime1;
ewtime1=0;
return;
}
}
}
}
if(model==1)
ew_display(ewtime);
else if(model==0)
ew_display(ewtime1);
}
}
void chage_y_time()
{
P3=0x00;
while(1)
{
if(P1!=0xf0)
{
keyon=key();
while(P1!=0xf0);
if(keyon<=9)
{
if(model==1)
ytime=ytime*10+keyon;
else if(model==0)
ytime1=ytime1*10+keyon;
}
if(keyon>9)
{
if(keyon==11) //再按11鍵,確定并退出
{
if(model==1)
{
sn_y_time=ew_y_time=ytime;
ytime=0;
return;
}
else if(model==0)
{
sn_y_time1=ew_y_time1=ytime1;
ytime1=0;
return;}
}
}
}
if(model==1)
sn_display(ytime);
else if(model==0)
sn_display(ytime1);
}
}
/***************************主函數**********************************/
void main()
{
car=0;
sg=sn_g_time=15;
eg=ew_g_time=10;
eg1=ew_g_time1=10;
sy=ey=sn_y_time=ew_y_time=4;
sy1=ey1=er1=sn_y_time1=ew_y_time1=4;
sr=sn_r_time=ew_g_time+ew_y_time;
sr1=sn_r_time1=ew_g_time1+ew_y_time1;
er=ew_r_time=sn_g_time+sn_y_time;
TMOD=0x01; //中斷初始化
IE=0x82;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
while(1)
{
P1=0xf0;
if(P1!=0xf0)
{ keyon=key();
while(P1!=0xf0);
if(keyon==15) //15鍵,模式選擇
{
mode++;
model=(bit)(mode&0x01);
}
if(keyon==14) //14鍵,有車來
car=1;
if(keyon==13) //13鍵,修改主通道綠燈時間
chage_sntime();
if(keyon==12) //12鍵,修改次通道綠燈時間
chage_ewtime();
if(keyon==11) //11鍵,修改黃燈時間
chage_y_time();
}
if(model==1) //modle=1,普通模式
{
common();
eg1=ew_g_time1; //智能模式賦初值
sy1=ey1=er1=sn_y_time1=ew_y_time1;
sr1= sn_r_time1=ew_g_time1+ew_y_time1;
}
else if(model==0)
{
intelligent(); //modle=0,智能模式
sg=sn_g_time; //普通模式賦初值
eg=ew_g_time;
sy=ey=sn_y_time=ew_y_time;
sr=sn_r_time=ew_g_time+ew_y_time;
er=ew_r_time=sn_g_time+sn_y_time;
}
if(sg==0) sg=sn_g_time;
if(eg==0) eg=ew_g_time;
if(sy==0) sy=sn_y_time;
if(ey==0) ey=ew_y_time;
if(sr==0) sr=sn_r_time;
if(er==0) er=ew_r_time;
if(eg1==0) eg1=ew_g_time1;
if(sy1==0) sy1=sn_y_time1;
if(ey1==0) ey1=ew_y_time1;
if(sr1==0) sr1=sn_r_time1;
if(er1==0) er1=ew_y_time1;
}
}
/**************************T0中斷服務子程序*******************************/
void time0_int() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(model==1)
{
TT1=TT2=TT3=0;
car=0;
m=0;
if(RR1==sn_g_time*20)
{flag1=1;
if(RR2==sn_y_time*20)
{flag2=1;
if(RR3==ew_g_time*20)
{
flag3=1;
if(RR4==ew_y_time*20)
{
RR1=RR2=RR3=RR4=0;
return;}
else
{
RR4++;n++;
return; }
}
else
{
RR3++;n++;
flag3=0;
return;}
}
else
{
RR2++;n++;
flag2=0;
return;}
}
else
{RR1++;n++;
flag1=0;
return;}
}
else if(model==0)
{
RR1=RR2=RR3=RR4=0;
n=0;
if(car==1)
{if(TT1==sn_y_time1*20)
{inl1=1;
if(TT2==ew_g_time1*20)
{inl2=1;
if(TT3==ew_y_time1*20)
{TT1=TT2=TT3=0;
car=0;
return;}
else
{
TT3++;m++;
return; }
}
else
{
TT2++;m++;
inl2=0;
return;}
}
else
{
TT1++;m++;
inl1=0;
return; }
}
else return; }
}
|
|