280 likes | 445 Views
第 6 章 定时 / 计数器及应用. ● 教学目标 介绍定时 / 计数器的结构和原理 介绍定时 / 计数器的四种工作方式的应用 介绍定时 / 计数器时应注意的几个问题 ● 学习要求 了解定时 / 计数器的结构 熟悉定时 / 计数器的工作原理 掌握定时 / 计数器的初始化及应用程序设计 掌握定时 / 计数器精确定时要采取的相应措施. 6.1 MCS-51 定时 / 计数器概述.
E N D
第6章 定时/计数器及应用 ● 教学目标介绍定时/计数器的结构和原理介绍定时/计数器的四种工作方式的应用介绍定时/计数器时应注意的几个问题 ● 学习要求了解定时/计数器的结构 熟悉定时/计数器的工作原理 掌握定时/计数器的初始化及应用程序设计 掌握定时/计数器精确定时要采取的相应措施
6.1 MCS-51定时/计数器概述 在测控技术中,往往需要定时检测某个物理参数,或按一定的时间间隔来进行某种控制。这种定时的获得,可用软件来实现,即编制一段延时程序,但会降低CPU的工作效率。为此,在微机测控系统中,常采用硬件来实现定时,即使用定时/计数器,它还可以对某种事件进行计数,然后根据计数结果来进行控制。 在MCS-51单片机内部含有两个16位定时/计数器:T0和T1,它们既可以用于定时,也可用于对外部计数脉冲的计数,还可作为串行接口的波特率发生器,这些功能都可通过软件来设定与修改。
加1计数器 TFX ÷12 振荡器 6.1.1 定时器/计数器的结构 MCS-51定时/计数器由振荡器分频输入电路、外部计数脉冲输入电路、计数脉冲选择电路、计数启停电路、加1计数器和中断标志等组成。图6-1所示其结构框图,图中X=0或1,代表定时/计数器T0或T1相应的信号或寄存器的相应位。 C/T=0 中断 TXC/T=1控制 TRX GATE INTX 图6-1 定时/计数器T0或T1的结构原理图
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。
TMOD的地址为89H,不可按位寻址,只能用字节指令设置定时器工作方式。低半字节定义定时器T0,高半字节定义定时器T1。复位时,TMOD所有位均为零。 表6-1 方式选择位意义
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所有位均为零。
6.3定时器/计数器的四种工作方式及应用 6.3.1方式0及其应用 一、方式0介绍 当M1M0两位为00时,定时/计数器被选为工作方式0。在这种方式下,16位寄存器(TH0和TL0)只用13位,由TH0的8位和TL0的低5位构成。TL0的高3位是不定的,可以不必理会。因此方式0是一个13位的定时/计数器。当TL0的低5位计数溢出时,即向TH0进位,而TH0计数溢出时向中断标志位TF0进位(称为硬件置位TF0),并请求中断。若这时定时/计数器中断被开放,并且没有其他中断请求或其他中断请求的优先级较低,CPU会自动相应中断,进入相应的中断服务程序;也可以在定时/计数器中断被禁止的情况下,通过查询TF0是否置位来判断定时/计数器的操作完成与否。
C/T=0时,作为定时器方式工作,T0对机器周期计数,其定时时间为: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倍。在上两式中,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, M1M0=00H, T1不用,可任意,一般取0,故TMOD=00H,并由TR0启停T0。
初始化程序:MOV TMOD,#00H MOV TH0,#0C1H MOV TL0,#10H ;初始化T0 MOV IE,#82H ;开T0中断SETB TR0 ;启动T0………T0溢出中断服务程序: T0INT:CLR P1.7 NOP SETB P1.7 MOV TH0,#0C1H;T0重置初值MOV TL0,#10H RETI
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 ;初始化T0 SETB TR0 ;启动T0 LOOP:JBC TF0,AGN ;查询定时时间到否? AJMP LOOP ;定时时间未到,则继续查询等待AGN: MOV TH0,#0D8H ;定时时间到,T0重置初值 MOV TL0,#0F0H CPL P1.7 ;输出取反 NOP AJMP 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,#0E8H MOV TL1,#0E8H ;初始化T1 SETB TR1 ;启动T1
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和请求中断而已。
TH0(8位) TF1 ÷12 ÷12 振荡器 振荡器 TL0(8位) TF0 图6-2定时/计数器T0方式3的结构图 C/T=0 中断 T0 C/T=1 控制 TR0 GATE INT0 中断 TR1
二、应用举例 当按方式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,#27H MOV TH0,#9CH MOV TL0,#0FFH ;初始化T0 MOV TCON,#55H;置外部中断边沿触发方式,并启 动T0和T1 MOV IE,#9FH ;开放全部中断 … … … TL0溢出中断服务程序: TL0INT:MOV TL0,#0FFH (相关中断处理) RETI TH0溢出中断服务程序: 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的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和P1口输出周期性矩形脉冲,其周期为400µs,正脉冲宽度为400µs。 5.试用定时器T1设计外部事件计数器。要求每计数1万个脉冲,就将T1转为10ms定时方式,当定时到后,又转为计数方式,如此反复循环不止。当系统的时钟频率为6MHz时,编写相应程序。 6. 已知8051单片机系统时钟频率为6MHz,利用其定时器方式1测量某正脉冲宽度时,能测量的最大脉宽是多少?若脉宽大于此极限值时,采用何种办法测量?