定时器

定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。

定时器作用:

  • 用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作。

  • 替代长时间的Delay,提高CPU的运行效率和处理速度。

STC89C52定时器资源

STC89C52有3个定时器(T0、T1、T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源。

注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的。

STC89C52定时器详细信息请参考手册第7章:STC89C52.pdf | Mikumikumi 文件站

定时器的运作方式

定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一。当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行。

定时器的工作模式

STC89C52的T0和T1均有四种工作模式:

  • 模式0:13位定时器/计数器

  • 模式1:16位定时器/计数器(常用)

  • 模式2:8位自动重装模式

  • 模式3:两个8位计数器

模式0、2、3很少用到,这篇文章只涉及模式1。

T0工作模式1框图:

TL0(Timer Low 0)和TH0(Timer High 0)是两个寄存器,每一个有8位,即两个寄存器共同组成16位计数系统,可存储0-65535。

时钟(图左上)为此计数系统提供脉冲,每次脉冲都会使计数系统加1。

当计数系统溢出时,会将TF0(Timer Flag 0 定时器标志位)置1,申请中断(图右)。

控制位(图左下)用来控制定时器的工作状态。GATE置1时,定时器运行状态由INT0(外部中断)和TR0(Timer Run 0)共同决定;GATE置0时,定时器运行状态仅由TR0决定。

定时器时钟

定时器的时钟可以由两个来源提供:

  1. SYSclk:系统时钟,即晶振周期,新版普中开发板上的晶振为11.0592MHz。
  2. T0 Pin:外部引脚,每提供一次脉冲就使计数系统加1,此时相当于计数器。

假如系统时钟频率为12MHz。经过分频,如果为12T模式,则提供12 / 12 = 1 MHz(1us)的脉冲频率;如果为6T模式,则提供12 / 6 = 2 MHz(0.5us)的脉冲频率。

C/T选择开关分别表示Counter/Timer,分别在高/低电平有效。置1时切换为C,联通T0 Pin,通过外部引脚提供时钟,作计数器;置0时切换为T,联通SYSclk,通过系统时钟提供时钟,作计时器。

中断

中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。

当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。

微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。

当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。

STC89C52中断详细信息请参考手册第6章:STC89C52.pdf | Mikumikumi 文件站

中断流程

image-20230103223320117

STC89C52中断源

中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3)。

中断优先级个数:4个。

中断号:

image-20230103224009171

编写中断服务函数格式如下:

void Timer0_Routine() interrupt 1   //interrupt 1对应T0中断
{
    //code...
}

•注意:中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等。

定时器与中断的配合

定时器与中断配合以定时执行中断处理函数,此过程不需要CPU反复延时以计算时间,节省CPU时间。就好像设定了一个闹钟,只要闹钟响了之后我们就去做一些事,而不用一直检查时间。

如果只使用定时器而不与中断配合,那么就需要CPU反复检查TF的状态,占用CPU时间,失去了定时器的意义。就好像设定了一个不会响的钟,我们必须反复检查时间来确认是不是到点了,效率非常低。

为了方便理解,这里使用的中断系统图是传统51单片机的图,STC89C52的中断系统图可参考手册。

image-20230103224328191

单片机通过配置寄存器来控制内部线路的连接,即控制图中的各个开关。

寄存器是连接软硬件的媒介,在单片机中寄存器就是一段特殊的RAM存储器。一方面,寄存器可以存储和读取数据;另一方面,每一个寄存器背后都连接了一根“导线”,控制着电路的连接方式。寄存器相当于一个复杂机器的“操作按钮”。

定时器相关寄存器

此部分需要参考手册STC89C52.pdf | Mikumikumi 文件站

寄存器特性:

  • 可位寻址:可以对寄存器的某一位单独赋值。
  • 不可位寻址:只能对此寄存器整体赋值。

定时器寄存器

image-20230103225622062

image-20230103231833227

image-20230103231905260

中断寄存器

按照上图,要想使中断有效,此处需要配置寄存器IE中的ET0位为1,EA位为1,IP寄存器中的优先级按需配置。

image-20230103225631400

image-20230103232316215

中断优先级寄存器略。