第6章定时器/计数器(课时:8学时)教学目的了解定时器/计数器的结构与工作原理。掌握定时器/计数器的四种工作方式的特点及应用。用定时器/计数器设计一个可产生一定频率方波的信号源。用定时器/计数器设计一个脉冲宽度调制(PWM)信号以控制直流电动机转速。用定时器/计数器设计一个用于流水生产线上的产品自动计数器。用定时器/计数器设计一个测量电平脉冲宽度的程序。用定时器/计数器设计一个电子音乐程序。用定时器/计数器设计一个电子音乐程序。学习重点和难点定时器/计数器的初始化。定时器/计数器与中断的综合应用。第6章定时器/计数器6.1定时器/计数器的结构与原理6.2定时器/计数器的控制6.3定时器/计数器的四种工作方式及应用本章小结习题6.1定时器/计数器的结构与原理6.1.1定时器/计数器的结构6.1.2定时器/计数器的原理6.1.3定时器/计数器的功能6.1.1定时器/计数器的结构8051单片机内部设有两个16位可编程定时器/计数器,简称为定时器0(T0)和定时器1(T1)。16位的定时器/计数器分别由两个8位寄存器组成,即:T0由TH0和TL0构成,T1由TH1和TL1构成。每个寄存器均可单独访问,这些寄存器是用于存放定时初值或计数初值的。有一个8位的定时器方式寄存器TMOD和一个8位的定时器控制寄存器TCON。这些寄存器之间是通过内部总线和控制逻辑电路连接起来的,定时器/计数器的工作方式、定时时间和启停控制通过由指令来确定这些寄存器的状态来实现。TMOD主要用于设定定时器的工作方式,TCON主要用于控制定时器的启动与停止,并保存T0、T1的溢出和中断标志。6.1.1定时器/计数器的结构定时器/计数器结构框图6.1.2定时器/计数器的原理16位的定时器/计数器实质上是一个加l计数器,可实现定时和计数两种功能,其功能由软件控制和切换。定时器属硬件定时和计数,是单片机中效率高而且工作灵活的部件。在定时器/计数器开始工作之前,CPU必须将一些命令(称为控制字)写入定时器/计数器。将控制字写入定时器/计数器的过程叫定时器/计数器的初始化。在初始化程序中,要将工作方式控制字写入定时器方式寄存器(TMOD),工作状态控制字(或相关位)写入定时器控制寄存器(TCON),赋定时/计数初值给TH0(TH1)和TL0(TL1)。6.1.2定时器/计数器的原理定时器/计数器的定时功能。计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出。定时器的定时时间与系统的时钟频率有关。因一个机器周期等于12个时钟周期,所以计数频率应为系统时钟频率的十二分之一。如果晶振频率为12MHz,则机器周期为1s。通过改变定时器的定时初值,并适当选择定时器的长度(8位、13位或16位),可以调整定时时间。6.1.2定时器/计数器的原理定时器/计数器的计数功能。通过外部计数输入引脚T0(P3.4)和T1(P3.5)对外部信号计数,外部脉冲的下降沿将触发计数。计数器在每个机器周期的S5P2期间采样引脚输入电平,若一个机器周期S5P2期间采样值为1,下一个机器周期S5P2期间采样值为0,则计数器加1,再下一个机器周期S3P1期间,新的计数值装入计数器。因检测一个由1至0的跳变需要两个机器周期,故外部信号的最高计数频率为时钟频率的二十四分之一。如果晶振频率为12MHz,则最高计数频率为0.5MHz。虽然对外部输入信号的占空比无特殊要求,但为了确保给定电平在变化前至少被采样一次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。6.1.3定时器/计数器的功能定时器/计数器具有定时和计数两种功能,应用范围如下。1.定时与延时控制方面可产生定时中断信号,以设计出各种不同频率的信号源;产生定时扫描信号,对键盘进行扫描以获得控制信号,对显示器进行扫描以不间断地显示数据。2.测量外部脉冲方面对外部脉冲信号进行计数可测量脉冲信号的宽度、周期,也可实现自动计数。3.监控系统工作方面对系统进行定时扫描,当系统工作异常时,使系统自动复位,重新启动以恢复正常工作。6.2定时器/计数器的控制6.2.1定时器方式寄存器TMOD6.2.2定时器控制寄存器TCON6.2.1定时器方式寄存器TMOD定时器方式寄存器TMOD的作用是设置T0、T1的工作方式。TMOD的格式:各位的功能说明:(1)GATE:门控位。GATE=0:软件启动定时器,即用指令使TCON中的TR1(TR0)置1即可启动定时器1(定时器0)。GATE=1:软件和硬件共同启动定时器,即用指令使TCON中的TR1(TR0)置1时,只有外部中断INT0(INT1)引脚输入高电平时才能启动定时器1(定时器0)。6.2.1定时器方式寄存器TMOD(2)C/T:功能选择位。C/T=0时,以定时器方式工作。C/T=1时,以计数器方式工作。(3)M1、M0:方式选择位。定时器工作方式选择位定义M1M0工作方式功能描述00方式013位计数器01方式116位计数器10方式2自动重装初值8位计数器11方式3定时器0:分为两个独立的8位计数器定时器1:无中断的计数器6.2.2定时器控制寄存器TCON定时器控制寄存器TCON的作用是控制定时器的启动与停止,并保存T0、T1的溢出和中断标志。TCON的格式:各位的功能说明:(1)TF1(TCON.7):定时器1溢出标志位。当定时器1计满溢出时,由硬件自动使TF1置1,并申请中断。对该标志位有两种处理方法,一种是以中断方式工作,即TF1置1并申请中断,响应中断后,执行中断服务程序,并由硬件自动使TF1清0;另一种以查询方式工作,即通过查询该位是否为1来判断是否溢出,TF1置1后必须用软件使TF1清0。6.2.2定时器控制寄存器TCON各位的功能说明:(2)TR1(TCON.6):定时器1启停控制位。GATE=0时,用软件使TR1置1即启动定时器1,若用软件使TR1清0则停止定时器1。GATE=1时,用软件使TR1置1的同时外部中断INT1的引脚输入高电平才能启动定时器1。(3)TF0(TCON.5):定时器0溢出标志位。其功能同TF1。(4)TR0(TCON.4):定时器0启停控制位。其功能同TR1。(5)IE1(TCON.3):外部中断1请求标志位。(6)IT1(TCON.2):外部中断1触发方式选择位。(7)IE0(TCON.1):外部中断0请求标志位。(8)IT0(TCON.0):外部中断0触发方式选择位。6.3定时器/计数器的四种工作方式及应用6.3.1定时器/计数器的初始化6.3.2方式0及应用实例6.3.3方式1及应用实例6.3.4方式2及应用实例6.3.5方式36.3.1定时器/计数器的初始化1.定时器/计数器的初始化步骤定时器/计数器是一种可编程部件,在使用定时器/计数器前,一般都要对其进行初始化,以确定其以特定的功能工作。初始化的步骤如下。(1)确定定时器/计数器的工作方式,确定方式控制字,并写入TMOD。(2)预置定时初值或计数初值,根据定时时间或计数次数,计算定时初值或计数初值,并写入TH0、TL0或TH1、TL1。(3)根据需要开放定时器/计数器的中断,给IE中的相关位赋值。(4)启动定时器/计数器,给TCON中的TR1或TR0置1。6.3.1定时器/计数器的初始化2.定时初值或计数初值的计算方法不同工作方式的定时初值或计数初值的计算方法如下表所示。表中T表示定时时间,T机表示机器周期。工作方式计数位数最大计数值最大定时时间定时初值计算公式计数初值计算公式方式013213=8192213T机X=213-T/T机X=213-计数值方式116216=65536216T机X=216-T/T机X=216-计数值方式2828=25628T机X=28-T/T机X=28-计数值6.3.1定时器/计数器的初始化【例1】用定时器0方式0,定时5ms,以中断方式工作,进行程序初始化设计,晶振频率为6MHz。解:用定时器0方式0时,定时器/计数器方式寄存器TMOD低4位中的M1M0应取00;可设定为软件启动定时器,故GATE取0;因用定时功能,C/T取0;定时器方式寄存器TMOD高4位为无关位,一般都取0,所以TMOD应为00H。晶振频率为6MHz,T机=12/fosc=12/(6106)=2s定时初值X=213-T/T机=213-5103/2=8192-2500=5692=163CH=1011000111100B因TL0的高3位未用,对计算出的定时初值X要进行修正,即在低5位前插入3个0,修正后的定时初值X=1011000100011100B=B11CH6.3.1定时器/计数器的初始化定时器以中断方式工作,故将中断总允许位EA和定时器0的中断允许位ET0置1。参考程序:758900MOVTMOD,#00H;置定时器0为工作方式0758CB1MOVTH0,#0B1H;定时初值的高8位758A1CMOVTL0,#1CH;定时初值的低8位D2AFSETBEA;开放中断总允许位D2A9SETBET0;开放定时器0的中断允许位D28CSETBTR0;启动定时器06.3.2方式0及应用实例在方式0下,以定时器0为例,定时器/计数器是一个由TH0中的8位和TL0中的低5位组成的13位加1计数器(TL0中的高3位不用);若TL0中的第5位有进位,直接进到TH0中的最低位。定时器/计数器0方式0逻辑结构如下图所示。当门控位GATE=0时,或门输出始终为1,与门被打开,与门的输出电平始终与TR0的电平一致,实现由TR0控制定时器/计数器的启动和停止。若软件使TR0置1,接通控制开关,启动定时器0,13位加1计数器在定时初值或计数初值的基础上进行加1计数;溢出时,13位加1计数器为0,TF0由硬件自动置1,并申请中断,同时13位加1计数器继续从0开始计数。若软件使TR0清0,关断控制开关,停止定时器0,加1计数器停止计数。6.3.2方式0及应用实例振荡器12分频TH0(8位)TL0(5位)TF01&≥1C/T=0C/T=1T0(P3.4)TR0GATEINT0(P3.2)中断定时器/计数器0方式0逻辑结构C/TC/T6.3.2方式0及应用实例【例2】在P1.0输出周期为1ms(频率1kHz)的方波,采用定时器1方式0设计程序,晶振频率为12MHz。解:根据题意,只要使P1.0每隔500s取反一次即可得到周期1ms的方波,因而T1的定时时间为500s。用定时器1方式0时,定时器/计数器方式寄存器TMOD高4位中的M1M0应取00;可设定为软件启动定时器,故GATE取0;因为用定时功能,C/T取0;定时器方式寄存器TMOD低4位为无关位,一般都取0,所以TMOD应为00H。晶振频率为12MHz,T机=12/fosc=12/(12106)=1s定时初值X=213-T/T机=213-500/1=8192-500=7692=1E0CH=1111000001100B因TL1的高3位未用,对计算出的定时初值X要进行修正,即在低5位前插入3个0,修正后的定时初值X=1111000000001100B=F00CH6.3.2方式0及应用实例地址机器码程序注释ORG0000H0000H020050LJMPMAINORG0050H0050HD290MAIN:SETBP1.0;置P1.0初始状态0052H758900MOVTMOD,#00H;置定时器1为工作方式00055H758DF1MOVTH1,#0F0H;置500s定时初值0058H758B0CMOVTL1,#0CH005BHD28ESETBTR1;启动定时器1005DH108F02LP1:JBCTF1,LP2;查询计数溢出0060H80FBSJMPLP1;未到500s继续计数0062H758DF1LP2:MOVTH1,#0F0H;重新置500s定时初值0065H758B0CMOVTL1,#0CH0068HB290CPLP1.0;输出取