51单片机程序定时器怎么这么不准确啊,求高手指点!

2024-12-30 04:01:29
推荐回答(4个)
回答1:

这是编译器造成的,你最好用Debug模式看看生成的汇编代码是什么摸样,比较一下你那三种方 式给TH0和TL0赋的是什么样的值。

这是我试验的结果:
4: TH0=-780/256;
C:0x0003 758CFD MOV TH0(0x8C),#0xFD
5: TL0=-780%256;
C:0x0006 758AF4 MOV TL0(0x8A),#0xF4
6: TH0=-516/256;
C:0x0009 758CFE MOV TH0(0x8C),#0xFE
7: TL0=-516%256;
C:0x000C 758AFC MOV TL0(0x8A),#0xFC
8: TH0=(65536-516)/256;
C:0x000F 758CFD MOV TH0(0x8C),#0xFD
9: TL0=(65536-516)%256;
C:0x0012 758AFC MOV TL0(0x8A),#0xFC

看出差别了吧?使用-780时给T0赋值0xFDF4,使用第三种方式赋值为0xFDFC,这两个数字相近,所以结果基本正确。但是使用-516时赋值的0xFEFC,这差别就大了,结果就是不正确。

一般建议用TH0=(65536-516)/256 ;TL0=(65536-516)%256;这种方式,保证不出问题。

回答2:

定时器是从小到大计数的,前2个设置是错误的。
另外,定时器中断处理时有时间开销,如寄存器入栈。尤其是用c编译器,额外开销是不可见的。

学习单片机、CPLD,请到“电子设计网dzsj”

回答3:

用中断来做,指令也要占用时间。轮询会随机不确定的。

回答4:

每条指令也需要时间呀,当然不是516,而是780很正常,你可以减掉这个误差值呀,