• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

51单片机定时时间如何校正?

想写个准确的 定时程序,可是走走走时间会有误差.请教高手指点.
全部回复(9)
正序查看
倒序查看
chirituzi
LV.1
2
2008-04-12 18:33
2496441207996329.rar
送你一个软件,51 定时器定时设定软件,很好用的!
0
回复
2008-04-16 19:56
@chirituzi
2496441207996329.rar送你一个软件,51定时器定时设定软件,很好用的!
多谢,这个51定时常数计算软件真的方便多了.
0
回复
njyd
LV.8
4
2008-04-19 20:28
  定时器从发出中断到响应会有个时间间隔,有长有短.
  定时器到时后会继续往前走,所以你在响应定时中断,重写定时数前,要读出定时器中的数,再将定时数减去这个数后写入,当然还要考虑计算和写入的时间.
  定时器中断要设在最高等级,其他中断都要比它低.
0
回复
2008-04-21 21:24
@njyd
  定时器从发出中断到响应会有个时间间隔,有长有短.  定时器到时后会继续往前走,所以你在响应定时中断,重写定时数前,要读出定时器中的数,再将定时数减去这个数后写入,当然还要考虑计算和写入的时间.  定时器中断要设在最高等级,其他中断都要比它低.
多谢,我就是不清楚:“响应定时中断,重写定时数前,要读出定时器中的数”这句话的意思,请大师解释详细点.
0
回复
whatcall
LV.5
6
2008-04-21 23:08
我觉得用51自身的定时器来实现计时,误差是不可避免的. 定时器依赖于晶振的精度,一般的晶振的精度都不会好过0.5%. 那么每走100秒就会有最大0.5秒的误差.一小时就有18秒的误差. 如果要精确计时,需要外部提供精确的计时脉冲(通常是用32.768KHz)或直接扩展一片外部RTC芯片. 当然如果只是做粗略炎是之用,倒不必像你说的那样精确.
0
回复
njyd
LV.8
7
2008-04-24 22:09
@水石头草
多谢,我就是不清楚:“响应定时中断,重写定时数前,要读出定时器中的数”这句话的意思,请大师解释详细点.
51系列的定时器作为16位使用时,定时数据不会自动写入,要编段程序来写.
有段时间没干这个了,印象中是加一计数,就是一直加到0000H发出中断信号.
比如假设你每次定时的数据是20000,重写入的数就是65536-20000,这就是你每次响应定时器中断要重写入定时器的数.因为只能两个八位分别写入,这45536要转换成16进制的高低两个字节.
  定时器发出中断后还继续在加一,也许到你响应中断时已经加到了000CH,那么你就读出这个0CH加到45536的低字节上(对于你的20000来说就是减),再写入定时器.当然这要保证你响应中断不会太迟,如果有可能太迟定时器计数可能进位到高字节,这样就要把高低字节都读出加到45536上.
0
回复
2008-04-25 19:45
@njyd
51系列的定时器作为16位使用时,定时数据不会自动写入,要编段程序来写.有段时间没干这个了,印象中是加一计数,就是一直加到0000H发出中断信号.比如假设你每次定时的数据是20000,重写入的数就是65536-20000,这就是你每次响应定时器中断要重写入定时器的数.因为只能两个八位分别写入,这45536要转换成16进制的高低两个字节.  定时器发出中断后还继续在加一,也许到你响应中断时已经加到了000CH,那么你就读出这个0CH加到45536的低字节上(对于你的20000来说就是减),再写入定时器.当然这要保证你响应中断不会太迟,如果有可能太迟定时器计数可能进位到高字节,这样就要把高低字节都读出加到45536上.
老大能不能举个例,写个小程序说明一下呢?
0
回复
njyd
LV.8
9
2008-05-02 14:20
@水石头草
老大能不能举个例,写个小程序说明一下呢?
XX:      PUSH PSW       ;计时中断
         MOV PSW,#8     ;设置工作寄存器1区
         PUSH ACC                                      
         CLR TR0        ;停止定时器计数,以防止操作过程中定时器低位向高位进位.
         MOV A,#DSL     ;读出定时数据低八位
         ADD A,TL0      ;加上定时器中低八位数据
         MOV TL0,A      ;写入定时器低八位
         MOV A,#DSH     ;读出定时数据高八位
         ADDC A,TH0     ;加上定时器中低八位数据,带低八位相加后的进位
         MOV TH0,A      ;重置定时数高八位
         SETB TR0       ;重启定时器计数
     ……
     ……
         RETI

    因这这段操作也要占用时间,但只要把定时器中断定为最高级,这段时间是固定的,只要调整一下计算所得的定时数据就行了.
    用51的定时器计时精度还是有限的,取决于晶振频率,频率越低精度越差,但用此方法可以在此限制下最大限度地提高计时精度.
0
回复
2008-05-02 22:35
@njyd
XX:      PUSHPSW      ;计时中断        MOVPSW,#8    ;设置工作寄存器1区        PUSHACC                                              CLRTR0        ;停止定时器计数,以防止操作过程中定时器低位向高位进位.        MOVA,#DSL    ;读出定时数据低八位        ADDA,TL0      ;加上定时器中低八位数据        MOVTL0,A      ;写入定时器低八位        MOVA,#DSH    ;读出定时数据高八位        ADDCA,TH0    ;加上定时器中低八位数据,带低八位相加后的进位        MOVTH0,A      ;重置定时数高八位        SETBTR0      ;重启定时器计数    ……    ……        RETI    因这这段操作也要占用时间,但只要把定时器中断定为最高级,这段时间是固定的,只要调整一下计算所得的定时数据就行了.    用51的定时器计时精度还是有限的,取决于晶振频率,频率越低精度越差,但用此方法可以在此限制下最大限度地提高计时精度.
顶,终于能吃透,多谢大虾们.多谢.
0
回复