奶爸业余单片机学习之:定时器以工作方式1运行时的初值的计算方法(51单片机)

时间:2021-02-23 23:33:05

//==========51单片机========

/*定时器以工作方式1运行

TMOD = 0x01;//定时器0

TMOD = 0x10;//定时器1

TMOD =0x11;//定时器0/1同时工作

*/

定时器工作时,如何确定定时时间?

假设有一个5L的水桶,现在要往水桶里面装水3L,怎么才知道装够3L了呢?答案就是先往水桶里面装水2L,然后继续装,水满溢出时,就表示3L水装够了。

(以定时器0为例)溢出:单片机也一样,当单片机内定时器以工作方式1运行时,定时器存储寄存器每经过一个机器周期就加1,计数长度为65535(十六进制为:FFFFFF),所以65536+1时就会溢出,溢出后寄存器值从0开始计数,则:定时周期 = 65536 - 初值,初值为0时,定时周期 = 65535个机器周期

所以,当需要定时时,先往寄存器里装入初值,让寄存器从初值开始计数,到65536时,寄存器溢出为0,溢出后TF0 == 1,表示定时值已到,若需要用到循环定时,则溢出后,首先必让溢出标志(TF0)归零(归零方法:一、程序清零,则TF0 = 0;二、进入定时器中断以实现硬件自动清零。)。

其次,须往寄存器重新装入初值再开始计算。

 

时钟周期 = 1/时钟频率;

机器周期(定时器存储寄存器加1时间)= 12×时钟周期,

以11.0592MHz频率晶振为例,机器周期(秒) = 12×(1/11059200)

初值为0时,最大定时时间为 65535×12×(1/11059200)=71ms(约),所以程序需要定时时,通常要根据定时时间来确定一个合适的初值。

假设需定时一个30毫秒时间,则0.03 = A×机器周期,可以算出A = 0.03/机器周期 = (0.03×11059200)/12,则经历A个机器周期时,就为30毫秒定时时间

可以算出 A = 27648

所以,初值 = 65536 - 27648 = 37888,37888转换成十六进制为9400,所以高八位TH0 = 0x94,低八位TL0 = 0x00;

公式总结

初值 = 65536 - 定时时间(秒)/机器周期

时钟周期 = 1/时钟频率;

机器周期(定时器存储寄存器加1时间)= 12×时钟周期