第6章AT89S51单片机的定时器/计数器单片机原理及应用主讲人:贺伟业精于勤荒于嬉,行成于思毁于随内容概要工业检测与控制,许多场合都要用到计数或定时功能。例如,对外部脉冲进行计数,产生精确的定时时间等。AT89S51片内有两个可编程的定时器/计数器T1、T0,可满足需要。本章介绍定时器/计数器的结构与功能,2种工作模式和4种工作方式,以及相关的2个特殊功能寄存器TMOD和TCON各位的定义及其编程,最后介绍定时器/计数器的编程及应用实例。实现定时一般有三种方法:1、利用软件实现(延时程序);优点:简单,控制方便;缺点:CPU效率低。2、硬件实现,专门设计一个单稳态定时器:优点:CPU效率高;缺点:修改参数麻烦。3、利用计数器实现单片机一般利用第三种方法实现计数器溢出输入脉冲1us8位256us预置数AT89S51内部设有两个16位的定时器/计数器,可用软件控制。定时器:对机器周期计数,每过一个机器周期,计数器内容加1;计数器:对外来脉冲进行计数,T0、T1引脚上从高电平到低电平跳变时,计数器内容加1。外来脉冲T0机器周期片内计数器单片机6.1定时器/计数器的结构定时器/计数器结构如图6-1所示,定时器/计数器T0由特殊功能寄存器TH0、TL0构成,定时器/计数器T1由特殊功能寄存器TH1、TL1构成。图6-1AT89S51单片机的定时器/计数器结构框图具有定时器和计数器2种工作模式,4种工作方式(方式0、方式1、方式2和方式3)。属于增计数器。TMOD用于选择定时器/计数器T0、T1的工作模式和工作方式。TCON用于控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。T0、T1不论是工作在定时器模式还是计数器模式,都是对脉冲信号进行计数,只是计数信号的来源不同。计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数(见图6-1)。定时器工作模式是对单片机的时钟振荡器信号经片内12分频后的内部脉冲信号计数。由于时钟频率是定值,所以可根据计数值可计算出定时时间。计数器的起始计数都是从计数器初值开始的。单片机复位时计数器的初值为0,也可用指令给计数器装入一个新的初值。AT89S51的定时器/计数器属于增1计数器。二、定时器/计数器的工作原理16位的定时器/计数器实质上是一个加1计数器,可实现定时和计数两种功能,其功能由软件控制和切换。定时器属硬件定时和计数,是单片机中效率高而且工作灵活的部件。在定时器/计数器开始工作之前,CPU必须将一些命令(称为控制字)写入定时器/计数器。将控制字写入定时器/计数器的过程叫定时器/计数器的初始化。在初始化程序中,要将工作方式控制字写入定时器方式寄存器(TMOD),工作状态控制字(或相关位)写入定时器控制寄存器(TCON),赋定时/计数初值给TH0(TH1)和TL0(TL1)。1、定时器/计数器的定时功能:计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出。定时器的定时时间与系统的时钟频率有关。因一个机器周期等于12个时钟周期,所以计数频率应为系统时钟频率的十二分之一。如果晶振频率为12MHz,则机器周期为1s。通过改变定时器的定时初值,并适当选择定时器的长度(8位、13位或16位),可以调整定时时间。2、定时器/计数器的计数功能:通过外部计数输入引脚T0(P3.4)和T1(P3.5)对外部信号计数,外部脉冲的下降沿将触发计数。计数器在每个机器周期的S5P2期间采样引脚输入电平,若一个机器周期S5P2期间采样值为1,下一个机器周期S5P2期间采样值为0,则计数器加1,再下一个机器周期S3P1期间,新的计数值装入计数器。因检测一个由1至0的跳变需要两个机器周期,故外部信号的最高计数频率为时钟频率的二十四分之一。如果晶振频率为12MHz,则最高计数频率为0.5MHz。虽然对外部输入信号的占空比无特殊要求,但为了确保给定电平在变化前至少被采样一次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。如图6-10所示,图中Tcy为机器周期。各位的功能说明:TF1(TCON.7,8FH位)----T1溢出标志位。TF0(TCON.5,8DH位)----T0溢出标志位。TR1(TCON.6,8EH位)----T1运行控制位。0:关闭T1;1:启动T1运行。TR0(TCON.4,8CH位)----T0运行控制位。0:关闭T0;1:启动T0运行。1.定时器控制寄存器定时器控制寄存器TCON的作用是控制定时器的启动与停止,并保存T0、T1的溢出和中断标志。TCON的格式:可按位寻址6.1.1工作方式寄存器和控制寄存器AT89S51单片机的定时器为可编程定时器,在定时器工作之前必须先进行初始化,即将控制命令写入定时器控制寄存器。定时器方式寄存器TMOD的作用是设置T0、T1的工作方式。TMOD的格式:2.定时器工作方式寄存器TMOD各位的功能说明:(1)GATE:门控位。GATE=0:软件启动定时器,即用指令使TCON中的TR1(TR0)置1即可启动定时器1(定时器0)。GATE=1:软件和硬件共同启动定时器,即用指令使TCON中的TR1(TR0)置1时,只有外部中断INT0(INT1)引脚输入高电平时才能启动定时器1(定时器0)。(2)C/T:功能选择位。C/T=0时,以定时器方式工作。C/T=1时,以计数器方式工作。M1M0工作方式功能描述00方式013位计数器01方式116位计数器10方式2自动重装初值8位计数器11方式3定时器0:分为两个独立的8位计数器定时器1:无中断的计数器定时器工作方式选择位定义(3)M1、M0:方式选择位。定时/计数器有四种工作方式,由M1M0进行设置。二、定时器工作方式:由方式选择位M1、M0设定。1、方式0(M1M0=00):13位定时/计数器。THx8位和TLx低5位组成加1计数器。计数外部脉冲个数:1~8192(213)定时时间(若T=1s):1s~8.19msfoscT=12/fosc16位定时/计数器。THx8位和TLx8位组成16位加1计数器。计数外部脉冲个数:1~65536(216)定时时间(若T=1s):1s~(65536×T=65.54ms)2、方式1(M1M0=01):振荡器÷12TFx&≥11THxTLx&Tx引脚GATEINTxTRx启动控制C/T=0C/T=1加1脉冲溢出ETx中断允许中断请求D15D8D7D0(定时)(记数)(8位)(8位)foscT=12/fosc3、方式2(M1M0=10):自动恢复初值8位定时/计数器。TLx为8位加1计数器,THx为8位初值暂存器。用于需要重复定时和计数的场合。最大计数值:256(28)最大定时时间(若T=1s):256s振荡器÷12TFx&≥11TLx&Tx引脚GATEINTxTRx启动控制C/T=0C/T=1加1脉冲溢出ETx中断允许中断请求D7D0(定时)(记数)(8位)THx(8位)重装初值控制8foscT=12/fosc计数满后自动装入计数初值。省去用户软件中重装初值的程序,精确的定时。4、方式3(M1M0=11):•T0分成2个8位定时器:TL0定时/计数器和TH0定时器;•TL0占用T0控制位:C/T,TR0,GATE;•TH0占用T1控制位:TR1、TF1;•T1不能使用方式3工作,常作串口的波特率发生器使用。fosc振荡器T1工作在方式1T1工作在方式2T1工作在方式0T0处于方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合。4种工作方式中,方式0与方式1基本相同,由于方式0是为兼容MCS-48而设,初值计算复杂,在实际应用中,一般不用方式0,而采用方式1。方式2省去程序中重装初值的指令,并可产生相当精确的定时时间。当T1作串行口波特率发生器时,T0才设置为方式3。6.4定时器/计数器的编程和应用AT89S51的定时/计数器是可编程的,因此,在进行定时或计数之前也要用对其进行初始化。初始化一般应包括以下几个步骤:1、对TMOD寄存器赋值,以确定定时器的工作方式。2.置定时/计数器初值,直接将初值写入寄存器的TH0,TL0或TH1,TL1。3.根据需要,对寄存器IE置初值,开放定时器中断。4.对TCON寄存器中的TR1或TR0置位,启动定时/计数器。启动以后,计数器即按规定的工作方式和初值进行计数或开始定时。定时/计数器初值的计算2.计数器初值的计算在计数器模式下,此时计数器就计数引脚上到来的脉冲个数,每检测到一个脉冲下降沿,就加1一次。其计数脉冲个数S为:S=M-X式中,M为计数器模值,该值和计数器工作方式有关,在方式0时M为213;在方式1时M为216;在方式2和方式3时M为28。X是计数器的计数初值。1.定时器初值的计算在定时器模式下,计数器由单片机主脉冲经12分频后计数,即就是对机器周期进行计数。则定时器定时时间t的公式:t=(M-X)×T定时初值:X=M-t/T式中,M为模值,和定时器的工作方式有关,在方式0时M为213;在方式1时M为216;在方式2和方式3时M为28。T是机器周期;X是定时器的定时初值。例2:例:T0运行于定时器状态,时钟振荡周期为12MHZ,要求定时100s。求不同工作方式时的定时初值X并计算在不同工作方式下最大的定时时间tmax。解:fosc=12MHzT=1s由公式X=M-t/T得:方式0(13位方式):X=213-100s/1s=1F9C当T0的初值=0时为最大定时时间:tmax=(213-0)*1s=8.192ms方式1(16位方式):X=216-100s/1s=FF9CHtmax=(216-0)*1s=65.536ms方式2、3(8位方式):X=28-100s/1s=9CHtmax=(213-0)*1s=256s注意:工作方式0的初值装入方法:1F9CH=0001111110011100B可见,TH0=FCH,TL0=1CHTL0的低5位TH0的8位MOVTH0,#0FCHMOVTL0,#1CHT=12/fosc定时器初始化编程:使用定时器工作之前,先写入控制寄存器,确定好定时器工作方式。初始化编程格式:MOVTMOD,#方式字;选择方式MOVTHx,#XH;装入Tx时间常数MOVTLx,#XL(SETBEA);开Tx中断(SETBETx)SETBTRx;启动Tx定时器需考虑:1.按实际需要选择定时/计数功能;2.按时间或计数长度选择工作方式;3.计算时间常数:计算时间常数X(计算初值):计数功能:X=2n-计数值(n:8/13/16)定时功能:X=2n-t/T(t:定时时间;T:机器周期)方法1:用延时程序实现1mS的延时。UP:SETBP1.0LCALLD2MSCLRP1.0LCALLD2MSSJMPUP方法2:用T0定时1mS,查询TF0①确定工作方式方式0②计算初值E018H③编程MOVTMOD,#00HSETBTR0LOOP:MOVTH0,#0E0HMOVTL0,#18HJNBTF0,$CPLP1.0CLRTF0SJMPLOOP例1使P1.0输出一个周期为2mS的方波。方法3:用T0定时1mS,中断。ORG0000HLJMPMAINORG000BHLJMPAT0MAIN:MOVTMOD,#00HMOVTH0,#0E0HMOVTL0,#18HSETBEASETBET0SETBTR0SJMP$AT0:MOVTMOD,#00HMOVTH0,#0E0HCPLP1.0RETIfosc=12MHz(1)T0工作方式的确定定时时间较长,采用哪一种工作方式?由各种工作方式的特性,可计算出:方式0最长可定时16.384ms;方式1最长可定时131.072ms;方式2最长可定时512s。欲定时1秒,这个值已经超过了定时器的最大定时时间。为此,我们只有采用定时器定时和软件计数相结合的方法才能解决问题。选方式1,每隔100ms中断一次,中断10次为1s。(2)计算计数初值因为:(216-X)×2