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

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条回答
laolu
1楼-- · 2020-02-11 20:34
最近刚好在用定时器做一个时钟,没有自动重装,进中断怎么调整都不准(跑一天),后来只好不用中断,也不重装,让它自己无限跑,主程序判断中断标志(500ms)然后计时处理,现在跑了一天,还没看到有1s的误差。
另:用的单片机不是51,是fm8ps56
mosidao
2楼-- · 2020-02-12 02:28
大家讨论得很好,虽然俺不懂,
lcm_zx
3楼-- · 2020-02-12 05:50
 精彩回答 2  元偷偷看……
wantone
4楼-- · 2020-02-12 06:09
定时器中断的proteus仿真,我的笔记本比其他电脑上仿真速度居然慢N多
zhxzhx
5楼-- · 2020-02-12 06:50
使用一点技巧,不是自动重载的定时器,也可以保障精确的中断请求(不是响应),
因为当定时器加到0xffff,再加一翻到0x0000的时候,不管怎样还是会0x0001,0x0002的加上去的,通过合理的取晶振的频率和定时值,使TL为0,在中断中只要重装入TH就行了.

    比如12MHz 定时2.56MS

oid InitTimer1(void)
{
    TMOD = 0x10;
    TH1 = 0x0F6;
    TL1 = 0x00;
    EA = 1;
    ET1 = 1;
    TR1 = 1;
}


void Timer1Interrupt(void) interrupt 3
{
    TH1 = 0x0F6;
//    TL1 = 0x00;  这个就可以不用了.
}

再给哟个例子:18.432MHz  2MS  定时

void InitTimer1(void)
{
    TMOD = 0x10;
    TH1 = 0x0F4;
    TL1 = 0x00;
    EA = 1;
    ET1 = 1;
    TR1 = 1;
}


void Timer1Interrupt(void) interrupt 3
{
    TH1 = 0x0F4;
//    TL1 = 0x00;
}
balance
6楼-- · 2020-02-12 12:47
回复【60楼】zhxzhx 一丁
-----------------------------------------------------------------------

你这个程序不还是在中断里给TH1赋值的吗,时间的不确定性是由进中断的时间不同引起的,因此你的程序不能解决问题

一周热门 更多>