51电子钟,中断时间跑慢了,没找到原因!

2019-03-24 17:04发布

#include  <reg52.h>
unsigned  char  LEDBuf[6] ;
unsigned  char  s=100;                 //1秒间中断次数
unsigned  char  Hour=0;
unsigned  char Second=0;
unsigned  char Minute=0;
unsigned  char LEDMAP[]={0X3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}   ;
Delay()                                      //延时
   {unsigned char c;
    for(c=10;c>0;c--)
        ;
   }
void  DisplayLED()                        //动态显示共阴
  {  unsigned   char  i;
         unsigned   char  pos,k;
         pos=0x20;
         for(i=0;i<6;i++)
            {  k=pos;
                   P1=~k;
                   P0=0x00;               
                   P0=LEDBuf[i];
                          Delay();
                   pos>>=1;                          //移为
         }
  }
                       

void   t0()  interrupt  1                 //T0中断
{     s--;                                                        //1秒间中断次数
        if(s==0)
        {  s=100;
                   Second++;
           if(Second==60)
             {Second=0;
                  Minute++;
                  if(Minute==60)
                    {Minute=0;
                     Hour++;
                     if(Hour==24)
                           { Hour=0; }
                    }
              }
         }
       
}
   void  main()
   {
    TMOD = 0x01;                 //方式1
    TH0 = 0xD8;                 //中断初值     0.01毫秒
    TL0 = 0xF0;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
    while(1)
     {
        LEDBuf[5]=LEDMAP[Hour/10];
        LEDBuf[4]=LEDMAP[Hour%10] ;
        LEDBuf[3]=LEDMAP[Minute/10]        ;
        LEDBuf[2]=LEDMAP[Minute%10]        ;
        LEDBuf[1]=LEDMAP[Second/10]        ;
        LEDBuf[0]=LEDMAP[Second%10];

         DisplayLED();                   //调显示
    }   
       
   }                                                          


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
lcofjp
1楼-- · 2019-03-24 22:45
跑慢正常,跑快跑慢都正常,这种方案不可能做出产品精度的电子钟
fsyicheng
2楼-- · 2019-03-24 22:46
 精彩回答 2  元偷偷看……
曹伟1993
3楼-- · 2019-03-25 00:46
不管跑快还是跑慢都正常,这种东西本来就存在误差,所以,你每隔一段时间就应该做一次校准,这样才能保证误差最小,但是也不能完全消除误差
strong161
4楼-- · 2019-03-25 04:31
定时器本身就是依据晶振的精度来的,加上还有中断处理时间,然后经过几级倍增误差就进一步放大,这个时钟精度看看就好了。没有实用价值,要不就使用时钟芯片,要不就使用带RTC的MCU。
LJY327
5楼-- · 2019-03-25 10:30
 精彩回答 2  元偷偷看……
Li_Lei
6楼-- · 2019-03-25 13:22
51的方式1是16位软重装,你在中断服务里没有重装定时器,所以按65536回零计数了。

一周热门 更多>