精确定时是用单片机内的定时器好还是时钟芯片好

2020-02-05 08:53发布

刚看了一个帖子http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4056474&bbs_page_no=1&search_mode=1&search_text=定时&bbs_id=9999
好像用单片机内的定时器定时会有误差,是这样吗?误差来源是什么呢?定时器不是1微妙加一计时的吗? 怎么会有误差呢?我用过方式2,就是那种自动重装载的方式,用protues仿真运行一个小时,好像也看不到误差啊?
    要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
帖子内容如下:
/********定时器T0中断函数**********/
void t0(void) interrupt 1  
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//这样的定时数据,是不是正好是50000*1微秒=50毫秒?
aa++;
if(aa==18)//这里的意思是中断18次,需要1秒的时间(晶振12MHz),我怎么感觉应该是中断20次用时1秒?
  {
    aa=0;
    miao++;
    if(miao==60)
    {
      miao=0;
      fen++;
       if(fen==60)
        {
           fen=0;
           shi++;
          if(shi==24)
             shi=0;
        }
    }
  }

----------------问题附在注释里面,请指点一下,看看这个18是怎么算的吧!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
76条回答
majia-2
1楼-- · 2020-02-06 03:25
 精彩回答 2  元偷偷看……
yz0853
2楼-- · 2020-02-06 03:41
回复【7楼】majia-2  
-----------------------------------------------------------------------
我来学习啊。。晕
millwood0
3楼-- · 2020-02-06 07:04
try this:

========zero cumulative error timing routine, from Black Roman============
//initialize the timer
void t0_init(unsigned short duration) {
  TH0=duration >> 8;  //th0 has the msb
  TL0=duration & 0xff; //tl0 has the lsb
}

/********定时器T0中断函数**********/  
void t0(void) interrupt 1   
{  
static unsigned long total_ticks=0;  //initialize total_ticks
//clear the flag
//TH0=(65536-50000)/256;  
//TL0=(65536-50000)%256;//这样的定时数据,是不是正好是50000*1微秒=50毫秒?  
  total_ticks += 65536ul;  //advance duration;
  if (total_ticks >= DURATION) { //desired duration has reached;
    total_ticks -= DURATION;  //update total_ticks but retain the error
    t0_flag=1;  //set the flag
  }
}

==========================

DURATION is a macro or global variable that determines how long t0_flag will be set.
t0_flag is set when the desired ticks, as specified by DURATION, have been reached.

so if each tick is 1us, and you want t0_flag is set every 500ms, you set DURATION to 500000ul.

the accuracy here depends entirely on the oscillator, and the approach is highly portable.
takashiki
4楼-- · 2020-02-06 09:04
我很奇怪,为什么51做不到精确定时?我的小弟也是这么说,我面试过几个,也这么说。但是我自己却从来都是认为51的定时器和时钟芯片的误差是一样的,误差的来源仅仅取决于振荡器。若要定时精确,就选用好的振荡器。
很是不明白为什么总以51的T0说事,52(现在基本上都是标准的52居多吧)是有T2定时器的,自动重载,何来的中断引起的误差?

我面试那些不知道有T2的都被我刷掉了,哈哈。
takashiki
5楼-- · 2020-02-06 11:01
回复【11楼】takashiki  岚月影
-----------------------------------------------------------------------

就我个人来说,优先选择单片机,时钟芯片能不用则不用。使用时钟芯片的考虑仅仅出于耗电方面的考虑,有的51本身带有RTC,比如NXP的,时钟芯片就更没有什么用了。
hsztc
6楼-- · 2020-02-06 13:19
 精彩回答 2  元偷偷看……

一周热门 更多>