1、第第6 6章章 89C5189C51的定时器的定时器/计数器计数器&两个可编程的定时器两个可编程的定时器/计数器计数器T1T1、T0T0。&2 2种种工作模式工作模式:。(1 1)计数器计数器工作模式工作模式(2 2)定时器定时器工作模式工作模式&4 4种种工作方式工作方式(方式方式0-0-方式方式3 35.1 5.1 定时器定时器/计数器的结构与工作原理计数器的结构与工作原理加一计数器加一计数器5.2 5.2 定时计数器的控制与工作方式(寄存器定时计数器的控制与工作方式(寄存器TMODTMOD、TCONTCON)M1M2 0 0 方式方式0(13位位)0 1 方式方式1(16位位)1 0 方
2、式方式2(8位位,自动自动重装重装)1 1 方式方式3(T0,2个个8位位)计数器模式和定计数器模式和定时器模式选择位时器模式选择位0:定时器模式。定时器模式。1:计数器模式。计数器模式。门控位门控位 0:仅:仅以以TRX(X=0,1)来来启动定时器启动定时器/计数器运行。计数器运行。1:用引脚用引脚INT0*(或或INT1*)来启动定时器来启动定时器/计数器运行。计数器运行。1、控制、控制 (1)TF1、TF0计数溢出标志位计数溢出标志位(2)TR1、TR0定时计数运行控制位定时计数运行控制位1:启动启动 0:停止停止 IT0/IT1选择外中断请求选择外中断请求 IT0=0 为为电平触发电平
3、触发方式。方式。IT0=1 为为跳沿触发跳沿触发方式。方式。可由软件置可由软件置“1”或清或清“0”。IE0=0、IE1=0 无外部中断请求无外部中断请求。IE0=1、IE1=1,外部中断外部中断0、1有中断请求。有中断请求。当当CPU响应该中断,转向中断服务程序时,响应该中断,转向中断服务程序时,由硬件清由硬件清“0”IE0。2 2、4 4种工作方式种工作方式 方式方式0 0 M1M1、M0M0为为00 00,定时器,定时器/计数器的框图:计数器的框图:方式方式1 1 M1M1、M0M0=01=01,1616位位的计数器的计数器 方式方式2 2 M1M1、M0=M0=1010 计数满后自动装
4、入计数初值计数满后自动装入计数初值 ,等效框图如下:等效框图如下:方式方式2工作过程图工作过程图定时器定时器/计数器的方式计数器的方式2 2工作过程如图工作过程如图6-6-7(X=0,1)7(X=0,1)。省去用户软件中重装初省去用户软件中重装初值的程序,精确的定时。值的程序,精确的定时。图图6-76-7 4 4 方式方式3 3&方式方式3 3中中 T0 T0分成两个的分成两个的8 8位定时器位定时器/计数计数器器:TL0TL0、TH0TH0与与T1T1构成构成3 3个定时器个定时器/计数器。计数器。&方式方式3 3只适用于只适用于 T0T0,不适用于,不适用于T1T1,若若T1T1工工作于方
5、式作于方式3 3时相当于时相当于TR1=0TR1=0,停止计数。停止计数。&方式方式3 3时时T1T1可工作于方式可工作于方式0 0、方式、方式1 1和方式和方式2 2,作波特率发生器(或不需中断的场合)作波特率发生器(或不需中断的场合)1 1)工作方式工作方式3 3下的下的T0T0 T0T0分为两个独立的分为两个独立的8 8位计数器位计数器:TL0TL0、TH0TH0 4 方式方式3T0T0为方式为方式3 3时时 F T1T1可定为方式可定为方式0 0、方式、方式1 1和方式和方式2 2 F 用作串行口的波特率发生器用作串行口的波特率发生器(Baud rate generator),即作为串
6、口数据传送时的时钟信号。F 或不需要中断的场合(因为或不需要中断的场合(因为TF0TF0、TF1TF1 均被均被T0T0占用)。占用)。(1 1)T1T1工作在方式工作在方式0 0 2 2)工作在方式工作在方式3 3下的下的T1T1 (2 2)T1T1工作在方式工作在方式1 1(3 3)T1T1工作在方式工作在方式2 2 INT0INT1T0T1和中断系统的连接P3.4 T0P3.5 T1TR0TR1P3.2 INT0P3.3 INT15.3 5.3 定时器定时器/计数器的编程和应用计数器的编程和应用1 1)、编程步骤:)、编程步骤:(1 1)设置工作方式)设置工作方式(2 2)装入计数)装入
7、计数初值初值(3 3)开中断)开中断(4 4)启动计数)启动计数1、初始化、初始化(1)计数时的初值计算:)计数时的初值计算:X=M(模值)(模值)-要计数的值要计数的值(2)定时时的计数初值计算:)定时时的计数初值计算:X=M(模值)(模值)-定时时间(要计数的时间)定时时间(要计数的时间)/定时脉冲周期定时脉冲周期(每计一次数的时间)每计一次数的时间)*注:定时脉冲周期注:定时脉冲周期=12/fosc 定时、计数的初值计算:定时、计数的初值计算:举例说明计数初值的计算假设系统时钟频率采用假设系统时钟频率采用6 6MHzMHz,要求产生要求产生10ms10ms定时,试定时,试分别计算定时器在
8、方式分别计算定时器在方式0、1、2时的初值。时的初值。X=X=2 21 13 3 10ms10ms(12126Mhz)=2 21 13 3-5000-5000 =3192D=3192D X X=2 28 8 10ms10ms(12126Mhz)=2 28 8 -5000-5000 =-4744=-4744 说明不能采用方式说明不能采用方式2 2产生产生10ms10ms 定定时。时。X=216 10ms(126Mhz)=216-5000 =60536D =0EC78 (1)方式方式0的初值的初值X(2)方式方式1的初值的初值X(3)方式)方式2的初值的初值X 2)、最大定时时间的计算假设系统时钟
9、频率采用假设系统时钟频率采用6 6MHzMHz,试分别计算定试分别计算定时器在方式时器在方式0 0、1 1、2 2时的最大定时时间。时的最大定时时间。分析分析 X=M(模值)(模值)-定时时间定时时间/定时脉冲周期定时脉冲周期,式中式中X=0.即:定时时间即:定时时间max=M定时脉冲周期定时脉冲周期,故:故:(1)方式)方式0的最大定时时间:的最大定时时间:T=2 21 13 3 12126Mhz=16.384msms(2)方式)方式1的最大定时时间:的最大定时时间:T=2 21 16 6 12126Mhz=131.027msms(3)方式)方式2的最大定时时间:的最大定时时间:T=2 28
10、 8 12 126Mhz=512us512us 4 4)、)、初始化编程举例例例5-15-1 T1 T1、方式方式1、定时定时50ms,50ms,软件启动、允许中断(设软件启动、允许中断(设fosc=12MHZ),fosc=12MHZ),编写初始化程序段编写初始化程序段P3.4 T0P3.5 T1TR0TR1P3.2 INT0P3.3 INT11 1、编程步骤:、编程步骤:(1 1)设置工作方式)设置工作方式(2 2)装入计数)装入计数初值初值(3 3)开中断()开中断(位编位编程或字节编程)程或字节编程)(4 4)启动计数)启动计数例例5-25-2 计数器计数器T0T0对对T0T0引脚(引脚
11、(P3.4)P3.4)出现的脉冲计数,每计出现的脉冲计数,每计数数100100个脉冲向个脉冲向CPUCPU中断一次、中断一次、设用软件启动,设用软件启动,编写初始编写初始化程序段。化程序段。P3.4 T0P3.5 T1TR0TR1P3.2 INT0P3.3 INT11 1、编程步骤:、编程步骤:(1 1)设置工作方式)设置工作方式(2 2)装入计数)装入计数初值初值(3 3)开中断()开中断(位编位编程或字节编程)程或字节编程)(4 4)启动计数)启动计数计数时的初值计算:计数时的初值计算:X=M(模值)(模值)-要计数的数值要计数的数值 分配存储空间分配存储空间 主程序主程序 中断服务程序中
12、断服务程序 X X=2 21616 10ms10ms(121212Mhz)=2 21616 -10000-10000 =55536=55536 =0D8F0H=0D8F0H 所以所以:T0T0的初值为的初值为:TH0=D8TH0=D8H H TL0=TL0=F0HF0H 例例5-3(定时):(定时):T0定时,在定时,在P1.7输出输出50HZ(20ms)方波,方波,设晶振频率设晶振频率12MHZ(分别(分别 采用中断采用中断、查询方式编程)、查询方式编程)主程序:主程序:设置工作方式设置工作方式 装入计数初值装入计数初值 开中断开中断 启动计数启动计数 等待中断请求等待中断请求 2、定时、定
13、时/计数应用举例计数应用举例(定时定时/计数举例)计数举例)(1)计算初值计算初值X(2)程序设计(观察下页图)程序设计(观察下页图)ORG 0000H ORG 0000H AJMP AJMP MAIN MAIN ORG 000BHORG 000BH AJMPAJMP IT0PIT0P ORGORG 0100H0100HMAINMAIN:MOV SP,#60HMOV SP,#60H MOV TMOD,#01H MOV TMOD,#01H MOV TL0 MOV TL0,#0F0H,#0F0H MOV TH0MOV TH0,#0D8H,#0D8H SETB SETB TR0 TR0 SETB E
14、T0 SETB ET0 SETB EA SETB EA HERE:AJMP HEREHERE:AJMP HERE ITOP:ITOP:MOV TL0 MOV TL0,#0F0H,#0F0H MOV TH0MOV TH0,#0D8H,#0D8H CPL CPL P1.7P1.7 RETIRETI ENDEND数时间)定时脉冲周期(每次计间)定时总时间(总计数时 2MXP3.4 T0P3.5 T1TR0TR1P3.2 INT0P3.3 INT1TL0 TH0TF0设置设置T0工作方式工作方式装入计数初值装入计数初值开中断开中断启动计数启动计数 000BPC跳转到主程序跳转到主程序0000 0001
15、 跳转到跳转到INT00003跳转到跳转到T1 001B跳转到跳转到T0000B 跳转到跳转到INT10013 串口中断串口中断0023 例例5-4(计数):(计数):计数计数/定时器定时器T1对对T1引脚计数,引脚计数,每计数每计数100个脉冲,个脉冲,在在P1.0输出一个正脉冲输出一个正脉冲。X X=2 28 8 100100 =156 156 =9CH=9CH 主程序:主程序:设置工作方式设置工作方式 装入计数初值装入计数初值 开中断开中断 使使P1.0P1.0输出输出0 0电平电平 启动计数启动计数 等待中断请求等待中断请求 分配存储空间分配存储空间 主程序主程序 中断服务程序中断服务
16、程序(1)计算初值计算初值X(2)程序设计程序设计 ORG 0000H ORG 0000H AJMP AJMP MAIN MAIN ORG ORG 001BH001BH AJMPAJMP IT1PIT1P ORGORG 0100H0100HMAINMAIN:MOV SP,#60HMOV SP,#60H MOV TMOD,#01H MOV TMOD,#01H MOV TL0 MOV TL0,#9CH,#9CH MOV TH0MOV TH0,#9CH,#9CH SETB SETB ET1ET1 SETB EA SETB EA CLR P1.0CLR P1.0 SETB TR1 SETB TR1 H
17、ERE:AJMP HEREHERE:AJMP HERE IT1PIT1P:SETB P1.0SETB P1.0 NOPNOP NOPNOP CLR P1.0CLR P1.0 RETIRETI END END (2)程序设计程序设计(1)计算初值计算初值X 分配存储空间分配存储空间 主程序主程序 中断服务程序中断服务程序 ORG 0000H LJMP MAIN ORG 000BH LJMP DVT0 ORG 0030H 主程序:主程序:设置工作方式设置工作方式 装入计数初值装入计数初值 开中断开中断 设置中断次数设置中断次数 使使P1P1口口D0D0灯亮灯亮 启动计数启动计数 等待中断请求等待中
18、断请求 MAIN:MOV SP,#60H MOV TMOD,#01H MOV TH0,#9EH MOV TL0,#58HSETB ET0 SETB EA R2,#20H MOV A,#0FEHMOV P1,ASETB TR0 SJMP$DVT0:DJNZ R2,RTN RL AMOV P1,A MOV R2,#20RTN:MOV TH0,#9EH MOV TL0,#58HRETI END 设置工作方式设置工作方式 装入计数初值装入计数初值开中断开中断 启动计数启动计数 (2)程序设计程序设计(1)计算初值计算初值X=0000H 分配存储空间分配存储空间 主程序主程序 T0P3.4INT0 TF
19、1主程序:主程序:设置工作方式设置工作方式 装入计数初值装入计数初值开中断开中断(无需开中断)(无需开中断)设置存储脉冲宽度的地址指针设置存储脉冲宽度的地址指针 等待等待INT0INT0变低变低 开启开启TR0(TR0(并未启动计数)并未启动计数)INT0 INT0一旦变高,则启动计数一旦变高,则启动计数 INT0 INT0一旦变低,则停止计数一旦变低,则停止计数 INTO=0 INTO=0则将计数器则将计数器TL0TH0TL0TH0存于指定存储单元存于指定存储单元查询查询INT0=0实例 设89C51单片机的工作频率为6Mhz,利用T0中断扩展方式产生1s定时,当1s定时到,从P1.0输出低
20、电平点亮发光二极管,每产生一次中断,P1.7取反一次。电路图12MHzC230pC130pXTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/T
21、XD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115U18051R2220C322uR11k+5VR3220程序 ORG 0000H ;复位入口LJMPMAIN ;转到主程序ORG 000BH ;T0中断入口LJMPTT0 ;转到T0中断服务程序ORG 0030H ;主程序入口MAIN:MOV SP,#60H ;设置堆栈指针MOV 20H,#0AH ;设置中断次数MOV TMOD,#01H ;设置T0工作方式MOV TH0,#3CH ;装入T0初值MOV TL0,#0B0HSETB TR0 ;启动T0 SETB EA ;开中断SETB ET0 ;允许T0中断SJMP$;等待中断TT0:MOV TH0,#3CH ;重装T0初值MOV TL0,#0B0HDJNZ 20h,LOOP ;中断次数未到 CLR TR0 ;1s定时时间到,停止T0CLR P1.0 ;从P1.0输出高电平LOOP:CPL P1.7 RETI ;中断返回ENDprojectP98-99:12356