社区导航

 

搜索
查看: 1289|回复: 8

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

[复制链接]

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-4-8 01:05 | 显示全部楼层 |阅读模式
#include  
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();                   //调显示
    }   
       
   }                                                          


此帖出自51单片机论坛

回复

使用道具 举报

5714

TA的帖子

207

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-4-8 08:42 | 显示全部楼层
跑慢正常,跑快跑慢都正常,这种方案不可能做出产品精度的电子钟

EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,上班摸鱼场,释放压力好地方!商家勿入!加群暗号:喵


回复

使用道具 举报

835

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2018-4-8 08:42 | 显示全部楼层
定时器中断只做一件事,就事加1,然后需要考虑你的晶振源是否精准。

回复

使用道具 举报

888

TA的帖子

1

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2018-4-8 09:21 | 显示全部楼层
不管跑快还是跑慢都正常,这种东西本来就存在误差,所以,你每隔一段时间就应该做一次校准,这样才能保证误差最小,但是也不能完全消除误差

回复

使用道具 举报

2818

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-4-8 11:15 | 显示全部楼层
定时器本身就是依据晶振的精度来的,加上还有中断处理时间,然后经过几级倍增误差就进一步放大,这个时钟精度看看就好了。没有实用价值,要不就使用时钟芯片,要不就使用带RTC的MCU。

回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2018-4-8 18:35 | 显示全部楼层
建议很好,谢谢大家

回复

使用道具 举报

3574

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-4-8 22:53 | 显示全部楼层
51的方式1是16位软重装,你在中断服务里没有重装定时器,所以按65536回零计数了。

回复

使用道具 举报

3574

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-4-8 22:56 | 显示全部楼层
慢了,65536/10000=6.5倍

回复

使用道具 举报

6

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2020-3-25 12:35 | 显示全部楼层
huo_hu 发表于 2018-4-8 22:56 慢了,65536/10000=6.5倍

这位大神说的对,没有手动重装


回复

使用道具 举报

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

关闭

站长推荐上一条 1/6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-3-29 22:50 , Processed in 0.268798 second(s), 18 queries , Gzip On, MemCache On.

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