第 6 章 定时 / 计数器及应用

28
第 6 第 第第 / 第第第第第第 第第第第 第第第第 / 第第第第第第第第第 第第第第 / 第第第第第第第第第第第第第 第第第第 / 第第第第第第第第第第第第 第第第第 第第第第 / 第第第第第第 第第第第 / 第第第第第第第第 第第第第 / 第第第第第第第第第第第第第第 第第第第 / 第第第第第第第第第第第第第第第

description

第 6 章 定时 / 计数器及应用. ● 教学目标 介绍定时 / 计数器的结构和原理 介绍定时 / 计数器的四种工作方式的应用 介绍定时 / 计数器时应注意的几个问题 ● 学习要求 了解定时 / 计数器的结构 熟悉定时 / 计数器的工作原理 掌握定时 / 计数器的初始化及应用程序设计 掌握定时 / 计数器精确定时要采取的相应措施. 6.1 MCS-51 定时 / 计数器概述. - PowerPoint PPT Presentation

Transcript of 第 6 章 定时 / 计数器及应用

第 6 章 定时 / 计数器及应用 ● 教学目标介绍定时 / 计数器的结构和原理介绍定时 / 计数器的四种工作方式的应用介绍定时 / 计数器时应注意的几个问题 ● 学习要求了解定时 / 计数器的结构 熟悉定时 / 计数器的工作原理 掌握定时 / 计数器的初始化及应用程序设计 掌握定时 / 计数器精确定时要采取的相应措施

6.1 MCS-51 定时 / 计数器概述 在测控技术中,往往需要定时检测某个物理参数,或按一定的时间间隔来进行某种控制。这种定时的获得,可用软件来实现,即编制一段延时程序,但会降低 CPU 的工作效率。为此,在微机测控系统中,常采用硬件来实现定时,即使用定时 / 计数器,它还可以对某种事件进行计数,然后根据计数结果来进行控制。

在 MCS-51 单片机内部含有两个 16 位定时 /计数器: T0 和 T1 ,它们既可以用于定时,也可用于对外部计数脉冲的计数,还可作为串行接口的波特率发生器,这些功能都可通过软件来设定与修改。

6.1.1 定时器 / 计数器的结构 MCS-51 定时 / 计数器由振荡器分频输入电路、外部计数脉冲输入电路、计数脉冲选择电路、计数启停电路、加 1 计数器和中断标志等组成。图 6-1 所示其结构框图,图中 X=0 或 1 ,代表定时 / 计数器 T0 或 T1 相应的信号或寄存器的相应位。

   

C/T=0 中断 TX C/T=1 控制 TRX

GATE

INTX

图 6-1 定时 / 计数器 T0 或 T1 的结构原理图

÷12振荡器加 1 计数器 TFX

6.1.2 定时器 / 计数器的工作原理 由图 6-1 可见,定时 / 计数器的核心是一个加 1 计数器,每输入一个脉冲,计数值加 1 ,当计数到计数器全为 1 时,再输入一个脉冲就使计数值回零,同时从最高位溢出一个脉冲使控制寄存器 TCON 的 TFX(X=0 或 1) 位置 1 ,作为计数器的溢出中断标志。加 1 计数器由两个 8 位特殊功能寄存器 TH X 和 TL X(X=0或 1) 组成,它们可以被程控为不同的组合状态 (13 位、 16 位、两个分开的 8 位等 ) ,从而形成定时 / 计数器的四种工作方式。 加 1 计数器计数工作的启动和停止由相应的电路控制,方式寄存器 TMOD 的 GATE 位为 0 时,由寄存器 TCON 的 TR X(X=

0 或 1) 位启动 ( 这时 TR X=1) 或停止 ( 这时 TR X=0) ; GATE 位为 1 ,且 TR X(X=0 或 1) 为 1 时,由中断引脚 INT X(X=0 或 1) 的外部信号电平启动 ( 这时 INT X=1) 或停止 ( 这时 INT X=0) 。

通过方式寄存器 TMOD 的 C/T 位来选择加 1 计数器计数脉冲的来源:当 C/T=1 时,计数脉冲来自系统外部的脉冲源,这时定时 / 计数器成为外部事件计数器,工作于计数器状态;当 C/T=0 时,计数脉冲来自系统的时钟振荡器的 12 分频,由于这时的计数脉冲为一时间基准,脉冲数乘以脉冲间隔时间就是定时时间,这时定时 / 计数器工作于定时器状态。 作为定时器用时,加 1 计数器的值每过一个机器周期增 1 。 作为计数器用时,外部输入脉冲加在定时 / 计数器的外部输入端 T0(P3.4) 或 T1(P3.5) ,每出现一次从 1 到

0 的跳变,加 1 计数器便加 1 。

6.2 定时器 / 计数器的控制 6.2.1 定时器 / 计数器的方式寄存器 TMOD定时器方式字 TMOD 的格式如下:

⑴M1 和 M0 :方式选择位,定义如表 6-1 所示:⑵C/T :功能选择位。 C/T=0 为定时器方式; C/T=1 为计数器方式。⑶GATE: 门控位。 GATE=0 ,允许软件控制位 TR 0 或 TR 1 启动定时器。

T0 或 T1 ; GATE=1 ,且 TR 0( 或 TR 1)=1, 允许外部中断引脚电平启动定时器,即由 INT 0 (P3.2) 和 INT 1 (P3..3) 引脚分别控制 T0 和 T1 。

定时器 1 0

位编号 D7 D6 D5 D4 D3 D2 D1 D0

位功能 GATE C/T M1 M0 GATE C/T M1 M0

TMOD 的地址为 89H ,不可按位寻址,只能用字节指令设置定时器工作方式。低半字节定义定时器 T0 ,高半字节定义定时器 T1 。复位时, TMOD 所有位均为零。表 6-1 方式选择位意义 M1 M0 工作方式 功能说明

0 0 方式 0 13 位计数器0 1 方式 1 16 位计数器1 0 方式 2 自动再装入 8 位计数器1 1 方式 3 定时器 0 :分成两个 8 位计数器

6.2.2 定时器 / 计数器的控制寄存器 定时器控制字 TCON 的格式如下:

⑴ TF1(TCON.7) :定时器 1 溢出标志。定时器 1 溢出时由硬件置 1 ,定时器 1 以其作为标志去申请中断,当此中断获得响应时由硬件自动清零。 ⑵ TR1 (TCON.6) :定时器运行控制位。由软件对其置 1 或清 0 来启动或关闭定时器 1 的运行。 ⑶ TF0 (TCON.5) :定时器 0 溢出标志。其意义同 TF1 。 ⑷ TR0 (TCON.4) :定时器 0 运行控制位。其意义同 TR1 。

TCON 的其余四位与中断有关,在第 5 章有关章节已论述。 TCON 的位地址位 88H, 可按位寻址。复位时, TCON 所有位均为零。

位编号 D7 D6 D5 D4 D3 D2 D1 D0

意义 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

6.3 定时器 / 计数器的四种工作方式及应用

6.3.1 方式 0 及其应用一、方式 0 介绍 当 M1M0 两位为 00 时,定时 / 计数器被选为工作方式 0 。在这种方式下, 16 位寄存器 (TH0 和 TL0) 只用 13 位,由 TH0 的 8 位和 TL0的低 5 位构成。 TL0 的高 3 位是不定的,可以不必理会。因此方式 0是一个 13 位的定时 / 计数器。当 TL0 的低 5 位计数溢出时,即向 TH

0 进位,而 TH0 计数溢出时向中断标志位 TF0 进位 ( 称为硬件置位 TF

0) ,并请求中断。若这时定时 / 计数器中断被开放,并且没有其他中断请求或其他中断请求的优先级较低, CPU 会自动相应中断,进入相应的中断服务程序;也可以在定时 / 计数器中断被禁止的情况下,通过查询 TF0 是否置位来判断定时 / 计数器的操作完成与否。

C/T=0 时,作为定时器方式工作, T0 对机器周期计数,其定时时间为:(213- T0 初值 )× 时钟周期 ×12

当 GATE=1 ,且 TR0=1 时,外部信号通过 INT0 引脚直接开启或关断定时 / 计数器的计数。当输入高电平时允许计数,否则停止计数。这种操作方法可用于测量加到 INT0 的外部信号脉冲宽度。作为计数器方式工作时, T0 对外部事件计数。以上的说明同样适合于定时器 T1 。 二、应用举例 由前面的论述可知, MCS-51 单片机的定时 / 计数器是可编程的,因此,在使用定时 / 计数器进行定时或计数之前,首先要通过软件对它进行初始化。初始化包括下述几个步骤:  1. 确定工作方式:对 TMOD 寄存器赋值;  2. 置定时 / 计数器初值:对 TH0 、 TL0 或 TH1 、 TL1 寄存器赋值;设加 1 计数器的最大值为 N( 方式 0 , N=213;方式 1 , N=216;方式 2 、 3 ,N=28) ,由于采用加法计数,则初值 X的计算方法如下: 计数方式时: X=N-M 定时方式时: X=N-t/T

在上两式中, M 为计数模值,即从计数器启动到溢出时所需计数值;t 为定时值; T 为计数周期,单片机时钟周期的 12 倍。  3. 根据需要,开放定时器中断:对 IE 寄存器赋值; 4. 启动定时 / 计数器:使 TCON 寄存器的 TR0 或 TR1 置位,或由加到引脚 INTX 上的外部信号电平启动。 之后,定时 / 计数器即按规定的工作方式和初值进行定时或开始计数。例 6-1 利用 T0 方式 0 产生宽度为 2μs ,周期为 2ms 的定时负脉冲,由 P1.7 送出,系统采用 12MHz 的晶振。 解 由于晶振为 12MHz ,机器周期为 1μs, 这样利用 T0 方式 0 产生周期为 2ms 定时的初值 X 为: X =N-t/T =213-2×10-3/(1×10-6) =8192-2000 =6192 =1830H =1100000110000B 则 TH0=11000001B=0C1H , TL0=00010000B=10H

由于 CLR bit 和 NOP 指令的执行时间为 1 个机器周期,当晶振为 12MHz 时,这两条指令的执行时间都为 1μs 。这样,每当定时时间到时,利用 T0产生中断,在中断服务程序中,先执行 CLR P1.7 和 NOP 两条指令,然后执行 SETB P1.7, 最后重装 TH0 和 TL0 的初值,就可以产生题目所要求的定时脉冲。 置 T0 为定时方式 0 , GATE=0 , C/T=0, M1

M0=00H, T1 不用,可任意,一般取 0 ,故 TMOD=00H, 并由 TR0 启停 T0 。

初始化程序: MOV TMOD,#00HMOV TH0,#0C1H MOV TL0,#10H ;初始化 T0 MOV IE,#82H ;开 T0 中断 SETB TR0 ;启动 T0 … … …T0 溢出中断服务程序 :T0INT:CLR P1.7NOPSETB P1.7MOV TH0,#0C1H ; T0 重置初值MOV TL0,#10HRETI

6.3.2 方式 1 及其应用 一、方式 1 介绍 当 M1M0 两位为 01 时,定时 / 计数器被选为工作方式 1 。它与方式

0 基本相同,只是方式 1 改用了 16 位寄存器 (TH0 和 TL0) 全部 16 位。要求定时周期较长时, 13 位计数器不够用时,可改用 16 位计数器。 当 C/T=0 时,作为定时器方式工作, T0 对机器周期计数,其定时时间为:

(216- T0 初值 )× 时钟周期 ×12 当 GATE=1 ,同时 TR0=1 时,外部信号通过 INT0 引脚直接开启或关断定时 /计数器的计数。当输入高电平时允许计数,否则停止计数。这种操作方法可用于测量加到 INT0 的外部信号脉冲宽度。 作为计数器方式工作时, T0 对外部事件计数。 以上的说明同样适合于定时器 T1 。

二、应用举例 例 6-2 利用 T0 方式 1 产生一个 50Hz 的方波,由 P1.7 送出。系统采用 12MHz 的晶振,并假定 CPU 不作其它工作。 解 由于周期为 1/50Hz=20ms ,则这种方波的正负脉冲宽度都为 10ms 。只要利用 T0 方式 1 产生 10ms 定时,每次定时时间到时,使P1.7 取反一次,并让 T0 的重装初值,即可得到 50Hz 的方波。 由于晶振为 12MHz ,机器周期为 1μs, 这样利用 T0 方式 1 产生 10ms 定时的初值 X 为: X =N-t/T =216-10×10-3/(1×10-6) =65536-10000 =55536 =D8F0H =1101100011110000B 则 TH0=11011000B=0D8H , TL0=11110000B=0F0H

置 T0 为定时方式 1 , GATE=0 , C/T=0, M1M0=01H, T1 不用,可任意,一般取 0 ,故 TMOD=01H, 并由 TR0 启停 T0 。由于 CPU 不作其它工作,则可采用查询方式进行控制。 程序清单: MOV TMOD,#01H MOV TH0,#0D8H MOV TL0,#0F0H ;初始化 T0SETB TR0 ;启动 T0

LOOP:JBC TF0,AGN ;查询定时时间到否?AJMP LOOP ;定时时间未到,则继续查询等待AGN: MOV TH0,#0D8H ;定时时间到, T0重置初值MOV TL0,#0F0H

CPL P1.7 ;输出取反NOPAJMP LOOP ;重复循环

6.3.3 方式 2 及其应用 一、方式 2介绍 当 M1M0 两位为 10 时,定时 / 计数器被选为工作方式 2 。这种方式使定时 / 计数器成为能重置初值的 8 位定时 / 计数器。 在这种方式下, 16 位计数器分作两个 8 位计数器: TL0作为 8 位计数器, TH0 用作保存计数初值。一旦 TL0 计数溢出,便置位 TF0 ,并将 TH0 的内容重新装入 TL0 中进行新的一轮计数,如此循环重复不止。 因此,这种方式特别适合用作较精确的脉冲信号发生器,脉冲信号的周期计算如下:

(28- TH0 初值 )× 时钟周期 ×12 以上的说明同样适合于定时器 T1 。

二、应用举例 由于方式 2 可省去用户软件重装初值的操作,可获得相当精确的定时时间,因此 T1 常用作串行口波特率发生器。在程序初始化时,要对 TH0 和 TL0赋同样的初值。 例 6-3 采用 11.059MHz晶振 , 将 T1 用作串行口波特率发生器,按方式 2 产生1200 的波特率 . 解 参 9.1 节可以知道,波特率的计算如下:波特率 = 若SMOD=0 ,则可以算得重装载值:

(TH1)=256- 232=E8H 置 T1 为定时方式 2 , GATE=0 , C/T=0, M1M0=02H, T0 不用,可任意,一般取 0 ,故 TMOD=20H,并由 TR1 启停 T1 。 程序清单:MOV TMOD,#20H

MOV TH1,#0E8HMOV TL1,#0E8H ;初始化 T1SETB TR1 ;启动 T1

)](256[12322

1THfosc

SMOD

6.3.4 方式 3 及其应用 当 M1M0 两位为 11 时,定时 / 计数器被选为工作方式 3 。在方式 3 下,定时器 T1将停止计数,只是保持其计数值,与置 TR1 为 0 等效。定时器 T0 在方式 3 下分成两个独立的计数器 TL0 和 TH0 ,见图 6-5 所示。其中, TL0 可用作定时或计数器,并占用定时器 T0 的所有控制位: GATE,C/T,TR0,INT0 和 TF0 ;而 TH0固定作为定时器用,并借用定时器 T1 的 TR1 和 TF1 ,这时 TH0控制着定时器的 T1 中断。 当定时器 T0 在方式 3 时,定时器 T1仍可按方式 0 、 1 、2 工作,只是不能使用其溢出标志 TF1 和请求中断而已。

图 6-2 定时 / 计数器 T0 方式 3 的结构图 C/T=0 中断 T0 C/T=1 控制 TR0 GATE

INT0 中断 TR1

÷12振荡器TL0(8 位)

TF0

÷12振荡器 TH0(8 位)

TF1

二、应用举例 当按方式 2 将定时器 T1 用作串行口波特率时,为增加一个额外的定时器,可将定时器 T0 设置成方式 3工作。 例 6-4  假设某用户系统中,采用 12MHz 晶振 , 已将 T1 按方式 2 工作,用作串行口波特率发生器,并且已使用了 2 个外部中断。现要求再增加一个外部中断源,并由 P1.7 口输出一个 5KHz 的方波。 解为了不增加其它硬件的开销,可把定时器 T0 置于计数工作方式 3,利用

T0 端作为附加的外部中断输入端,把 TL0预置为 0FFH ,这样当 T0 输入端出现由 1 至 0 的负跳变时, TL0立即溢出,申请中断,相当于边沿触发的外部中断源。在方式 3 下, TH0总是作为 8 位定时器用,可以用它来控制 P1.7 口输出的方波频率。 由 P1.7 输出 5KHz 的方波,即每隔 100μs 使 P1.7 口的电平变化一次, TH0初值 X 为:X=N-t/T=28-100×10-6/(1×10-6)=256-100=156=9CH

置 T1 为定时方式 2 , GATE=0 , C/T=0, M1M0=02H, T0 为计数方式 3 , GATE=0 , C/T=1, M1M0=03H, ,故 TMOD=27H, 并由 TR0 启停 T0 。采用中断方式来判断 TH0 的定时时间到否,每次时间到时,在定时器 T0 中断服务程序中将P1.7 口取反一次。

初始化程序:MOV TMOD,#27HMOV TH0,#9CHMOV TL0,#0FFH ;初始化 T0MOV TCON,#55H ;置外部中断边沿触发方式,并启 动 T0 和 T1MOV IE,#9FH ;开放全部中断…… …TL0 溢出中断服务程序 :

TL0INT:MOV TL0,#0FFH( 相关中断处理 ) RETITH0 溢出中断服务程序 :

TH0INT:MOV TH0,#9CH CPL P1.7 RETI

6.3.5 定时器 / 计数器应用的其它问题 一、定时器溢出和中断的同步 定时器溢出时,自动产生内部中断请求,若此时中断已经开放,该中断会被响应。但真正进入中断服务程序要经过的时间并非固定不变,而取决于其它中断服务程序是否正在运行,或取决于正在执行什么样的指令。 若定时器溢出中断是唯一的中断源,则延时时间取决于正在执行什么样的指令,可能在 3至 8 个机器周期内变化,在这种情况下,相邻 2 次定时中断响应的间隔的变化不大,在对定时精度要求不高的场合,可以忽略。但在对定时精度要求高的场合,需要对由此引起的误差进行补偿,可采用以下方法:在定时器溢出中断得到相应时,停止定时器计数,读出计数值 ( 它反映了中断响应的延迟时间 ) ,根据此数值计算出到下一次中断所需的时间,并修改相应的定时器初值和重新启动定时器。

二、读运行中定时 / 计数器 为了对定时时间进行补偿,需要读出和改变定时 / 计数器的计数值。采用先停定时器,后读出并改变计数值的方法。在某些场合,希望不间断定时过程的情况下,读出定时器某刻的瞬时计数值,但如不注意,读出的计数值可能出错,因为 THX 和 TLX 不可能同时读出。 解决办法:先读 THX ,后读 TLX ,再读 THX 。若 2 次读得的

THX没有变化,则读得的内容是正确的;若前后 2 次读得的 THX 有变化,则重复上述过程,直到 2 次读得的 THX没有变化。

三、定时器门控位 GATE 的应用 前面讲过,门控位 GATE 用于选择控制定时 / 计数器启停的信号,当 GATE=0 时,定时 / 计数器的运行由 TRX 控制;当

GATE=1 ,且 TR X=1 时,外部信号通过 INTX 引脚直接开启或关断定时 / 计数器的计数。当输入 1 电平时允许计数,否则停止计数。这一特点可极为方便地用于测量加到 INTX 的外部信号脉冲宽度。

小 结 在 MCS-51 单片机内部含有两个 16 位定时 / 计数器: T0 和 T1 ,它们由振荡器分频输入电路、外部计数脉冲输入电路、计数脉冲选择电路、计数启停电路、加 1 计数器和中断标志等组成。其核心是一个加 1 计数器,每输入一个脉冲,计数值加 1 ,当计数到计数器全为 1 时,再输入一个脉冲就使计数值回零,同时从最高位溢出一个脉冲使控制寄存器 TCON 的 TFX(X=

0 或 1) 位置 1 ,作为计数器的溢出中断标志。 T0 和 T1 的启动和停止由方式寄存器 TMOD 的 GATE 位控制: GATE 为 0 时,由寄存器 TCON 的 TR X(X=0 或 1) 位启动 ( 这时 TR X=1) 或停止 ( 这时 TR X=0) ;GATE 位为 1 ,且 TR X(X=0 或 1) 为 1 时,由中断引脚INT X(X=0 或 1) 的外部信号电平启动 ( 这时 INT X=1) 或停止 ( 这时 INT X=0) 。

通过方式寄存器 TMOD 的 C/T 位来选择加 1 计数器计数脉冲的来源:当 C/T=1 时,计数脉冲来自系统外部的脉冲源,这时定时 / 计数器成为外部事件计数器,工作于计数器状态;当 C/T=0 时,计数脉冲来自系统的时钟振荡器的 12 分频,由于这时的计数脉冲为一时间基准,脉冲数乘以脉冲间隔时间就是定时时间,这时定时 / 计数器工作于定时器状态。

通过方式寄存器 TMOD 的 M1M0 位来设定 T0 和 T1 的工作方式:当M1M0 两位为 00 时,定时 / 计数器被选为工作方式 0 , 16 位寄存器(TH0 和 TL0) 只用 13 位,由 TH0 的 8 位和 TL0 的低 5 位构成,因此方式 0 是一个 13 位的定时 / 计数器;当 M1M0 两位为 01 时,定时 / 计数器被选为工作方式 1 ,它与方式 0 基本相同,只是方式 1 改用了16 位寄存器 (TH0 和 TL0) 的全部 16 位;当 M1M0 两位为 10 时,定时/ 计数器被选为工作方式 2 , 16 位计数器分作两个 8 位计数器, TL0 作为 8 位计数器, TH0 用作保存计数初值,一旦 TL0 计数溢出,便置位 TF0 ,并将 TH0 的内容重新装入 TL0 中进行新的一轮计数,如此循环重复不止,常将 T1 设定为方式 2 用作串行接口的波特率发生器;当 M1M0 两位为 11 时,定时 / 计数器被选为工作方式 3 ,定时器 T0 在方式 3下分成两个独立的计数器 TL0 和 TH0 , 其中, TL0 可用作定时或计数器,并占用定时器 T0 的所有控制位(GATE,C/T,TR0,INT0 和 TF0),而 TH0固定作为定时器用,并借用定时器 T1 的 TR1 和 TF1 ,这时 TH0 控制着定时器的 T1 中断,在方式 3下,定时器T1将停止计数,只是保持其计数值,与置 TR1 为 0 等效。

思考题与习题六 1.8051 单片机内部设有几个定时 / 计数器?它们是由哪些专用寄存器组成?定时、计数的速率(即计数频率)各为多少?2. 简述定时 / 计数器的四种工作方式及其特点,并说明如何选择和设定?3. 选用 T1 方式 0 产生 500µs 的定时,在 P1.0 ,输出周期为 1ms 的方波,晶振 fosc=6MHz 。4. 已知 8051 单片机系统时钟频率为 6MHz ,试用定时器 T0 方式 2 和 P

1 口输出周期性矩形脉冲,其周期为 400µs ,正脉冲宽度为 400µs 。5. 试用定时器 T1 设计外部事件计数器。要求每计数 1万个脉冲,就将

T1转为 10ms 定时方式,当定时到后,又转为计数方式,如此反复循环不止。当系统的时钟频率为 6MHz 时,编写相应程序。6. 已知 8051单片机系统时钟频率为 6MHz ,利用其定时器方式 1 测量某正脉冲宽度时,能测量的最大脉宽是多少?若脉宽大于此极限值时,采用何种办法测量?