单片机定时器初值的设计

TMOD=0x01; //设置定时器工作方式 T0的工作方式为1
TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872
TL0=(65536-45872)%256;
那个45872的值是怎么来的?

根据你使用的晶振,如果是12M,50ms就是:
TH0=(65536-50000)>>8;
TL0=(65536-50000);
1机器周期时间=12/12M=1uS

11.0592M晶振的话:
1机器周期时间=12/11.0592(uS)

而定时器每次加1需要1个机器周期的时间 ,所以定时x微妙所需加1次数
= x / 1机器周期时间追问

TL0是8位,而65536-50000是16位,是不是通过取余256得到T0的低八位(8位的TL0)?
为什么通过上面的取余可以做到?

追答

TL0=(65536-50000);
TL0=(65536-50000)%256
两种写法结果是一样的,16位,高8位(即超出256部分)已经溢出,只装低8位(即0~255部分)。
你可以在keil的调试窗口查看反汇编代码。

这样的写法你在一些资料上没看到过吗?

嗯,一楼的应该是不小心换算错了。应该是
定时x微妙,定时器需要加1次数
= x / 1机器周期时间
=x / (12 / 晶振频率)

=x / (12 / 11.0592)
=50000 / (12 / 11.0592)

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-28
首先你得明白11.0592M晶振的一个机器周期怎么算:
机器周期=时钟周期 * 12
(1/11.0592) * 12 =1.09 (微秒)
50ms = 50000 us(微秒),那么延时50ms需要的机器周期为:
50000 / 1.09 = 45872 (个)
就是这样来的。
第2个回答  2011-07-28
50000US/(11.0592/12)US=追问

得到552960啊!不是45872?