目录
前言
上一篇文章中介绍什么是中断系统,其中提到了定时器,那么定时器是什么,又如何工作的呢?接下来让我们一起来了解定时器。
一、定时器是什么?
定时器是单片机的重要功能模块之一,在检测、控制领域有广泛应用。定时器常用作定时时钟,以实现定时检测,定时响应、定时控制,并且可以产生ms宽的脉冲信号,驱动步进电机。定时和计数的最终功能都是通过计数实现,若计数的事件源是周期固定的脉冲则可实现定时功能,否则只能实现计数功能。因此可以将定时和计数功能全由一个部件实现。
二、周期是什么?
在 51单片机的最小系统板上有一个12MHZ的晶振,那为什么是12MHZ呢?在此之前就需要了解三个概念:时钟周期、指令周期和机器周期。
2.1 时钟周期
时钟周期也称为振荡周期,定义为时钟频率的倒数。时钟周期是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。时钟周期是一个时间的量。时钟周期表示了SDRAM所能运行的最高频率。更小的时钟周期就意味着更高的工作频率。
2.2 机器周期
机器周期也称为CPU周期。在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成。AT89S51单片机每12个时钟周期为1个机器周期。
2.3 指令周期
指令周期是取出一条指令并执行这条指令的时间。一般由若干个机器周期组成,是从取指令、分析指令到执行完所需的全部时间。单片机的指令按字节可分为单字节(1个机器周期)、双字节(2个机器周期)、三字节指令(3个机器周期),乘法、除法指令需要(4个机器周期),因此执行一条指令的时间也不相同。
因此,晶振可以理解为单片机的 “心脏” ,它为单片机提供了时钟周期,晶振频率会直接影响时钟周期的大小,二者的关系为:时钟周期 = 1 / 晶振频率 。无论你的晶振频率是多少,对于单片机来说,它内部都是固定的关系 ,在设计之初,由于51单片机性能和制程工艺等因素,出厂时把51单片机的机器周期严格的控制在12个时钟周期,指令周期一般是由1 2 4 个机器周期组成。
那么为什么晶振是12Mhz?通过计算:时钟周期 = 1 / (12M) (s) = 1/12000000 (s) = 1/12 (us),51单片机一个机器周期是12个时钟周期,即机器周期=12*1/12 (us) = 1 (us) ,这样执行1条指令的时间就控制在了1(us)、2(us)、4(us)。
三、与定时器有关的寄存器
3.1 定时器/计数器T0、T1的控制寄存器TCON
TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求中断源等,TCON格式如下:
TCON:定时器/计数器中断控制寄存器(可位寻址)
位: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
字节地址:88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
- TF1:定时器/计数器T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置“1”TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”TF1(TF1也可由程序查询清“0”)。
- TR1:定时器T1的运行控制位。该位由软件置位和清零。当GATE(TMOD.7)=0,TR1=1时就允许T1开始计数,TR1=0时禁止T1计数。当GATE(TMOD.7)=1,TR1=1月INT1输入高电平时,才允许T1计数。定时器/计数器T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当最高位产
- TFO:生溢出时,由硬件置“1”TFO,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清“0”TFO( TFO也可由程序查询清“0”)。
- TRO:定时器T0的运行控制位。该位由软件置位和清零。当GATE(TMOD.3)=0,TR0=1时就允许T0开始计数,TR0=0时禁止TO计数。当GATE(TMOD.3)=1,TR1=0且INT0输入高电平时,才允许T0计数。外部中断1请求源(INT1/P3.3)标志。
- IE1=1,外部中断向CPU请求中断,当CPU响应该IE1:中断时由硬件清“0”IE1。
- IT1:外部中断1触发方式控制位。IT1=0时,外部中断1为低电平触发方式,当INT1(P3.3)输入低电平时,置位IE1 。采用低电平触发方式时,外部中断源(输入到INT1)必须保持低电平有效,直到该中断被CPU 响应,同时在该中断服务程序执行完之前,外部中源必须被清除(P3.3要变高),否则将产生另一次中断。当IT1=1时,则外部中断1 (INT1端口由“1”→“0”下降沿跳变,激活中断请求标志位IE1 ,向主机请求中断处理。外部中断0请求源(INTO/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清“0”IE0(边沿触发方式)。
- IEO:外部中断0请求源(INT0/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清“0”IE0(边沿触发方式)。
- ITO:外部中断0触发方式控制位。IT0=0时,外部中断0为低电平触发方式,当INT0(P3.2)输入低电平时,置位IE0。采用低电平触发方式时,外部中断源(输入到INTO)必须保持低电平有效,直到该中断被CPU响应,同时在该中断服务程序执行完之前,外部中断源必须被清除(P3.2要变高),否则将产生另一次中断。当IT0=1时,则外部中断0(INTO)端口由“1”→“0”下降沿跳变,激活中断请求标志位IE1 ,向主机请求中断处理。
3.2 定时器/计数器工作模式寄存器TMOD
定时和计数功能由特殊功能寄存器TMOD的控制位CT进行选择,IMOD寄存器的各位信息如下表所列。可以看出,2个定时/计数器有4种操作模式,通过TMOD的M1和MO选择。2个定时/计数器的模式0、1和2都相同,模式3不同,各式下的功能如下所述。
寄存器TMOD各位的功能描述:
四、定时器的工作模式
通过对寄存器TMOD中的M1(TMOD.1)、MO(TMOD.0)的设置,定时器/计数器0有4种不同的工作模式,见下表:
M1 | M0 | 工作方式 | 说明 |
0 | 0 | 方式0 | 13位定时器/计数器 |
0 | 1 | 方式1 | 16位定时器/计数器 |
1 | 0 | 方式2 | 8位自动重装定时器/计数器 |
1 | 1 | 方式3 | T0分成两个独立的8位定时器/计数器;T1此方式停止计数 |
定时器初值的计算:
例:对12MHz 1个机器周期 1us 12/fosc = 1us
- 方式0 13位定时器最大时间间隔 = 2^13 = 8.192ms
- 方式1 16位定时器最大时间间隔 = 2^16 = 65.536ms
- 方式2 8位定时器最大时间间隔 = 2^8 = 0.256ms =256 us
- 方式3 仅适用于T0,此时T0分成两个8位计数器,T1停止计数
4.1 模式0(13位定时器/计数器)
该模式下的13位寄存器包含:TH0全部8个位及TL0的低5位。TL0的高3位不定,可将其忽略。置位运行标志(TRO)不能清零此寄存器。模式0的操作对于定时器0及定时器1都是相同的。2个不同的GATE位(TMOD.7和TMOD.3)分别分配给定时器1及定时器0。
机器周期每来一个脉冲,特殊功能寄存器(Timer Low0)TL0计数值加1,当TL0计数值加到TL0的最大值时,再加1时,TL0溢出,TL0归0;TL0的低5位溢出时向TH0进位,TH0计数值加1,当TH0计数值加到TH0的最大值时,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。
假设用方式0,2^13为8192微秒的延迟,实现5毫秒的延迟。1ms=8,192-5,000=3,192,TH0=3192/32=99,TL0=3192-32*99=32。换算为16进制为:TH0=O*063H,TL0=O*020H,代码如下:
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T_0
ORG 0030H
MAIN:
MOV TMOD,#00H
MOV TH0,#063H
MOV TL0,#020H
SETB EA
SETB TR0
SJMP $
T_0:
MOV TH0,#063H
MOV TL0,#020H
RETI
4.2 模式1(16位定时器/计数器)
模式1除了使用了TH0及TL0全部16位外,其他与模式0完全相同。即此模式下定时器/计数器0作为16位定时器/计数器,如下图所示:
需要注意的一点是:当C/T=1;处于计数模式时,计数脉冲是 T0 引脚上的外部脉冲。计数初值与计数个数的关系为:X=2(16)- N。其中2(16)表示 2 的 16 次方。(X表示计数初值,N表示计数个数)。
注意:该方式也不能像方式2一样,硬件自动重装TL0和TH0初值,是需要我们自己软件重装TH0和TH0初值。也就是说使用该方法时,不仅需要在定时/计数器初始化时,给定时/计数器特殊功能寄存器TL0和TH0赋初始值,而且还需要在TH0溢出后进入定时/计数器中断函数后再赋TL0和TH0初始值一次。
4.3 模式2(8位自动重装定时器/计数器)
该方式只需 TL1溢出时,就可以置位TCON中的TF1标志,向CPU发出中断请求。该方式硬件自动重装TL1的初值,就不需要TL1溢出后进入定时/计数器中断函数后再赋TL1初始值一次。至于自动重装是该这么理解呢?
TL1的溢出不仅置位TF1,而且将TH0内容重新装入TL1,TH0内容由软件预置,重装时TH1内容不变。什么意思呢?意思是:当TL1溢出时,TL1归0,不仅置位TF1,向CPU发出中断请求,而且还将TH1的值赋值给TL1(TL1=TH1),因为我们一般初始化定时/计数器的时候都会给寄存器TL1和TH1赋初值的。这一操作下来,那我们就不需要在进入中断函数的时候再给寄存器TL1赋初始值了。
4.4 模式3(T0分成两个独立的8位定时器/计数器)
对定时器1,在模式3时,定时器1停止计数,效果与将TR1设置为0相同。
对定时器0,此模式下定时器0的TL0及TH0作为2个独立的8位计数器。TL0占用定时器0的控制位:CT、GATE、TR0、INT0及TF0。TH0限定为定时器功能(计数器周期),占用定时器1的TR1及TF1。此时,TH0控制定时器1中断。
模式3是为了增加一个附加的8位定时器/计数器而提供的,使单片机具有三个定时器/计数器。模式3只适用于定时器/计数器0,定时器T1处于模式3时相当于TR1=0,停止计数,而T0可作为两个定时器用。
五、利用定时器延迟版自动流水灯
对上一篇文章中的手动版流水灯修改,修改中断入口地址,开启定时器,设置初值,修改后代码如下:
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T_0
ORG 0030H
MAIN:
MOV DPTR,#15536
MOV TH0,DPH
MOV TL0,DPL
SETB EA
SETB ET0
SETB TR0
MOV P2,#11111111B
MOV A,#01H
LIGHT:
MOV P2,A
SJMP LIGHT
T_0:
MOV TH0,DPH
MOV TL0,DPL
RL A
RETI
END
总结
以上就是今天要讲的内容,本文仅简单介绍了单片机的定时器相关知识,以及对流水灯用定时器计时的方式实现。