定时器:51单片机内的定时器属于单片机的内部资源,其电路的连接与运作均在单片机内部完成。
定时器的作用:
(1)用于计时系统,实现软件计时,或者使程序每隔固定一段时间完成某项操作。
(2)替代延时函数Delay,提高CPU的运行效率和处理速度。
STC89C52定时器资源
定时器个数:3个(T0 T1 T2),T0和T1与传统的51单片机兼容,T2是该型号单片机增加的资源。
注意:定时器的资源与单片机的型号关联在一起,不同型号可能会有不同的定时器个数和操作方式,但一般来说T0和T1的操作方式是所有51单片机所共有的。
定时器框图
定时器在单片机内部类似于一个小闹钟,根据时钟的输出信号,每隔一段固定时间,计数单元的数值加一,当计数单元的数值达到设定的闹钟提醒时间时,计数单元就会向中断系统发送中断申请,产生响铃提醒,使程序跳转到中断函数中执行。
定时器工作模式
STC89C52的T0(定时器0)和T1(定时器1)均有四种工作模式:
模式0:13位定时器/计数器
模式1:16位定时器/计数器 (常用)
模式2: 8位自动重载模式
模式3: 两个8位计数器
在实际开发时,模式一是最常见的
我们可以把其分为三部分
详解每个参数作用
TL0+TH0总共两个字节,TL0(Time Low 0)为低位计数器寄存器,TH0(Time high 0)为高位计数器寄存器,最大能存下的数值为65535,每当接受到一次时钟脉冲信号就增加1,当达到最大值且迎来一个时钟信号时会产生溢出,低位和高位计数器寄存器清零,并产生一个标志位,也就是TF0(Timer Flag 0)。随后向中断系统申请中断服务,当进入到中断服务程序后,清零。
SYSclk(系统时钟)每隔一段时间产生时钟脉冲,其频率是12MHZ与晶振周期相同,而后经过MCU in 12T mode进行12分频,输出为1us的时钟脉冲,也就是说经过65535us秒后,会产生一个标注位。
T0 Pin(外部时钟)可通过外部引脚T0 Pin接入外部时钟,接入外部时钟后,为计数器。
C代表count即计数器
T代表Time即定时器,头上带一横,说明在低电平时位定时器模式
TR0和GATE和INT0都是控制其开关,也就是定时器的开关。但一般在实际运用中TR0其决定作用
GATE前连接的是非门,三角形尖端带圆形
而后GATE与INT0与共同连接着或门,带弧度的椭半圆
TR0前连接的是与门,不带弧度的半椭圆
中断系统
中断系统是为了使CPU具有对外界紧急事件的实时处理能力而设置的
当中央处理器CPU正在处理某件事时遇到了紧急事件请求,中断系统会要求CPU停止当前工作,转向处理紧急事件,当紧急事件处理完后,回到原来中断的地方,继续原来的工作
此外,当遇到多个紧急事件请求时,这时候就有了优先级的概念,优先级高的紧急事件优先处理。
当CPU正在处理一个中断源请求时(执行相应的中断服务程序),出现了另外一个优先级比它还高的的中断源请求。CPU能够暂停对原来中断源的服务程序,转而处理优先级高的那一个中断源请求,处理完后,在回到原来低优先中断服务程序,这样的过程称为中断嵌套。具有中断嵌套功能的中断系统称为多级中断系统,反之,为单级中断系统。
STC89C52中断资源
中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、外部中断2、外部中断3)
中断优先级:4个(非常重要 重要 一般重要 不重要)
中断号:
注意:中断的资源与单片机型号是关联在一起的、不同型号可能有不同的中断资源,例如中断源的个数不同、中断源的优先级个数不同等。
定时器相关寄存器
在单片机中常说的一句话是:通过操作寄存器,改变内部电路的连接方式,实现不同功能。
同理我们通过操作与定时器相关的寄存器来控制其内部电路连接方法。
TCON(定时器控制寄存器)
TCON(定时器控制寄存器)可位寻址,即可以对寄存器进行整体操作,也可以对寄存器中某一位进行单独操作。
TF1指的是定时器1,TF0指的是定时器0,其他同理。
TF0/1代表的是溢出标志位,可以进行赋值0/1。
TR0/1(TIimer run)控制定时器0/1启动的控制位。
其他都是有关外部中断,这里我们不在过多赘述
TMOD(定时器模式控制器)
TMOD(定时器模式寄存器),不可位寻址,只能进行整体操作,但可以通过 & 和 | 操作符来控制前四位和后四位。
前四位为定时器1,后四位为定时器0。
M0和M1是控制定时器工作模式,通过0和1的组合控制,总共四种
C和T(横)控制是计数器还是定时器,给1为计数器,给0为定时器。
GATE在某些情况下,可以决定定时器/计数器开关是否启用还是关闭
TL0和TH0 | TL1和TH1
TL0寄存器即低位计数寄存器
TH0寄存器即高位计数寄存器
我们可以给他们赋初值
比如设置TL0=64535/256
TH0=64535%256
此时每过1000us也就是1s,低位和高位寄存器达到最大值,产生溢出,并生成溢出位TF0=1
从而实现了每过一秒,程序中断,并进入中断服务程序,返回原来中断的地方继续工作。如此循环往复。