输入“/”快速插入内容

8、定时器

2024年7月27日修改
一、简介
定时器,顾名思义,是用来控制时间的。它可以根据设定的时间间隔,准时产生触发信号,用于控制程序的执行流程。
我们为什么要使用定时器呢?
回想一下之前写的程序,在实现延时这一功能时,我们使用了delay() 函数,这个函数并没有采用任何外设,只是写了两个循环嵌套,让cpu计数,当计数完成也就代表延时结束,简单点说就是让cpu通过不停的计数来消耗时间,所以这种方式有个很大的弊端,就是当cpu “死跑” 延时的时候,是做不了其他事情的,如果这个时候需要一个工具来帮助cpu完成计时,这就是定时器的作用。
51单片机有两个定时器,T0和T1。这两个定时器可以通过寄存器进行配置,可实现定时和计数功能。
代码块
定时器的本质原理是,每经过一个机器周期,计数器的值就加1。当计数器的值达到设定的值时,就会产生一个中断信号,通知CPU进行相应的处理。
在定时器模式下,计数器的输入信号是机器周期。因此,当配置为定时器使用时,每经过1个机器周期,计数存储器的值就加1。这种方式可以用来产生定时信号,以控制时间间隔或者实现定时操作。比如在工厂自动化生产线、智能家居控制、网络通信等场景中,都需要定时器来进行精准的时间控制。
而在计数器模式下,计数器的输入信号是外部信号。当配置为计数器时,每来一个负跳变信号就加1,以此达到计数的目的。这种方式可以用来对外部事件进行计数或者脉冲测量。如统计按键按下的次数,统计电机编码器转的圈数。
我们可以根据具体的需求来选择使用定时器还是计数器。比如,在需要精确控制程序执行时间的情况下,我们可以选择使用定时器;而在需要对某些事件进行计数时,则可以选择使用计数器。
二、定时/计数器相关的寄存器
模式选择
STC89C52RC的T0和T1均有4种工作模式:
模式0:13位定时器/计数器
模式1:16位定时器/计数器 (常用)13位适用于短时间计时,16位适用于较长时间计时
模式2:8位自动重装模式时器/计数器 此模式下,计时到设定值后会自动重新开始计时,实现周期性计时功能
模式3:两个8位计数器(禁用定时器1,把定时器2设置为两个8位计数器)
代码块
TMOD这个寄存器是不可位寻址的,
如要想让M0这位置一的话,直接 M0=1;这个写法是错误的,因为它不能位寻址。
只能 TMOD = 0x01(00000001)
代码块
例如初始化定时器0的模式为模式1,
设置TMOD寄存器的第0位M0为1,第1位M1为0
0b0000 0001
TMOD=0x01; //设置16bit定时器模式
如果是初始化定时器1的模式为模式1
0b0001 0000
TMOD=0X10;
模式1:时钟源选择