51 单片机中定时器,是个 16 位的加法计数器。
其内容是 0000H ~ FFFFH,即:0 ~ 65535。
每隔一个机器周期,加一次一。加到 65536,就会溢出,产生中断。
在外部振荡器频率 = 11.0592 MHz 时,机器周期=1085.06944...us。
要想定时 1000us,这就有点困难了。
在外部振荡器频率 = 12 MHz 时,机器周期=1us。
要想定时 1000us,就可以设初始值为:65536 - 1000 = 64536。
分成高、低八位后,写入 THx、TLx,即可。
求出:初始值、分成高低八位,可以人工计算,那么,程序就是:
TH1 = 0XFC;
TL0 = 0X67;
也可以由编译软件来算,程序中,写出公式,这就是:
TH0 = (65535 - 1000)/256;
TL0 = (65535 - 1000)%256;
-------
又因为,中断响应,是不会及时发生的,通常,都会迟到 3 ~ 8 个机器周期。
用 C 语言编程,会耽误更多吧。
所以,定时时间,应该缩短一些,定时才准确。
因此,才有+ 28 的算法。
加上这个数之后,初始值,就大了一些,更接近 65536,定时时间,就短了。
这是个经验数据。
你将具体的数形成的表达式写入C语言的程序时,编译器在编译的时候会把表达式计算出来,然后编译到程序中,所以这两个是一种方法。
定时器初始化的 设置方法,其实就是一种,你所说的二种,
只是 第一 先计算出结果 ,
后一种是 直接 用了计算公式(注这个公式是用12MHz晶振)才是 1mS ,
用11.0592MHz 就大于 1 mS 了。
所以 要得到 精确计时精度,还是要计算正确 定时器初始值。
这不是一种方法么?
定时器使用步骤
(1)根据需要选择定时器的模式(考虑定时最大定时时长和某些固定用途和功能),写入相应寄存器。
(2)根据你要定时的长短和时钟频率计算初值,写入TH,TL
(3)看看是否需要定时器中断,按需要配置
(4)启动定时器
定时器其实就是计数频率固定的计数器
你是卖学习板得吗