目录
1.概述
2.定时器/计数器
2.1 定时功能
2.2.1 定时功能的用法
2.1.2 任意定时方法
2.2 计数功能
2.2.1 计数功能的用法
2.2.2 任意计数方法
2.3 定时器/计数器的结构原理
2.3.1 定时器/计数器的结构
2.3.2 定时器/计数器的工作原理
2.4 定时器/计数器的控制寄存器与四种工作方式
2.4.1 定时器/计数器的控制寄存器TCON
2.4.2 定时器/计数器工作方式控制寄存器TMOD
2.4.3 定时器/计数器的工作方式
8051单片机内部有T0和T1两个定时器/计数器。它们既可用作定时器,也可用作计数器,可以通过编程来设置其使用方法。
当定时器/计数器用作定时器时,可以用来计算时间。如果要求单片机在一定的时间后产生某种控制,可将定时器/计数器设为定时器。单片机定时器/计数器的定时功能用法如图1所示。
图1 定时器/计数器的定时功能用法
要将定时器/计数器 T0设为定时器,实际上就是将定时器/计数器与外部输入断开,而与内部信号接通,对内部信号计数来定时。单片机的时钟振荡器可产生12MHz的时钟脉冲信号,经12分频后得到1MHz的脉冲信号,1MHz信号每个脉冲的持续时间为1μs,如果定时器T0对1MHz的信号进行计数,若从0计到65536,将需要65536μs,也即65.536ms。65.536ms后定时器计数达到最大值,会溢出而输出一个中断请求信号去中断系统,中断系统接受中断请求后,执行中断子程序,子程序的运行结果将P1.0端口置“0”,该端口外接的发光二极管点亮。
在图1中,定时器只有在65.536ms 后计数达到最大值时才会溢出,如果需要不到65.536ms定时器就产生溢出,比如1ms后产生溢出,可以对定时器预先进行置数。将定时器初始值设为64536,这样定时器就会从64536开始计数,当计到65536时,定时器定时时间就为1ms而产生一个溢出信号。
当定时器/计数器用作计数器时,可以用来计数。如果要求单片机计数达到一定值时产生某种控制,可将定时器/计数器设为计数器。单片机定时器/计数器的计数功能用法如图2所示。
图2 定时器/计数器的计数功能用法
用编程的方法将定时器/计数器T0设为一个16位计数器,它的最大计数值为216=65536。T0端(即P3.4引脚)用来输入脉冲信号。当脉冲信号输入时,计数器对脉冲进行计数,当计到最大值65536时,计数器溢出,会输出一个中断请求信号到中断系统,中断系统接受中断请求后,执行中断子程序,子程序的运行结果将P1.0端口置“0”,该端口外接的发光二极管点亮。
在图2中,只有在T0端输入65536个脉冲时,计数器计数达到最大值才会溢出,如果希望输入100个脉冲时计数器就能溢出,可以在计数前对计数器预先进行置数,将计数器初始值设为65436,这样计数器就会从65436开始计数,当输入100个脉冲时,计数器的计数值就达到65536而产生一个溢出信号。
8051单片机内部定时器/计数器的结构如图3所示。单片机内部与定时器/计数器有关的部件主要有以下几种:
① 两个定时器/计数器(T0和 T1)。每个定时器/计数器都是由两个8位计数器构成的16位计数器。
② TCON寄存器。TCON为控制寄存器,用来控制两个定时器/计数器的启动/停止。
③ TMOD寄存器。TMOD为工作方式控制寄存器,用来设置定时器/计数器的工作方式。两个定时器/计数器在内部还通过总线与CPU连接,CPU可以通过总线对它们进行控制。
图3 定时器/计数器的结构
由于定时器/计数器是在寄存器TCON和TMOD的控制下工作的,要让定时器/计数器工作,必须先设置寄存器 TCON 和 TMOD(可编写程序来设置)。单片机内部有2个定时器/计数器,它们的工作原理是一样的,这里以定时器/计数器T0为例进行说明。
1.定时器/计数器T0用作计数器
要将定时器/计数器T0当作计数器使用,须设置寄存器TCON和TMOD,让它们对定时器/计数器T0进行相应的控制,然后定时器/计数器T0才开始以计数器的形式工作。
(1)寄存器TCON和TMOD的设置将T0用作计数器时TCON、TMOD寄存器的设置内容主要有:
① 将寄存器TMOD的C/T位置“1”,如图8-3所示,该位发出控制信号让开关S0置“1”,定时器/计数器T0与外部输入端T0(P3.4)接通。
② 设置寄存器TMOD的M0、M1位,让它控制定时器/计数器T0的工作方式,比如让M0=1、M1=0,可以将定时器/计数器T0设为16位计数器。
③ 将寄存器TCON的TR0位置“1”,启动定时器/计数器T0开始工作。
(2)定时器/计数器T0的工作过程定时器/计数器T0用作计数器的工作过程有以下几步:
① 计数。定时器/计数器T0启动后,开始对外部T0端(P3.4)输入的脉冲进行计数。
② 计数溢出,发出中断请求信号。当定时器/计数器T0计数达到最大值65536时,会溢出产生一个信号,该信号将寄存器TCON的TF0位置“1”,寄存器TCON立刻向CPU发出中断请求信号,CPU便执行中断子程序。
2.定时器/计数器T0用作定时器
要将定时器/计数器T0当作定时器使用,同样也要设置寄存器TCON和TMOD,然后定时器/计数器T0才开始以定时器形式工作。
(1)寄存器TCON和TMOD的设置将T0用作定时器时TCON、TMOD寄存器的设置内容主要有:
① 将寄存器TMOD的C/T位置“0”,如图8-3所示,该位发出控制信号让开关S0置“2”,定时器/计数器T0与内部振荡器接通。
② 设置寄存器 TMOD 的 M0、M1位,让它控制定时器/计数器 T0的工作方式,如让M0=0、M1=0,可以将定时器/计数器T0设为13位计数器。
③ 将寄存器TCON的TR0位置“1”,启动定时器/计数器T0开始工作。
(2)定时器/计数器T0的工作过程定时器/计数器T0用作定时器的工作过程有以下几步:
① 计数。定时器/计数器T0启动后,开始对内部振荡器产生的信号(要经12分频)输入的脉冲进行计数。
② 计数溢出,发出中断请求信号。定时器/计数器T0对内部脉冲进行计数,由0计到最大值8192(213)时需要8.192ms的时间,8.192ms后定时器/计数器T0会溢出而产生一个信号,该信号将TCON寄存器的TF0位置“1”,TCON寄存器马上向CPU发出中断请求信号,CPU便执行中断子程序。
定时器/计数器是在TCON寄存器和TMOD寄存器的控制下工作的,设置这两个寄存器相应位的值,可以对定时器/计数器进行各种控制。
TCON寄存器的功能主要是接收外部中断源(INT0、INT1)和定时器/计数器(T0、T1)送来的中断请求信号,并对定时器/计数器进行启动/停止控制。TCON的字节地址是88H,它有8位,每位均可直接访问(即可位寻址)。TCON的字节地址、各位的位地址和名称功能如图4所示。
图4 TCON寄存器的字节地址、各位的位地址和名称功能
TCON寄存器的各位功能在前面已介绍过,这里仅对与定时器/计数器有关的位进行说明。
① TF0位和TF1位:分别为定时器/计数器0和定时器/计数器1的中断请求标志位。当定时器/计数器工作产生溢出时,会将TF0或TF1位置“1”,表示定时器/计数器T0或T1有中断请求。
② TR0和TR1:分别为定时器/计数器0和定时器/计数器1的启动/停止位。在编写程序时,若将TR0或TR1设为“1”,那么T0或T1定时器/计数器开始工作;若设置为“0”,T0或T1定时器/计数器则会停止工作。
TMOD寄存器的功能是控制定时器/计数器T0、T1的功能和工作方式。TMOD寄存器的字节地址是89H,不能进行位操作。在上电(给单片机通电)复位时,TMOD寄存器的初始值为00H。TMOD的字节地址和各位名称功能如图5所示。
图5 TMOD的字节地址和各位名称功能
在TMOD寄存器中,高4位用来控制定时器/计数器T1,低4位用来控制定时器/计数器T0,两者对定时器/计数器的控制功能一样,下面以TMOD寄存器高4位为例进行说明。
① GATE位:门控位,用来控制定时器/计数器的启动模式。当GATE=0时,只要TCON寄存器的TR1位置“1”,就可启动T1开始工作;当GATE=1时,除了需要将 TCON 寄存器的 TR1 位置“1”外,还要使引脚为高电平,才能启动T1工作。
② 位:定时、计数功能设置位。当时,将定时器/计数器设置为定时器工作模式;当时,将定时器/计数器设置为计数器工作方式。
③ M1、M0位:定时器/计数器工作方式设置位。M1、M0位取不同值,可以将定时器/计数器设置为不同的工作方式。TMOD寄存器高4位中的M1、M0用来控制T1的工作方式,低4位中的M1、M0用来控制T0的工作方式。M1、M0位不同取值与定时器/计数器工作方式的关系见表1。
表1 TMOD寄存器的M1、M0位值与定时器/计数器工作方式
在TMOD寄存器的M1、M0位的控制下,定时器/计数器可以工作在4种不同的方式下,不同的工作方式适用于不同的场合。
1.方式0
当M1=0、M0=0时,定时器/计数器工作在方式0,它被设成13位计数器。在方式0时,定时器/计数器由TH、TL两个8位计数器组成,使用TH的8位和TL的低5位。
(1)定时器/计数器工作在方式0时的电路结构与工作原理
定时器/计数器T0、T1工作在方式0时的电路结构与工作原理相同。以T0为例,将TMOD寄存器的低4位中的M1、M0位均设为“0”,T0工作在方式0。定时器/计数器T0工作在方式0时的电路结构如图6所示。
图6 定时器/计数器T0工作在方式0时的电路结构
当T0工作在方式0时,T0是一个13位计数器(TH0的8位+TL0的低5位)。位通过控制开关S1来选择计数器的计数脉冲来源。当时,计数脉冲来自单片机内部振荡器(经12分频);当时,计数脉冲来自单片机T0引脚(P3.4引脚)。GATE位控制T0的启动方式。GATE位与引脚、TR0位一起经逻辑电路后形成CON电平,再由CON电平来控制开关S2的通断。当CON=1时,S2闭合,T0工作;当CON=0时,S2断开,T0停止工作(S2断开后无信号送给T0)。
当GATE=0时,CON的值与TR0的值一致,TR0可直接控制T0的启动/停止。
当GATE=1时,CON 的值由 TR0、两个值决定,其中TR0的值由编程来控制(软件控制),而的值由外部引脚的电平控制,只有当它们的值都为“1”时,CON的值才为“1”,定时器/计数器T0才能启动。
(2)定时器/计数器初值的计算若定时器/计数器工作在方式0,当其与外部输入端(T0引脚)连接时,可以用作13位计数器;当与内部振荡器连接时,可以用作定时器。
① 计数初值的计算。
当定时器/计数器用作13位计数器时,它的最大计数值为8192(),当T0引脚输入8192个脉冲时,计数器就会产生溢出而发出中断请求信号。如果希望不需要输入8192个脉冲,计数器就能产生溢出,可以给计数器预先设置数值,这个预先设置的数值称为计数初值。
在方式0时,定时器/计数器的计数初值可用下式计算:
计数初值=−计数值
比如希望输入1000个脉冲计数器就能产生溢出,计数器的计数初值应设置为7192 (8192−1000)。
② 定时初值的计算。
当定时器/计数器用作定时器时,它对内部振荡器产生的脉冲(经12分频)进行计数,该脉冲的频率为fosc/12,脉冲周期为12/fosc,定时器的最大定时时间为·12/fosc,若振荡器的频率fosc为12MHz,定时器的最大定时时间为8192μs。如果不希望定时这么长,定时器就能产生溢出,可以给定时器预先设置数值,这个预先设置的数值称为定时初值。
在方式0时,定时器/计数器的定时初值可用下式计算:
定时初值=−定时值=−t·fosc/12
比如单片机时钟振荡器的频率为12MHz(即12×106Hz),现要求定时1000μs(即1000 ×10−6s)就能产生溢出,定时器的定时初值应为
定时初值=−t·fosc/12=8192−1000×10−6×12×106/12=7192
2.方式1
当M1=0、M0=1时,定时器/计数器工作在方式1,它为16位计数器。除了计数位数不同外,定时器/计数器在方式1的电路结构与工作原理与方式0完全相同。定时器/计数器工作在方式1时的电路结构(以定时器/计数器T0为例)如图7所示。
定时器/计数器工作在方式1时的计数初值和定时初值的计算公式分别如下:
计数初值=−计数值
定时初值=−定时值=−t·fosc/12
图7 定时器/计数器在方式1时的电路结构
3.方式2
定时器/计数器工作方式0和方式1时适合进行一次计数或定时,若要进行多次计数或定时,可让定时器/计数器工作在方式2。当M1=1、M0=0时,定时器/计数器工作在方式2,它为8位自动重装计数器。定时器/计数器工作在方式2时的电路结构(以定时器/计数器T0为例)如图8所示。
图8 定时器/计数器T0在方式2时的电路结构
工作在方式2时,16位定时器/计数器T0分成TH0、TL0两个8位计数器,其中TL0用来对脉冲计数,TH0用来存放计数器初值。在计数时,当TL0计数溢出时会将TCON寄存器的TF0位置“1”,同时也控制TH0重装开始,将TH0中的初值重新装入TL0中,然后TL0又开始在初值的基础上对输入脉冲进行计数。
定时器/计数器工作在方式2时的计数初值和定时初值的计算分别如下:
计数初值=−计数值
定时初值=−定时值=−t·fosc/12
4.方式3
定时器/计数器T0有方式3,而T1没有(T1只有方式0~2)。当TMOD寄存器低4位中的M1=1、M0=1时,T0工作在方式3。
在方式3时,T0用作计数器或定时器。
(1)T0工作在方式3时的电路结构与工作原理
在方式3时,定时器/计数器T0用作计数器或定时器,在该方式下T0的电路结构如图9所示。
图9 T0工作在方式3时的电路结构
在方式3时,T0被分成TL0、TH0两个独立的8位计数器,其中TL0受T0的全部控制位控制(即原本控制整个T0的各个控制位,在该方式下全部用来控制T0的TL0计数器),而TH0受T1的部分控制位(TCON的TR1位和TF1位)控制。
在方式3时,TL0既可用作8位计数器(对外部信号计数),也可用作8位定时器(对内部信号计数);TH0只能用作8位定时器,它的启动受TR1的控制(TCON的TR1位原本用来控制定时器/计数器T1)。当TR1=1时,TH0开始工作,当TR1=0时,TH0停止工作,当TH0计数产生溢出时会向TF1置位。
(2)T0工作在方式3时T1的电路结构与工作原理
当T0工作在方式3时,它占用了T1的一些控制位,此时T1还可以工作在方式0~2(可通过设置TMOD寄存器高4位中的M1、M0的值来设置),T1在这种情况下一般用作波特率发生器。当T0工作在方式3时,T1工作在方式1和方式2的电路结构分别如图10(a)、(b)所示。
图10(a)是T0在方式3时T1工作在方式1(或方式0)时的电路结构。在该方式下,T1是一个16位计数器,由于TR1控制位已被借用来控制T0的高8位计数器TH0,所以T1在该方式下无法停止,一直处于工作状态,另外由于TF1位也借给了TH0,所以T1溢出后也不能对TF1进行置位产生中断请求信号,T1溢出的信号只能输出到串行通信口,此方式下的T1为波特率发生器。
图10(b)是T0在方式3时T1工作在方式2时的电路结构。在该方式下,T1是一个8位自动重装计数器,除了具有自动重装载功能外,其他与方式1相同。