1、第6章 定时器/计数器及应用,6.1 定时器/计数器的结构 6.2 定时器/计数器的工作方式,退出,6.1 定时器/计数器的结构,6.1.1 定时器/计数器的结构 定时器/计数器的结构如图6-1所示。,6.1.2 定时器/计数器的工作方式寄存器TMOD定时器/计数器是一种可编程部件,在工作之前必须通过软件设定它的工作方式,即对工作方式寄存器TMOD中每位进行设定。下面介绍每位的含义:TMOD(89H),其中,低4位用于决定T0的工作方式,高4位用于决定T1的工作方式。1、M1和M0工作方式控制位M0和M1为工作方式控制位,确定4种工作方式,如表7-1所示。,2、C/T定时器/计数器方式选择位C
2、/T=0,设置为定时方式,对机器周期进行计数;C/T=1,设定为计数方式,对外部信号进行计数, 外部信号接至T0(P3.4)或T1(P3.5)引脚。3、GATE门控位GATE=0时,只要用软件使TR0(或TR1)置1就能启动定时器T0(或T1);GATE=1时,只有在INT0(或INT1)引脚为高电平的情况下,且由软件使TR0(或TR1)置1时,才能启动定时器T0(或T1)工作。,6.1.3 定时器/计数器的控制寄存器TCON设定好了定时器/计数器的工作方式后,它还不能进入工作状态,必须通过设置控制寄存器TCON中的某些位来启动它工。要使定时器/计数器停止运行,也必须通过设置TCON中的某些位
3、来实现。当定时器/计数器计满溢出,或有外部中断请求时,TCON能标明溢出和中断情况。下面介绍控制寄存器TCON每位的含义:,TF1:定时器T1溢出标志位。当定时器T1溢出时,由硬件自动使TF1置1,并向CPU申请中断。CPU响应中断后,自动对TF1清零。TF1也可以用软件清零。TR1:定时器T 1运行控制位。可由软件置1(或清零)来启动(或关闭)定时器T1,使定时器T1开始计数。用指令SETB TR1(或CLR TR1)使TR1置1(或清零)。,TF0:定时器T0溢出标志位。其功能与TF1相同。 TR0:定时器T0运行控制位。其功能与TR1相同。 IE1:外部中断1请求标志位。 IT1:外部中
4、断1触发方式控制位。 IE0:外部中断0请求标志位。 IT0:外部中断0触发方式控制位。 IE1、IT1、IE0、IT0这4位将在第3节讲述。 控制寄存器TCON的位地址是88H,可以对它进行位寻址。,6.2 定时器/计数器的工作方式,6.2.1 工作方式0定时器/计数器T0工作在方式0时,16位计数器只用了13位,即TH0的高8位和TL0的低5位,组成一个13位定时器/计数器。,1、工作在定时方式2、工作在计数方式【例6-1】利用定时器T0产生定时脉冲。每隔2ms产生宽度为2个机器周期的正脉冲,由P1.0输出此定时序列脉冲信号(设时钟频率为6MHZ)。解:首先求出定时器T0初值。由于时钟频率
5、为6MHZ,所以,机器周期为2s。因为:t=(213-T0初值) 机器周期所以,当t=2ms时,则:(213-T0初值) 210-6=210-3,解得:T0初值=7096=11011101 11000B,其中将高8位11011101 B=DDH赋给TH0,低5位11000B=18H赋给TL0。方法一:采用查询工作方式,编程如下:ORG 0000HAJMP MAINORG 0100HMAIN: CLR P1.0MOV TMOD , #00H ;设定T0的工作方式MOV TH0 , #0DDH ;给定时器T0送初值,MOV TL0 , #18HSETB TR0 ;启动T0工作LOOP: JNB T
6、F0 , $ ;$为当前指令指针地址CLR TF0 SETB P1.0 ;产生2s正脉冲CLR P1.0 MOV TH0 , #0DDH ;重装载TH0和TL0MOV TL0 , #18HSJMP LOOPEND,方法二: 采用中断工作方式,编程如下:ORG 0000HAJMP MAINORG 000BHAJMP T0INTORG 0100HMAIN: CLR P1.0MOV TH0 , #0DDH ;给定时器T0送初值,MOV TL0 , #18HMOV IE , #82H ;允许T0中断SETB TR0 ;启动T0SJMP $ 中断服务程序:ORG 0300H T0INT: SETB P1
7、.0CLR P1.0MOV TH0 , #0DDH ;重装载TH0和TL0MOV TL0 , #18HRETI,6.2.2 工作方式1定时器T0工作方式1与工作方式0类同,差别在于其中的计数器的位数。工作方式0以13位计数器参与计数,工作方式1则以16位计数器参与计数。,1、工作在定时方式2、工作在计数方式工作方式1是16位计数器。这是工作方式1与工作方式0在计数方式时唯一差别。【例6-2】 用定时器T0产生50HZ的方波。由P1.0输出此方波(设时钟频率为12MHZ)。解:50HZ的方波周期为20ms,可以用定时器产生10ms的定时,每隔10ms改变一次P1.0的电平,即可得到50HZ的方波
8、。此时,应使定时器T0工作在方式1。工作在方式1时的T0初值,根据下式计算:,t=(216-T0初值) 机器周期解得t=55536= 11011000 11001100B=D8CCH,其中将高8位D8H赋给TH0,低8位CCH赋给TL0。采用中断工作方式,编程如下:ORG 0000HAJMP MAINORG 000BHAJMP T0INTORG 0100H,MAIN: MOV TMOD , #01HMOV TH0 , #0D8 HMOV TL0 , #0CC HMOV IE , #82HSETB TR0SJMP $,中断服务程序;ORG 0300HT0INT: CPL P1.0MOV TH0
9、, #0D8HMOV TL0 , #0CCHRETI6.2.3 工作方式2定时器T0在工作方式2时,16位的计数器分成了两个独立的8位计数器TH0和TL0。,6.2.2 方式1 M1、M0=01,16位的计数器。 6.2.3 方式2 计数满后自动装入计数初值。M1、M0=10 ,等效框图如下:,TLX作为常数缓冲器,当TLX计数溢出时,在置“1”溢出标志TFX的同时,还自动的将THX中的初值送至TLX,使TLX从初值开始重新计数。定时器/计数器的方式2工作过程如图6-5(X=0,1)。,省去用户软件中重装初值的程序,精确的定时。 6.2.4 方式3 增加一个附加的8位定时器/计数器,从而具有3
10、个定时器/计数器。,只适用于定时器/计数器T0。T1不能工作在方式3, T1方式3时相当于TR1=0,停止计数(此时T1可用来作串行口波特率产生器)。 1工作方式3下的T0 T0分为两个独立的8位计数器:TL0和TH0 。TL0使用T0的状态控制位C/T*、GATE、TR0、,而TH0被固定为一个8位定时器(不能作外部计数模式),并使用定时器T1的状态控制位TR1和TF1,同时占用定时器T1的中断请求源TF1。 各引脚与T0的逻辑关系如图所示:,2T0工作在方式3下T1的各种工作方式 当T1用作串行口的波特率发生器时, T0才工作在方式3。 T0处于方式3时, T1可定为方式0、方式1和方式2
11、,用来作为串行口的波特率发生器,或不需要中断的场合。 (1)T1工作在方式0,(2) T1工作在方式1 (3) T1工作在方式2,1、工作在定时方式2、工作在计数方式工作方式2与工作方式0、方式1的差别,在于工作方式2是一个8位的计数器。6.2.4 工作方式3工作方式3仅对定时器T0有效。当定时器T0工作在方式3时,将16位的计数器分为两个独立的8位计数器TH0和TL0。,当定时器T0工作在方式3时,定时器T1只能工作在方式02,并且工作在不需要中断的场合。,例6-2 假设系统时钟为6MHz,编写定时器T0产生1秒定时的程序。 (1)T0工作方式的确定 定时时间较长,采用哪一种工作方式?由各种
12、工作方式的特性,可计算出:方式0最长可定时16.384ms;,方式1最长可定时131.072ms;方式2最长可定时512s。 选方式1,每隔100ms中断一次,中断10次为1s。 (2)计算计数初值因为:(216-X)210-6 = 10-1所以:X=15536=3CB0H因此:TH0=3CH,TL0=B0H (3)10次计数的实现采用循环程序法。 (4)程序设计参考程序 :,ORG 0000H RESET: LJMP MAIN ;上电,转主程序入口MAINORG 000BH ;T0的中断入口LJMP IT0P ;转T0中断处理程序IT0PORG 1000HMAIN: MOV SP,#60H
13、;设堆栈指针MOV B,#0AH ;设循环次数10次MOV TMOD,#01H ;设T0工作在方式1MOV TL0,#0B0H ;给T0设初值MOV TH0,#3CHSETB TR0 ;启动T0SETB ET0 ;允许T0中断,SETB EA ;CPU开放中断HERE: SJMP HERE ;等待中断ITOP: MOV TL0,#0B0H ;T0中断子程序,重装初值MOV TH0,#3CH ;DJNZ B,LOOPCLR TR0 ;1s定时时间到,停止T0工作LOOP: RETI,例6-4 利用T1的方式2对外部信号计数,要求每计满100个数,将P1.0取反。 本例是方式2计数模式的应用。 (
14、1)选择工作方式,外部信号由T1(P3.5) 脚输入,每发生一次负跳变计数器加1,每输入100个脉冲,计数器产生溢出中断,在中断服务程序中将P1.0取反一次。 T1 方式2的控制字为TMOD=60H。不使用T0时,TMOD的低4位可任取,但不能使T0进入方式3,这里取全0。 (2)计算T1的初值X=28-100=156=9CH因此,TL1的初值为9CH,重装初值寄存器TH1=9CH (3)程序设计ORG 0000HLJMP MAINORG 001BH ;T1中断服务程序入口,CPL P1.0 ;P1.0位取反RETIORG 0100HMAIN: MOV TMOD,#60H ;设T1为方式2计数
15、MOV TL0,#9CH ;T0置初值MOV TH0,#9CH SETB TR1 ;启动T1HERE: AJMP HERE,6.4.4 门控制位GATE的应用测量脉冲宽度 GATE1可使定时器/计数器T1的启动计数受INT1*的控制,可测量引脚INT1*(P3.3)上正脉冲的宽度(机器周期数)。,参考程序:ORG 0000H RESET: AJMP MAIN ;复位入口转主程序ORG 0100HMAIN: MOV SP,#60HMOV TMOD,#90H ;T1为方式1定时控制字MOV TL1,#00HMOV TH1,#00H LOOP0: JB P3.3,LOOP0 ;INT1*高,则循环SETB TR1 ;如INT1*为低,启动T1 LOOP1: JNB P3.3,LOOP1 ;INT1*低,则循环 LOOP2: JB P3.3,LOOP2 ;INT1*高,则循环,CLR TR1 ;停止T1计数MOV A,TL1 ;T1计数值送A将A中的T1计数值送显示缓冲区转换成显示的代码 LOOP3: LCALL DIR ;调用显示子程序DIR ; 显示T1计数值AJMP LOOP3 ; 执行程序,使INT1*引脚上出现的正脉冲宽度以机器周期数的形式显示在显示器上。,