//==========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×时钟周期,