请教大伙51单片机定时错误

[复制链接]
 楼主| Wayner 发表于 2013-9-1 11:20 | 显示全部楼层 |阅读模式
本帖最后由 Wayner 于 2013-9-1 11:24 编辑

请教各位DX:
      用89C2051单片机实现精确的延时,用T0定时器中断来实现,发现有时会刚好写TH0/TL0时已发生溢出,造成有时会误差255us,该怎么办?有好的思路吗?
定时时间在240us到1050us之间。
下面是中断程序
//单片机晶振用12MHz
void Timer0ISR(void) interrupt 1 using 2
{
TH0 = cTH_val;
TL0 += cTL_val;    //TF0标志进入定时器中断后,硬件自动清零
cSTATE ++;
bSET_OK = 0;
}

谢谢!
crazy2012 发表于 2013-9-1 11:21 | 显示全部楼层
TL0 += cTL_val
gx_huang 发表于 2013-9-1 13:23 | 显示全部楼层
TL0可能有进位,有进位,则TH0要减1吧。
比如TH0/TL0溢出,变成0X0000,进入中断,需要一些时间,TL0可能是2或者5之类的,
如果cTL_val值接近255,则会溢出。
ZG11211 发表于 2013-9-1 16:24 | 显示全部楼层
中断里面还会溢出?
gx_huang 发表于 2013-9-1 19:12 | 显示全部楼层
ZG11211 发表于 2013-9-1 16:24
中断里面还会溢出?

老弟,看仔细一点,是加法运算溢出(有进位)。
 楼主| Wayner 发表于 2013-9-1 19:58 | 显示全部楼层
是的,可能是“是加法运算溢出(有进位)”造成的。如我预定的时间是1036us,实际是1292us,比预定的多了256us。但有时很好。
请问你们是怎么处理的?
谢谢回复
gx_huang 发表于 2013-9-2 08:17 | 显示全部楼层
1036=0x040c,不太可能出现进位溢出的。
难道你这个定时器不是最高优先级的,进了这个定时器,被其它中断打断很长时间?

处理进位的方法很多,纯粹数学的问题。
libaiwei 发表于 2013-9-2 11:12 | 显示全部楼层
ayb_ice 发表于 2013-9-2 11:47 | 显示全部楼层
停止计时,关中断,调整重装载值

或用自动重装载功能,多次计时
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

850

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

54

主题

850

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部