找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1817|回复: 5
收起左侧

单片机共阴极数码管显示不对,倒计时不对

[复制链接]
ID:607782 发表于 2019-9-11 10:31 | 显示全部楼层 |阅读模式
自己做的交通灯,为什么倒计时显示不对,程序我也没发现哪里错的
#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;    }
}


FPJDZCNWBI28Y6C105B2KRJ.png
回复

使用道具 举报

ID:462827 发表于 2019-9-11 11:32 | 显示全部楼层
私聊,把文件打包发来,可以帮你调试修改好。
回复

使用道具 举报

ID:212177 发表于 2019-9-11 11:50 来自手机 | 显示全部楼层
哪里不对?出了什么问题
回复

使用道具 举报

ID:607782 发表于 2019-9-11 15:30 | 显示全部楼层
文件再这里,不对再问我要

交通灯.zip

60.62 KB, 下载次数: 6

回复

使用道具 举报

ID:123289 发表于 2019-9-11 21:49 | 显示全部楼层
是抄的,还是自己写的呢?
回复

使用道具 举报

ID:608355 发表于 2019-9-12 14:39 | 显示全部楼层
我也是这个问题,好像是数码管消隐问题。我也在修改,我删了智能模式P0=0x00;数码管显示正常了。但开始有一个显示问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表