为什么51单片机定时器计数值取出来之后会比初值还小

我设,16位定时器工作方式1;计数值是15370,计数值就是49806,在外部中断处理中先关中断再读取计数值(先读取计数值再关中断效果一样,试过了)再送数码管显示最高两位,结果一直显示48,请问大神们这是怎么回事??

有两种可能会造成这种情况:
1、定时计数器启动后会从初值开始每个机器周期+1,也就是从49806开始每个机器周期+1,等记到65535(0xFFFF)后下一个周期就会清零,即从0000H开始计数。所以工作方式1在定时中断响应函数中一开始都要重装初值,否则就从0开始了。你说的情况可能定时中断函数中没有重装初值或者干脆没有响应定时中断,所以造成计数值小于初值。这种情况有个前提,就是外部中断的产生没有人为干预,原因见下面。
2、鉴于你每次读出的都是48,外部中断产生应该是自动的(很有规律),如果不是这样,比如说是手动产生外部中断或者说需要人为控制产生外部中断,那么每次读取的数就不一定是48了,这种情况下我怀疑可能是你送显示的程序有问题。
另外,计数寄存器THx和TLx是任何时候都可以读写的,先关再取还是先取再关时间上可能就差1、2个us,一般不会影响到高位。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-03
51定时器是向上计数的,也就是说你设了15370的初值后,就开始向上计数,一直记到65535,后在来一个脉冲定时器溢出中断。然后你继续赋值15370,他继续向上+1,+1,+1。。。直到65536个脉冲中断。所以你只要是开了定时器后,他是一直按照时钟周期自动计数的。
你要外部中断也不见得来的这么及时。另外65535-15370=50165.
还有就是你检查下你的显示程序是不是对的
第2个回答  2011-08-03
关定时器中断是没用的,因为定时器仍然向上加1计数。只不过当计数值达到65535时不会产生中断。
所以应该还要关闭计数器TR0为清0吧。
第3个回答  2011-08-03
TH0和TL0加到溢出后变为00H了,不装初值的话就从00H开始了;
中断再读取和读取再关中断只相差几个机器周期对最高位不会造成影响的。

为什么51单片机定时器计数值取出来之后会比初值还小
你说的情况可能定时中断函数中没有重装初值或者干脆没有响应定时中断,所以造成计数值小于初值。这种情况有个前提,就是外部中断的产生没有人为干预,原因见下面。2、鉴于你每次读出的都是48,外部中断产生应该是自动的(很有规律),如果不是这样,比如说是手动产生外部中断或者说需要人为控制产生外部中断,...

为什么51单片机的定时器计时不准确
实在要放语句的话,可以增大计数的TH0和TL0,频率低一点输出的波形会更接近你想设置的值 比如 改成:

51单片机定时器中断不准确,怎么解决
任何器件都会有偏差,晶振有偏差很正常。不过这显示出来的偏差也离谱了点。按目前的制造工艺一般的晶振精度都很容易做到数十ppm,偏移到数百ppm要么是环境太差要么是器件有问题,或者是测量不准^_^ 这个显示值应该只是软件根据波特率估算出来的,本身并不严格。如果人类都能感觉到定时器时间不准确了,那问...

关于51单片机中的计时小编程问题
1、 原程序存在错误。定时器方式0最大计数值为2^13=8192us,初装值为E018H=57368us,即定时定时初装值已远大于最大计数值。如果要在方式0下定时1ms=1000us,初装值应为8192-1000=7192 = 1C18H ,其它语句的执行因为是2~3us级,可忽略(因数中断程序中的三个语句耗时仅6us)。你可能要问:为...

为啥51单片机TH0=(65535–x)\/256?
因为51单片机的计数器是+1计数器,每个单位时间计数值增加1,当计数值发生溢出时产生中断,溢出时间为65536-x 计数器是16位的,当TH0是计数器的高8位,所以要除以256然后取整

51单片机定时器中断问题
定时器是一直在执行的,不论是否中断,它是对节拍的计数,由单独硬件实现。单片机在中断程序中,如果中断程序比较长,定时器的计数值是会改变的,一般是先读高位计数值,再读低位计数值,然后再读一次高位计数值,防止在读的过程中,低位向高位进位。

51定时器初值怎么算?
首先,51单片机是加一计数,到65536溢出,所以定时时间(经过的脉冲个数,如果一个脉冲是1us,刚好延时50ms是50000个脉冲)是65536减初值 ,初值又分高8位和低8 位,高8位的1代表256,因此高8位的数值所代表的数是256的整数倍,低位最大不超过255,所以一定是除以256之后的余数,用公式是这样:初值...

各位大牛,我想问:我把51单片机的定时器TO出于计数器模式,但是计数值的...
T0的计数值,是16位数。读出时,只能每次读出8位。需要读出两次。而T0的计数值,是动态的。先、后读出的,难保是同一个16位数字。为此,要读出一遍,再读出一遍。。。当,先后两次相同时,才能认为读出了同一个数,BREAK,退出读数的操作。高八位乘以256,加上低八位,就是合成为16位数。

51单片机计时器溢出后是不是就自动重新从零开始计时了?
标准的51单片机,不管LZ是否说错,不管计数、还是计时,所谓溢出,都是指计数值从 FF→00的跳变,既然是 跳到00了,自然就是从0开始计时了。不过,现在增强型的定时器,可以设置目标值(如 0xaa),定时器从0计到 0xaa,就产生中断,此时 计时值 并不是 00,如果不操作该值,那么定时器将继续...

51单片机定时器工作方式2,当th0把值给了tl0后,th0中得值还是原来的值...
为 你解答:51单片机定时器工作方式2,是具有自动装载功能的,当th0把值给了tl0后,th0中的值会始终保持原来的值不变。每当定时时间到,tl0计数器的计数值回零,并产生溢出。该溢出位会通过触发一个三态门,把th0中保存的时间常数重新送给tl0 即自动完成时间常数的装载。(不需要程序再去控制了)...

相似回答
大家正在搜