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
查看完整版本: 第一次:环境的创立 | 送实验箱