wuzhengmin
发表于 2025-8-14 12:06:20
我们分析一下代码,先看看定时器:
首先配置的是一个TMOPS的一个寄存器,
具体是从系统时钟来分频,还是有点复杂,要多看几遍.....
wuzhengmin
发表于 2025-8-14 12:17:40
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中断
走完一个周期就自动重新装载:
wuzhengmin
发表于 2025-8-14 13:22:27
GATE 的说明,在手册里也写的很清晰:
wuzhengmin
发表于 2025-8-14 13:28:26
定时器0的计数器,实际是装载在这2个寄存器里:
wuzhengmin
发表于 2025-8-14 13:33:29
中断请求寄存器(中断标志位)TF0
整个定时器实现的一个过程大致就这样!
wuzhengmin
发表于 2025-8-14 13:43:09
再看看代码:
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位对应:
wuzhengmin
发表于 2025-8-14 13:50:30
计数初始值的计算:
有点复杂,看截图:
wuzhengmin
发表于 2025-8-14 13:53:27
最终算的结果:
等于是不是定时时间就是2.999982秒
误差很小,完全可以接受
wuzhengmin
发表于 2025-8-14 13:55:52
其实定时器时间的计算、设定可以很精确,公式看截图:
wuzhengmin
发表于 2025-8-14 14:02:39
函数的定义,声明、调用
返回值类型 函数名(入口参数)
{
//函数体
//函数执行的代码
return返回值
}
页:
1
2
3
4
5
6
7
8
9
10
[11]
12
13
14
15
16
17