• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

为什么我用定时器做的秒表第一位一直显示0。

025c833b2bb372e8 2018-11-30 浏览量:1457

做的秒表0.000到9.999的,为什么第一位一直是0,不是毫秒那三位,毫秒那三位不用准确。是秒的那一位一直显示0,应该循环显示0到9的。


#include<reg52.h>
#define date P0     //用date代替P0

unsigned char t=0;    //t为多少毫秒

void display();     //声明数码管显示子函数
void delay();     //声明延时子函数

void main()
{
         TMOD = 0x01;    //方式1,为16位定时器

         TH0 = 0xFC;     //对高8位和低8位分别赋初值,使一个周期为1ms
         TL0 = 0x66;     //
         EA = 1;      //打开总中断
         ET0 = 1;     //打开定时器0中断
         TR0 = 1;      //打开定时器0
         while(1)   
         {  
              display();     //进入数码管显示的子函数
         }
}

void Timer() interrupt 1     //定义定时器,1为定时器中断0
{
     TL0 = 0x66;      //对低8位和高8位赋初值,使一个周期为1ms
     TH0 = 0xFC;     //
     TF0 = 0;     //定时器0溢出,用此语句清0
     t++;      //t加1毫秒

}
/******************数码管*********************/
unsigned char code c[]={0xC00xF90xA40xB00x990x920x820xF80x800x90  //定义一个数组显示0到9
     0x880x830xC60xA10x860x8E0xFF};

unsigned char code d[]={0x400x790x240x300x190x120x020x780x000x10};  //定义一个数组显示0到9并带着小数点
              
void display()     //数码管显示
{

     if(t > 9999)      //当t=10000时,也就是10秒时
     {
          t = 0;       //t重新为0
     }

     P2 = ~0x08;     //第一位
     date = c[((t%1000)%100)%10];//第一位显示t的个位数
     delay();        //延时
     date = c[16];    //消隐

     P2 = ~0x04;     //第二位
     date = c[((t%1000)%100)/10];//第二位显示t的十位数
     delay();     //延时
     date = c[16];    //消隐

     P2 = ~0x02;     //第三位
     date = c[(t%1000)/100];  //第三位显示t的百位数
     delay();     //延时
     date = c[16];     //消隐

     P2 = ~0x01;     //第四位
     date = d[t/1000];   //第四位显示t的千位数
     delay();     //延时
     date = c[16];    //消隐
}          

void delay()     //延时
{    
     unsigned char i = TH0+1; //
     if(i > 0xFE)    //
     {
          i = 0xFC;    //
     }
     while(i != TH0);   //
}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 因为低位更新太快啊。

    对人眼来说看不到那么快的频率的。就是0.0X的x位都看不清,更不要说0.00y的y位啦。

    所以原来人工按秒表,的x位其实没有多大意义,现在体育赛事中都是用的电子计时才能到y位。

    • 发布于 2018-12-01
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:12
  • 变量t的数据类型不对,无符号字符型最多只能到255,超不过1000,你改成无符号整型!!
    • 发布于2018-11-30
    • 举报
    • 评论 1
    • 2
    • 0
025c833b2bb372e8 回复了 65aa8e78af56cece :改成unsigned int 也不行,能显示多少秒,但老是闪 回复

  • 你的显示函数已经超过N个MS了  更新速度根本无法支持MS级别的显示   然后就是数码管更新太快了  低位是看不到具体数字的
    • 发布于2018-11-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 毫秒走的太快,而显示太慢。跟不上,不同步
    • 发布于2018-11-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 不是毫秒那三位。是秒的那一位一直显示0,应该循环显示0到9。毫秒那个不用太准确。
    • 发布于2018-11-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 你先用串口跑一下程序看看是不是在循环打印,驱动秒那位的数码管的引脚是否配置正确,一步步排查。

    • 发布于2018-11-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 数据类型定义不对,t定义为unsigned char 取值范围是0~255,t++到255时就已经溢出了。
    • 发布于2018-11-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 换成unsigned int 也不行,可以显示多少秒,但老是闪,一会亮一会灭的。
    • 发布于2018-11-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 你的这个程序流程不太好,建议你这样做:

    设定一个变量为 short类型。初值为0;

    设定好定时器,每一毫秒中断一次;

    然后在中断程序中变量++;

    主程序中直接显示这个变量就可以。

    然后在主程序中判断,如果到了10秒就清零即可。

    • 发布于2018-11-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 你这里要写入屏幕,本身就要消耗一定的时间,自然不准
    • 发布于2018-12-11
    • 举报
    • 评论 0
    • 0
    • 0

  • 主要是你的刷新需要时间,这样会导致时间不准确
    • 发布于2019-01-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 你的程序里面有很多延时,这些会导致你的数据有问题
    • 发布于2019-01-12
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

为什么我用定时器做的秒表第一位一直显示0。