我们分析一下代码,先看看定时器:
首先配置的是一个TMOPS的一个寄存器,
具体是从系统时钟来分频,还是有点复杂,要多看几遍.....
gate 的概念:
就是定时器的起动,是由外部输入还是内部时钟控制?
我们现在 简单处理: GATE=0 不要外部中断控制启动。TR0 = 1 让它正常启动
TM0PS = 0x0F; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xDC; //设置定时初始值
TH0 = 0x0B; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
走完一个周期就自动重新装载:
GATE 的说明,在手册里也写的很清晰:
定时器0的计数器,实际是装载在这2个寄存器里:
中断请求寄存器(中断标志位)TF0
整个定时器实现的一个过程大致就这样!
再看看代码:
TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x3F; //设置定时初始值
TH0 = 0x01; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
TM0PS = 0X5B = 91,
AUXR &= 0x7F; //定时器时钟12T模式,最高位清0,确定采用12T模式
12T /12
THO-TL0 = 319
TMOD 的低4位对应:
计数初始值的计算:
有点复杂,看截图:
最终算的结果:
等于是不是定时时间就是2.999982秒
误差很小,完全可以接受
其实定时器时间的计算、设定可以很精确,公式看截图:
函数的定义,声明、调用
返回值类型 函数名(入口参数)
{
//函数体
//函数执行的代码
return返回值
}