找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2951|回复: 7
收起左侧

单片机仿真秒表,用五位数码管显示,为什么个位和十位不显示

[复制链接]
ID:527416 发表于 2019-5-5 09:52 | 显示全部楼层 |阅读模式

仿真图

仿真图

代码:#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
uchar temp,aa,m1,m2,m3,shi,ge;
uchar code table[]={
0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void display(uchar m1,uchar m2,uchar m3,uchar shi,uchar ge);
void initial();
void main()
{
  initial();
  while(1)
  {
    if(key1==0)
    {
            delay(10);
            if(key1==0)
            {
            while(!key1);
                  TR0=1;
                  }
          }
          if(key2==0)
          {
            delay(10);
            if(key2==0)
            {
            while(!key2);
                  TR0=0;
                  }
        }
          if(key3==0)
          {
            delay(10);
            if(key3==0)
             {
              while(!key3);
                    temp=0;
                    m1=0;
                    m2=0;
                    m3=0;
                    shi=0;
                    ge=0;
                    TR0=0;
                }
        }
        display(m1,m2,m3,shi,ge);
        }
}

void delay(uint z)   
{  
  uint x,y;  
  for(x=z;x>0;x--)

                for(y=110;y>0;y--);
        
}

void display(uchar m1,uchar m2,uchar m3,uchar shi,uchar ge)
{
  P2=0xfe;
  P0=table[m1];
  delay(10);

  P2=0xfd;
  P0=table[m2];
  delay(10);

  P2=0xfc;
  P0=table[m3];
  delay(10);

  P2=0xfb;
  P0=table[ge];
  delay(10);

  P2=0xfa;
  P0=table[shi];
  delay(10);
}

void initial()
{
  temp=0;
  TMOD=0x01;
  TH0=(65536-500)/256;
  TL0=(65536-500)%256;
  EA=1;
  ET0=1;
}


timer0() interrupt 1
{
  TH0=(65536-500)/256;
  TL0=(65536-500)%256;
  aa++;
  m3=aa/100;
  m2=aa%100/10;
  m1=aa%100%10;
  if(aa==1000)
  {
    aa=0;
          temp++;
          if(temp==99)
           {
            temp=0;
           }
           shi=temp/10;
           ge=temp%10;
   }
}

回复

使用道具 举报

ID:123289 发表于 2019-5-5 12:22 | 显示全部楼层
等至aa=1000的时候,你就看到显示了。耐心等待吧。
回复

使用道具 举报

ID:462827 发表于 2019-5-5 12:23 | 显示全部楼层
中断函数里shi和ge的获取要放到if(aa==1000)的花括号之外。
回复

使用道具 举报

ID:213173 发表于 2019-5-5 17:36 | 显示全部楼层
本帖最后由 wulin 于 2019-5-6 06:09 编辑

错误1:位码错误,应该是0xfe,0xfd,0xfb,0xf7,0xef。
错误2:数据类型错误,应该是uint aa。
错误3:1ms定时数据错误。
当然还有运行中的问题:按键干扰显示,数码管会闪烁等等。
回复

使用道具 举报

ID:527416 发表于 2019-5-5 20:04 | 显示全部楼层
yzwzfyz 发表于 2019-5-5 12:22
等至aa=1000的时候,你就看到显示了。耐心等待吧。

1000就是1毫秒呀,很快的ne
回复

使用道具 举报

ID:522450 发表于 2019-5-5 21:53 | 显示全部楼层
代码:#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
uchar temp,aa,m1,m2,m3,shi,ge;
uchar code table[]={
0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void display(uchar m1,uchar m2,uchar m3,uchar shi,uchar ge);
void initial();
void main()
{
  initial();
  while(1)
  {
    if(key1==0)
    {
            delay(10);
            if(key1==0)
            {
            while(!key1);
                  TR0=1;
                  }
          }
          if(key2==0)
          {
            delay(10);
            if(key2==0)
            {
            while(!key2);
                  TR0=0;
                  }
        }
          if(key3==0)
          {
            delay(10);
            if(key3==0)
             {
              while(!key3);
                    temp=0;
                    m1=0;
                    m2=0;
                    m3=0;
                    shi=0;
                    ge=0;
                    TR0=0;
                }
        }
        display(m1,m2,m3,shi,ge);
        }
}

void delay(uint z)   
{  
  uint x,y;  
  for(x=z;x>0;x--)

                for(y=110;y>0;y--);
        
}

void display(uchar m1,uchar m2,uchar m3,uchar shi,uchar ge)
{  P2=0xfb;
  P0=table[m1];
  delay(10);



  P2=0xf7;
  P0=table[m2];
  delay(10);



  P2=0xef;
  P0=table[m3];
  delay(10);

  P2=0xfd;
  P0=table[ge];
  delay(10);



  P2=0xfe;
  P0=table[shi];
  delay(10);

}

void initial()
{
  temp=0;
  TMOD=0x01;
  TH0=(65536-500)/256;
  TL0=(65536-500)%256;
  EA=1;
  ET0=1;
}


timer0() interrupt 1
{
  TH0=(65536-500)/256;
  TL0=(65536-500)%256;
  aa++;
  m3=aa/100;
  m2=aa%100/10;
  m1=aa%100%10;
  if(aa==1000)
  {
    aa=0;
          temp++;
          if(temp==99)
           {
            temp=0;
           }
           shi=temp/10;
           ge=temp%10;
   }
}


位选信号搞错了,红色标注了修改过后的,其他的应该问题不大,按照我修改过的运行一次试试,应该没问题的。

回复

使用道具 举报

ID:522450 发表于 2019-5-5 21:57 | 显示全部楼层
哦,忘了,aa的类型确实不对的,要改成uint aa;

其他试试看看
回复

使用道具 举报

ID:522450 发表于 2019-5-5 22:03 | 显示全部楼层
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
uchar temp,m1,m2,m3,shi,ge;uint aa;
uchar code table[]={
0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void display(uchar m1,uchar m2,uchar m3,uchar shi,uchar ge);
void initial();
void main()
{
  initial();
  while(1)
  {
    if(key1==0)
    {
            delay(10);
            if(key1==0)
            {
            while(!key1);
                  TR0=1;
                  }
          }
          if(key2==0)
          {
            delay(10);
            if(key2==0)
            {
            while(!key2);
                  TR0=0;
                  }
        }
          if(key3==0)
          {
            delay(10);
            if(key3==0)
             {
              while(!key3);
                    temp=0;
                    m1=0;
                    m2=0;
                    m3=0;
                    shi=0;
                    ge=0;
                    TR0=0;
                }
        }
        display(shi,ge,m3,m2,m1);
        }

}

void delay(uint z)   
{  
  uint x,y;  
  for(x=z;x>0;x--)

                for(y=110;y>0;y--);
        
}

void display(uchar m1,uchar m2,uchar m3,uchar shi,uchar ge)
{
  P2=0xfd;
  P0=table[m1];
  delay(10);

  P2=0xfe;
  P0=table[m2];
  delay(10);

  P2=0xfb;
  P0=table[m3];
  delay(10);

  P2=0xf7;
  P0=table[ge];
  delay(10);

  P2=0xef;
  P0=table[shi];
  delay(10);
}


void initial()
{
  temp=0;
  TMOD=0x01;
  TH0=(65536-500)/256;
  TL0=(65536-500)%256;
  EA=1;
  ET0=1;
}


timer0() interrupt 1
{
  TH0=(65536-500)/256;
  TL0=(65536-500)%256;
  aa++;
  m3=aa/100;
  m2=aa%100/10;
  m1=aa%100%10;
  if(aa==999)
  {
    aa=0;
          temp++;
          if(temp==99)
           {
            temp=0;
           }
           shi=temp/10;
           ge=temp%10;
   }
}



又改了一下,1、显示顺序,2、位选信号,3、aa类型

试试。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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