標題: 單片機共陰極數(shù)碼管顯示不對,倒計時不對 [打印本頁]

作者: zzzlll123    時間: 2019-9-11 10:31
標題: 單片機共陰極數(shù)碼管顯示不對,倒計時不對
自己做的交通燈,為什么倒計時顯示不對,程序我也沒發(fā)現(xiàn)哪里錯的
#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)     //數(shù)碼管顯示
{
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)        //去零函數(shù)
{
    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);
  }   
}
/***************************主函數(shù)**********************************/
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中斷服務(wù)子程序*******************************/
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;    }
}


FPJDZCNWBI28Y6C105B2KRJ.png (73.68 KB, 下載次數(shù): 62)

FPJDZCNWBI28Y6C105B2KRJ.png

作者: hantu    時間: 2019-9-11 11:32
私聊,把文件打包發(fā)來,可以幫你調(diào)試修改好。
作者: l6931639    時間: 2019-9-11 11:50
哪里不對?出了什么問題
作者: zzzlll123    時間: 2019-9-11 15:30
文件再這里,不對再問我要

交通燈.zip

60.62 KB, 下載次數(shù): 6


作者: yzwzfyz    時間: 2019-9-11 21:49
是抄的,還是自己寫的呢?
作者: 廖新宇    時間: 2019-9-12 14:39
我也是這個問題,好像是數(shù)碼管消隱問題。我也在修改,我刪了智能模式P0=0x00;數(shù)碼管顯示正常了。但開始有一個顯示問題





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1