第7章定时器计数器

上传人:M****1 文档编号:586602106 上传时间:2024-09-05 格式:PPT 页数:110 大小:1.40MB
返回 下载 相关 举报
第7章定时器计数器_第1页
第1页 / 共110页
第7章定时器计数器_第2页
第2页 / 共110页
第7章定时器计数器_第3页
第3页 / 共110页
第7章定时器计数器_第4页
第4页 / 共110页
第7章定时器计数器_第5页
第5页 / 共110页
点击查看更多>>
资源描述

《第7章定时器计数器》由会员分享,可在线阅读,更多相关《第7章定时器计数器(110页珍藏版)》请在金锄头文库上搜索。

1、第第7章章定时器定时器/计数器的工计数器的工作原理及应用作原理及应用17.1定时器定时器/计数器的结构计数器的结构 AT89S51定时器定时器/计数器结构计数器结构见见图图7-1,定时器,定时器/计数器计数器T0由特殊功能寄由特殊功能寄存器存器TH0、TL0构成,构成,T1由特殊功能寄存器由特殊功能寄存器TH1、TL1构成。构成。2图图7-1定时器定时器/计数器结构框图计数器结构框图T0、T1都有都有定时器定时器和和计数器计数器两种工作模式两种工作模式,两种两种模式实质都是对脉冲信模式实质都是对脉冲信号进行计数,只不过计数信号来源不同。号进行计数,只不过计数信号来源不同。 计数器模式计数器模式

2、是对加在是对加在T0(P3.4)和和T1(P3.5)两个引脚上的外部脉冲两个引脚上的外部脉冲进行计数(见图进行计数(见图7-1);); 定时器模式定时器模式是对系统时钟信号经是对系统时钟信号经12分频后的内部脉冲信号(机器周期)分频后的内部脉冲信号(机器周期)计数。由于系统时钟频率是定值,可根据计数值计算出定时时间。两个定时计数。由于系统时钟频率是定值,可根据计数值计算出定时时间。两个定时器器/计数器属于计数器属于增增1计数器计数器,即每计一个脉冲,计数器增,即每计一个脉冲,计数器增1。T0、T1具有具有4种工作方式种工作方式(方式(方式0、1、2和和3)。)。 3 图图7-1特殊功能寄存器特

3、殊功能寄存器TMOD用于选择定时器用于选择定时器/计数器计数器T0、T1的工作模的工作模式和工作方式。特殊功能寄存器式和工作方式。特殊功能寄存器TCON用于控制用于控制T0、T1的启动和停止计数,的启动和停止计数,同时包含了同时包含了T0、T1状态。状态。 计数器起始计数从初值开始。单片机计数器起始计数从初值开始。单片机复位复位时计数器初值为时计数器初值为0,也可给计,也可给计数器装入数器装入1个新的初值。个新的初值。7.1.1工作方式控制寄存器工作方式控制寄存器TMODTMOD用于选择定时器用于选择定时器/计数器的工作模式和工作方式,字节地址为计数器的工作模式和工作方式,字节地址为89H,不

4、能位寻址,格式,不能位寻址,格式见见图图7-2。4 8位分两组,位分两组,高高4位位控制控制T1,低低4位位控制控制T0。TMOD各位说明各位说明如下如下。(1)GATE门控位门控位GATE=0,定时器是否计数,由控制位,定时器是否计数,由控制位TRx(x=0,1)来控制。)来控制。5图图7-2寄存器寄存器TMOD格式格式GATE=1,定时器是否计数,由外中断引脚,定时器是否计数,由外中断引脚I INTx*上的电平与运行控制上的电平与运行控制位位TRx共同控制。共同控制。(2)M1、M0工作方式选择位工作方式选择位M1、M04种编码,对应于种编码,对应于4种工作方式种工作方式的选择,的选择,见

5、见表表7-1。表表7-1M1、M0工作方式选择工作方式选择6(3)C/T*计数器模式和定时器计数器模式和定时器模式选择位模式选择位C/T*=0,定时器模式,对系统时钟,定时器模式,对系统时钟12分频后的脉冲进行计数。分频后的脉冲进行计数。C/T*=1,计数器模式,计数器对外部输入引脚,计数器模式,计数器对外部输入引脚T0(P3.4)或)或T1(P3.5)的外部脉冲(负跳变)计数。)的外部脉冲(负跳变)计数。7.1.2定时器定时器/计数器控制寄存器计数器控制寄存器TCONTCON字节地址字节地址88H,位地址为,位地址为88H8FH。格式。格式见见图图7-3。 7图图7-3TCON格式格式第第6

6、章已介绍与外中断有关的低章已介绍与外中断有关的低4位。这里仅介绍高位。这里仅介绍高4位功能。位功能。(1)TF1、TF0计数溢出标志位计数溢出标志位 当计数器计数溢出时,该位置当计数器计数溢出时,该位置“1”。使用查询方式时,此位可供。使用查询方式时,此位可供CPU查询,但应注意查询后,用软件及时将该位清查询,但应注意查询后,用软件及时将该位清“0”。使用中断方式时,。使用中断方式时,作为中断请求标志位,进入中断服务程序后由硬件自动清作为中断请求标志位,进入中断服务程序后由硬件自动清“0”。(2)TR1、TR0计数运行控制位计数运行控制位TR1位(或位(或TR0)=1,启动计数器计数的必要条件

7、。,启动计数器计数的必要条件。TR1位(或位(或TR0)=0,停止计数器计数。,停止计数器计数。该位可由软件置该位可由软件置“1”或清或清“0”。897.2定时器定时器/计数器的计数器的4种工作方式种工作方式4种工作方式,分别介绍如下。种工作方式,分别介绍如下。7.2.1方式方式0 当当M1、M0= =00,设置为方式,设置为方式0,定时器,定时器/计数器等效逻辑结构计数器等效逻辑结构见见图图7-4(以(以T1为例,为例,TMOD.5、TMOD.4=00)。)。10图图7-4定时器定时器/计数器方式计数器方式0的逻辑结构框图的逻辑结构框图 方式方式0为为1313位计数器位计数器,由,由TLx(

8、x=0,1)的低)的低5位和位和THx的高的高8位构位构成。成。TLx低低5位溢出则向位溢出则向THx进位,进位,THx计数溢出则把计数溢出则把TCON中的溢出标志中的溢出标志位位TFx置置“1”。 图图7-2中,中,C/T*位控制电子开关决定位控制电子开关决定2种工作模式。种工作模式。 (1)C/T*=0,电子开关打在上面,电子开关打在上面,T1(或(或T0)为定时器工作模式,)为定时器工作模式,系统时钟系统时钟12分频后的脉冲作为计数信号。分频后的脉冲作为计数信号。 (2)C/T*=1,电子开关打在下面,电子开关打在下面,T1(或(或T0)为计数器工作模式,)为计数器工作模式,对对P3.5

9、(或(或P3.4)引脚上的外部输入脉冲计数,当引脚上发生负跳变时,)引脚上的外部输入脉冲计数,当引脚上发生负跳变时,计数器加计数器加1。GATE位状态决定定时器位状态决定定时器/计数器运行控制取决于计数器运行控制取决于TRx一个条件,还是一个条件,还是取决于取决于TRx和和I INTx*引脚状态两个条件。引脚状态两个条件。11(1) GATE=0时,时,A点(见图点(见图7-4)电位恒为)电位恒为1,B点电位仅取决于点电位仅取决于TRx状态。状态。TRx=1,B点为高电平,控制端控制电子开关闭合,允许点为高电平,控制端控制电子开关闭合,允许T1(或(或T0)对脉冲计数。)对脉冲计数。TRx=0

10、,B点为低电平,电子开关断开,禁止点为低电平,电子开关断开,禁止T1(或(或T0)计数。)计数。(2) GATE=1时,时,B点电位由点电位由I INTx*(x=0,1)的电平和)的电平和TRx的状态的状态两个条件来确定。当两个条件来确定。当TRx=1,且,且I INTx*=1时,时,B点才为点才为1,电子开关闭合,电子开关闭合,允许允许T1(或(或T0)计数。故这种情况下计数器是否计数是由)计数。故这种情况下计数器是否计数是由TRx和和I INTx*两个两个条件来共同控制的。条件来共同控制的。7.2.2方式方式1 当当M1、M0= =01时,工作于方式时,工作于方式1,等效电路逻辑结构,等效

11、电路逻辑结构见见图图7-5。1213图图7-5方式方式1的逻辑结构框图的逻辑结构框图方式方式1和方式和方式0差别仅仅在于计数器的位数不同,方式差别仅仅在于计数器的位数不同,方式1为为16位位计数器,由计数器,由THx高高8位和位和TLx低低8位构成(位构成(x=0,1),方式),方式0则为则为13位计数器,有关控制状态位含义(位计数器,有关控制状态位含义(GATE、C/T*、TFx、TRx)与方式与方式0相同。相同。7.2.3 方式方式2 方式方式0和方式和方式1最大特点是计数溢出后,计数器为全最大特点是计数溢出后,计数器为全0。因此在循环定时。因此在循环定时或循环计数应用时就存在用指令反复装

12、入计数初值的问题,这会影响定时精或循环计数应用时就存在用指令反复装入计数初值的问题,这会影响定时精度,方式度,方式2就是为解决此问题而设置的。就是为解决此问题而设置的。 当当M1、M0=10时,工作方式时,工作方式2,等效逻辑结构,等效逻辑结构见见图图7-6(以(以T1为例,为例,x=1)。)。 工作方式工作方式2为为自动恢复初值(初值自动装入)自动恢复初值(初值自动装入)的的8位定时器位定时器/计数器,计数器,TLx(x=0,1)作为常数缓冲器,当)作为常数缓冲器,当TLx计数溢出时,在溢出标志计数溢出时,在溢出标志TFx置置“1”的同时,还自动将的同时,还自动将THx中的初值送至中的初值送

13、至TLx,使,使TLx从初值开始重新计从初值开始重新计数。定时器数。定时器/计数器方式计数器方式2工作过程工作过程见见图图7-7。1415图图7-67-6方式方式2逻辑结构框图逻辑结构框图16图图7-7方式方式2工作过程工作过程方式方式2可省去用户软件中重装初值的指令执行时间,简化定时初可省去用户软件中重装初值的指令执行时间,简化定时初值的计算方法,可相当精确地定时。值的计算方法,可相当精确地定时。177.2.4方式方式3 方式方式3是为增加一个附加的是为增加一个附加的8位定时器位定时器/计数器而设置的,从而使计数器而设置的,从而使AT89S51具有具有3个定时器个定时器/计数器。计数器。方式

14、方式3只适用于只适用于T0,T1不能工作在方不能工作在方式式3。T1方式方式3时相当于时相当于TR1=0,停止计数(此时,停止计数(此时T1可作为串口波特率可作为串口波特率产生器)。产生器)。1工作方式工作方式3下的下的T0 当当TMOD的低的低2位为位为11时,时,T0被选为方式被选为方式3,各引脚与,各引脚与T0的逻辑关的逻辑关系系见见图图7-8。T0分为两个独立的分为两个独立的8位计数器位计数器TL0和和TH0,TL0使用使用T0的状态控制位的状态控制位C/T*、GATE、TR0,而,而TH0被固定为一个被固定为一个8位定时器(不能作为外部计位定时器(不能作为外部计数模式),并使用定时器

15、数模式),并使用定时器T1的状态控制位的状态控制位TR1,同时占用定时器,同时占用定时器T1的中的中断请求源断请求源TF1。182T0工作在方式工作在方式3时时T1的各种工作方式的各种工作方式 一般情况下,当一般情况下,当T1用作串口波特率发生器时,用作串口波特率发生器时,T0才工作在方式才工作在方式3。T0方式方式3时,时,T1可为方式可为方式0、1、2,作为串口波特率发生器,或不需要,作为串口波特率发生器,或不需要中断的场合。中断的场合。19图图7-8T0方式方式3的逻辑结构框图的逻辑结构框图20(1)T1工作在方式工作在方式0T1的控制字中的控制字中M1、M0=00时,时,T1工作在方式

16、工作在方式0,工作示意图如,工作示意图如图图7-9所示。所示。(2)T1工作在方式工作在方式1 当当T1的控制字中的控制字中M1、M0=01时,时,T1工作在方式工作在方式1,工作示意,工作示意见见图图7-10。21图图7-9T0方式方式3时时T1为方式为方式0工作示意图工作示意图(3)T1工作在方式工作在方式2 当当T1控制字中控制字中M1、M0=10时,时,T1为方式为方式2,工作示意如,工作示意如图图7-11所示。所示。22图图7-10T0方式方式3时时T1为方式为方式1工作示意图工作示意图图图7-11T0方式方式3时时T1为方式为方式2工作示意图工作示意图(4)T1设置在方式设置在方式

17、3T0方式方式3时,再把时,再把T1也设置成方式也设置成方式3,此时,此时T1停止计数。停止计数。237.3对外部输入的计数信号的要求对外部输入的计数信号的要求 计数器模式时,计数脉冲来自外部输入引脚计数器模式时,计数脉冲来自外部输入引脚T0或或T1。当输入信号产。当输入信号产生负跳变时,计数值增生负跳变时,计数值增1。每个机器周期。每个机器周期S5P2期间,都对外部输入引脚期间,都对外部输入引脚T0或或T1进行采样。如在第进行采样。如在第1个机器周期中采得值为个机器周期中采得值为1,而在下一个机器周期中,而在下一个机器周期中采得的值为采得的值为0,则在紧跟着的再下一个机器周期,则在紧跟着的再

18、下一个机器周期S3P1期间,计数器加期间,计数器加1。 由于确认一次负跳变要花由于确认一次负跳变要花2个个机器周期,即机器周期,即24个振荡周期,因此外部个振荡周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率输入的计数脉冲的最高频率为系统振荡器频率1/24。 24 如选用如选用6MHz晶体晶体,允许输入脉冲频率最高为,允许输入脉冲频率最高为250kHz。如选用。如选用12MHz频率晶体,则可输入最高频率频率晶体,则可输入最高频率500kHz外部脉冲。对外输入信号占空比没有外部脉冲。对外输入信号占空比没有限制,但为确保某一给定电平在变化前能被采样限制,但为确保某一给定电平在变化前能被采样1

19、次,则次,则该该电平至少保持电平至少保持1个个机器周期机器周期。故对外部输入信号要求。故对外部输入信号要求见见图图7-12,图中,图中Tcy为机器周期。为机器周期。图图7-12对外部计数输入信号的要求对外部计数输入信号的要求2526277.4 定时器定时器/计数器的编程和应用计数器的编程和应用 4种工作方式中,方式种工作方式中,方式0与方式与方式1基本相同,只是计数位数不同。方式基本相同,只是计数位数不同。方式0为为13位,方式位,方式1为为16位。由于方式位。由于方式0是为兼容是为兼容MCS-48而设,计数初值计而设,计数初值计算复杂,所以在实际应用中,一般不用方式算复杂,所以在实际应用中,

20、一般不用方式0,常采用方式,常采用方式1。7.4.1 P1口控制口控制8只只LED每每0.5s闪亮一次闪亮一次 【例【例7-1】在在AT89S51的的P1口上接有口上接有8只只LED,原理电路见,原理电路见图图7-13。采用采用T0方式方式1的定时中断方式,使的定时中断方式,使P1口外接的口外接的8只只LED每每0.5s闪亮一次闪亮一次。28图图7-13方式方式1定时中断控制定时中断控制LED闪亮闪亮(1)设置)设置TMOD寄存器寄存器T0工作在方式工作在方式1,应使,应使TMOD寄存器的寄存器的M1、M0=01;应设置;应设置C/T*=0,为定,为定时器模式;对时器模式;对T0的的运行控制仅

21、由运行控制仅由TR0来控制来控制,应使相应的,应使相应的GATE位为位为0。定时。定时器器T1不使用,各相关位均设为不使用,各相关位均设为0。所以,。所以,TMOD寄存器应初始化为寄存器应初始化为0x01。(2)计算)计算T0的计数初值的计数初值 设定时时间设定时时间5ms(即(即5000s),设),设T0计数计数初值为初值为X,假设晶振的频率,假设晶振的频率为为11.0592MHz,则定时时间为:,则定时时间为: 29 定时时间定时时间=(216X)12/晶振频率晶振频率 则则5000=(216X)12/11.0592 得得X=60928 转换成十六进制转换成十六进制:0xee00,其中,其

22、中0xee装入装入TH0,0x00装入装入TL0。(3)设置)设置IE寄存器寄存器 本例由于采用定时器本例由于采用定时器T0中断,因此需将中断,因此需将IE寄存器中的寄存器中的EA、ET0位置位置1。30(4)启动和停止定时器)启动和停止定时器T0 将定时器控制寄存器将定时器控制寄存器TCON中的中的TR0=1,则启动定时器,则启动定时器T0;TR0=0,则,则停止定时器停止定时器T0定时。定时。参考程序:参考程序:#includechari=100;voidmain()TMOD=0x01;/定时器定时器T0为为方式方式1TH0=0xee;/设置定时器初值设置定时器初值TL0=0x00;31P

23、1=0x00;/P1口口8个个LED点亮点亮EA=1;/总中断开总中断开ET0=1;/开开T0中断中断TR0=1;/启动启动T0while(1);/循环等待循环等待;voidtimer0()interrupt1/T0中断程序中断程序TH0=0xee;/重新赋初值重新赋初值TL0=0x00;32i-;/循环次数减循环次数减1 1if(i=0)P1=P1;/P1口按位取反口按位取反i=100;/重置循环次数重置循环次数33347.4.2计数器的应用计数器的应用 【例【例7-2】如如图图7-14,T1采用计数模式,方式采用计数模式,方式1中断,计数输入引脚中断,计数输入引脚T1(P3.5)上外接按钮

24、开关,作为计数信号输入。)上外接按钮开关,作为计数信号输入。按按4次按钮开关后次按钮开关后,P1口口的的8只只LED闪烁不停闪烁不停。(1)设置)设置TMOD寄存器寄存器T1工作在工作在方式方式1,应使,应使TMOD的的M1、M0=01;设置;设置C/T*=1,为,为计数器模计数器模式式;对;对T0运行控制仅由运行控制仅由TR0来控制,应使来控制,应使GATE0=0。定时器。定时器T0不使用,各相不使用,各相关位均设为关位均设为0。所以,。所以,TMOD寄存器应初始化为寄存器应初始化为0x50。35(2)计算定时器)计算定时器T1的计数初值的计数初值 由于每按由于每按1次按钮开关,计数次按钮开

25、关,计数1次,次,按按4次后,次后,P1口口的的8只只LED闪烁不闪烁不停停。因此。因此计数器初值计数器初值为为655364=65532,将其转换成十六进制后为,将其转换成十六进制后为0xfffc,所以,所以,TH0=0xff,TL0=0xfc。36图图7-14由外部计数输入信号控制由外部计数输入信号控制LED的闪烁的闪烁37(3)设置)设置IE寄存器寄存器 本例由于采用本例由于采用T1中断,因此需将中断,因此需将IE寄存器的寄存器的EA、ET1位置位置1。(4)启动和停止定时器)启动和停止定时器T1 将寄存器将寄存器TCON中中TR1=1,则启动,则启动T1计数;计数;TR1=0,则停止,则

26、停止T1计数。计数。参考程序如下:参考程序如下:#includevoidDelay(unsignedinti)/定义定义延时函数延时函数Delay(),i是形是形/式参数,不能赋初值式参数,不能赋初值38unsignedintj;for(;i0;i-)/变量变量i由实际参数传入一个值由实际参数传入一个值/因此因此i不能赋初值不能赋初值for(j=0;j125;j+);/空函数空函数voidmain()/主函数主函数TMOD=0x50;/设置定时器设置定时器T1为方式为方式1计数计数TH1=0xff;/向向TH1写入写入初值的初值的高高8位位TL1=0xfc;/向向TL1写入写入初值的初值的低低

27、8位位EA=1;/总中断允许总中断允许3940ET1=1;/定时器定时器T1中断允许中断允许TR1=1;/启动定时器启动定时器T1while(1);/无穷循环,等待计数中断无穷循环,等待计数中断voidT1_int(void)interrupt3/T1中断函数中断函数for(;)/无限循环无限循环P1=0xff;/8位位LED全灭全灭Delay(500);/延时延时500msP1=0;/8位位LED全亮全亮Delay(500);/延时延时500ms41427.4.3控制控制P1.0产生周期为产生周期为2ms的方波的方波 【例【例7-37-3】假设系统时钟为假设系统时钟为12MHz12MHz,设

28、计电路并编写程序实现从,设计电路并编写程序实现从P1.0P1.0引引脚上输出一个脚上输出一个周期为周期为2ms2ms的方波的方波,见见图图7-157-15。 要在要在P1.0P1.0上产生上产生周期为周期为2ms2ms的的方波方波,定时器应产生定时器应产生1ms1ms的定时中断的定时中断,定时时间到则在中断服务程序中定时时间到则在中断服务程序中对对P1.0P1.0求求反反。使用定时器。使用定时器T0T0,方式,方式1 1定时定时中断,中断,GATEGATE不起作用。不起作用。 本例的原理电路本例的原理电路见见图图7-167-16。其中在其中在P1.0P1.0引脚接有引脚接有虚拟示波器虚拟示波器

29、,用来,用来观察产生的周期观察产生的周期2ms2ms的方波。的方波。图图7-15定时器控制定时器控制P1.0输出一个周期输出一个周期2ms方波方波4344图图7-16定时器控制定时器控制P1.0输出周期输出周期2ms的方波的原理电路的方波的原理电路45下面来下面来计算计算T0T0初值初值X X :设设T0T0的初值为的初值为X X,有,有 (2(21616X X ) )1 110106 6=1=110103 3即即 65 65536536X X=1=1000000 得得X X=64 536=64 536,化为,化为1616进制数就是进制数就是0xfc180xfc18。将。将高高8 8位位0xf

30、c0xfc装入装入TH0TH0,低低8 8位位0x180x18装入装入TL0TL0。参考程序如下:参考程序如下:#include #include /头文件头文件reg51.hreg51.hsbitsbit P1_0=P10; P1_0=P10;/定义特殊功能寄存器定义特殊功能寄存器P1P1的位变量的位变量P1_0P1_0void void main(voidmain(void) )/主程序主程序 TMOD=0x01;TMOD=0x01;/设置设置T0T0为方式为方式1 1TR0=1;TR0=1;/接通接通T0T0while(1)while(1)/无限循环无限循环 46 TH0=0xfc;TH

31、0=0xfc;/置置T0T0高高8 8位初值位初值TL0=0x18;TL0=0x18;/置置T0T0低低8 8位初值位初值dowhile(!TF0);dowhile(!TF0); / /TF0TF0为为0 0原地循环原地循环,为为1 1则则T0T0溢出,往下执溢出,往下执行行P1_0=!P1_0;P1_0=!P1_0;/ P1.0/ P1.0状态求反状态求反TF0=0;TF0=0;/TF0/TF0标志清零标志清零 仿真时,右键单击虚拟数字示波器,出现下拉菜单,点击仿真时,右键单击虚拟数字示波器,出现下拉菜单,点击“Digital oscilloscopeDigital oscilloscope

32、”选项,就会在数字示波器上显示选项,就会在数字示波器上显示P1.0P1.0引脚输引脚输出出周期为周期为2ms2ms方波方波,如如图图7-177-17所示。所示。47图7-17 虚拟数字示波器显示的2ms的方波波形487.4.4利用利用T1控制发出控制发出1kHz的音频信号的音频信号 【例【例7-4】利用利用T1的中断控制的中断控制P1.7引脚引脚输出频率为输出频率为1kHz方波音频信号,方波音频信号,驱动蜂鸣器发声。系统时钟为驱动蜂鸣器发声。系统时钟为12MHz。方波音频信号周期方波音频信号周期1ms,因此,因此T1的的定时中断时间为定时中断时间为0.5ms,进入中断服务程序后,对,进入中断服

33、务程序后,对P1.7求反。电路求反。电路见见图图7-18。 先计算先计算T1初值,系统时钟为初值,系统时钟为12MHz,则,则机器机器周期周期为为1s。1kHz音频信音频信号周期为号周期为1ms,要定时计数的,要定时计数的脉冲数为脉冲数为a。则。则T1初值初值: TH1=(65536a)/256;TL1=(65536a)%2564950图图7-18控制蜂鸣器发出控制蜂鸣器发出1kHz的音频信号的音频信号参考程序如下:参考程序如下:#include #include /包含头文件包含头文件sbitsbit sound=P17; sound=P17; /将将soundsound位定义为位定义为P1

34、.7P1.7脚脚#define #define f1(a)f1(a) (65536-a)/256(65536-a)/256/定义装入定义装入定时器高定时器高8 8位时间常数位时间常数#define #define f2(a)f2(a) (65536-a)%256(65536-a)%256 /定义装入定义装入定时器低定时器低8 8位时间常数位时间常数unsigned unsigned intint i=500; i=500; unsigned unsigned intint j=0; j=0; void void main(voidmain(void) ) EA=1; EA=1; /开总中断开总

35、中断. . ET1=1; ET1=1; /允许定时器允许定时器T1T1中断中断 . . TMOD=0x10; TMOD=0x10; /TMOD=0001 000B/TMOD=0001 000B,使用,使用T1T1的方式的方式1 1定时定时 TH1=f1(i);TH1=f1(i); /给给T1T1高高8 8位赋初值位赋初值. . TL1=f2(i);TL1=f2(i); /给给T1T1低低8 8位赋初值位赋初值. . TR1=1; TR1=1; /启动启动T1T1 while(1) while(1) 5152 /循环等待循环等待 i=460; i=460; while(jwhile(j2000)

36、;2000); j=0;j=0; i=360; i=360; while(jwhile(j2000);2000); j=0;j=0; void T1(void) interrupt 3 using 0void T1(void) interrupt 3 using 0/定时器定时器T1T1中断函数中断函数 TR1= 0; TR1= 0; /关闭关闭T1T1 sound=sound=soundsound; ; /P1.7P1.7输出求反输出求反 TH1TH1=f1(i); =f1(i); /T1/T1的高的高8 8位重新赋初值位重新赋初值. . TL1TL1=f2(i); =f2(i); /T1/

37、T1的低的低8 8位重新赋初值位重新赋初值. .j+;TR1=1;/启启动定定时器器T1537.4.5LED数码管秒表的制作数码管秒表的制作 【例【例7-57-5】用用2 2位数码管显示计时时间,最小计时单位为位数码管显示计时时间,最小计时单位为“百毫秒百毫秒”,计时范围计时范围0.10.19.9s9.9s。当。当第第1 1次次按一下计时功能键时,秒表开始计按一下计时功能键时,秒表开始计时并显示;时并显示;第第2 2次次按一下计时功能键时,停止计时,将计时的时间值送按一下计时功能键时,停止计时,将计时的时间值送到数码管显示;如果计时到到数码管显示;如果计时到9.9s9.9s,将重新开始从,将重

38、新开始从0 0计时;第计时;第3 3次按一下次按一下计时功能键,秒表清计时功能键,秒表清0 0。再次按一下计时功能键,则重复上述计时过程。再次按一下计时功能键,则重复上述计时过程。 本秒表应用定时器模式,本秒表应用定时器模式,计时范围计时范围0.10.19.9s9.9s。此外还涉及如何。此外还涉及如何编写控制编写控制LEDLED数码管显示的程序。数码管显示的程序。 原理电路原理电路见见图图7-197-19。5455图图7-19LED数码管显示的秒表原理电路及仿真数码管显示的秒表原理电路及仿真56参考程序如下:参考程序如下:#include #include /头文件头文件unsigned ch

39、ar code unsigned char code discode1= discode1= 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef;0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef; /数码管显示数码管显示0 09 9的段码表的段码表, , 带带小数点小数点unsigned char code unsigned char code discode2=discode2=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;0x3f,0x06

40、,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /数码管显示数码管显示0 09 9的段码表,不的段码表,不带小数点带小数点unsigned char unsigned char timertimer=0;=0;/timertimer记录中断次数记录中断次数unsigned char unsigned char secondsecond; ; /secondsecond储存秒储存秒unsigned char unsigned char keykey=0;=0;/keykey记录按键次数记录按键次数main()main()/主函数主函数 TMODTMOD=0x0

41、1;=0x01;/定时器定时器T0T0方式方式1 1定时定时 ET0ET0=1; =1; /允许定时器允许定时器T0T0中断中断57EA=1; EA=1; /总中断允许总中断允许second=0; second=0; /设初始值设初始值P0=discode1second/10;P0=discode1second/10; /显示显示秒位秒位0 0P2=discode2second%10; P2=discode2second%10; /显示显示0.1s0.1s位位0 0while(1)while(1) / /循环循环 if(if(P3&0x80P3&0x80)=0x00)=0x00)/当按键被按下

42、时当按键被按下时 key+;key+;/按键次数加按键次数加1 1switch(keyswitch(key) )/根据按键次数分三种情况根据按键次数分三种情况 case case 1 1: :/第一次按下第一次按下为启动秒表计时为启动秒表计时TH0=0xee; TH0=0xee; /向向TH0TH0写入初值的高写入初值的高8 8位位58TL0=0x00;TL0=0x00; /向向TL0TL0写入初值的低写入初值的低8 8位,定时位,定时5ms5msTR0=1; TR0=1; /启动定时器启动定时器T0T0break;break;case case 2 2: : /按下两次暂定秒表按下两次暂定秒

43、表TR0=0; TR0=0; /关闭定时器关闭定时器T0T0break;break;case case 3 3: : /按下按下3 3次秒表清次秒表清0 0key=0; key=0; /按键次数清按键次数清second=0; second=0; /秒表清秒表清0 0P0=discode1second/10;P0=discode1second/10; /显示秒位显示秒位0 0 P2=discode2second%10;P2=discode2second%10; /显示显示0.1s0.1s位位0 0break;break; while(P3&0x80)=0x00); while(P3&0x80)=

44、0x00); /如果按键时间过长在此循环如果按键时间过长在此循环 void int_T0() interrupt 1 using 0 void int_T0() interrupt 1 using 0 /定时器定时器T0T0中断函数中断函数 TR0=0;TR0=0; /停止计时,执行以下操作(会带来计时误差)停止计时,执行以下操作(会带来计时误差)TH0=0xeeTH0=0xee; ; /向向TH0TH0写入初值的高写入初值的高8 8位位TL0=0x00TL0=0x00; ; /向向TL0TL0写入初值的低写入初值的低8 8位,位,定时定时5ms5mstimer+; timer+; /记录中断

45、次数记录中断次数if (timer=20)if (timer=20) /中断中断2020次次,共计时,共计时20*5ms=100ms20*5ms=100ms= =0.1s0.1s timer=0; timer=0; /中断次数清中断次数清0 0second+; second+; /加加0.1s0.1sP0P0=discode1=discode1second/10second/10; ; /根据计时,即时显示秒位根据计时,即时显示秒位P2P2=discode2=discode2secondsecond% %1010; ; /根据计时,即时显示根据计时,即时显示0.1s0.1s位位 5960if(

46、second=99)/当计时到当计时到9.9s时时TR0=0;/停止计时停止计时second=0;/秒数清秒数清0key=2; /按键数置按键数置2,当再次按下按键时,当再次按下按键时,/key+,即即key=3,秒表清,秒表清0复原复原else/计时不到计时不到9.9s时时TR0=1;/启动定时器继续计时启动定时器继续计时617.4.6测量脉冲宽度测量脉冲宽度门控位门控位GATEx的应用的应用 介绍门控位介绍门控位GATE应用。应用。利用利用GATE测量测量I INT1*脚上脚上正脉冲宽度正脉冲宽度。 【例【例7-6】门控位门控位GATE1可使可使T1启动计数受启动计数受I INT1*控制,

47、当控制,当GATE1=1, ,TR1=1时时, ,只有只有I INT1*引脚输入高电平时引脚输入高电平时, ,T1才被允许计数。利用才被允许计数。利用该该功能,可测量功能,可测量I INT1*脚正脉冲宽度,方法脚正脉冲宽度,方法见见图图7-20。 原理电路原理电路见见图图7-21,图中省略复位电路和时钟电路。利用门控位,图中省略复位电路和时钟电路。利用门控位GATE1来测量来测量I INT1*脚上正脉冲宽度脚上正脉冲宽度, ,并在并在6位数码管上以机器周期数显示。对被测量位数码管上以机器周期数显示。对被测量脉冲信号宽度脉冲信号宽度, ,要求能通过旋转信号源旋钮可调。要求能通过旋转信号源旋钮可调

48、。62图图7-20利用利用GATE位测量正脉冲的宽度位测量正脉冲的宽度6364图图7-21利用利用GATE位测量位测量INT1*引脚上正脉冲的宽度的原理电路引脚上正脉冲的宽度的原理电路参考程序如下:#include#include#define #define uintuint unsigned unsigned intint#define #define ucharuchar unsigned char unsigned charsbitsbit P3_3=P33; P3_3=P33;/位变量定义位变量定义ucharuchar count_highcount_high; ; /定义计数变量,

49、用来读取定义计数变量,用来读取TH0TH0ucharuchar count_lowcount_low; ;/定义计数变量,用来读取定义计数变量,用来读取TL0TL0uintuint num; num;ucharuchar shiwanshiwan, wan, , wan, qianqian, , baibai, shi, , shi, gege; ;ucharuchar flag; flag;ucharuchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; code table=0x3f,0x06,0x5b,0x4

50、f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /共阴极数码管段码表共阴极数码管段码表void void delay(uintdelay(uint z) z)/延时函数延时函数uintx,y;for(x=z;x0;x-)65for(y=110;y0;y-);voiddisplay(uinta,uintb,uintc,uintd,uinte,uintf)/显示函数显示函数P2=0xfe;P0=tablef;delay(2);P2=0xfd;P0=tablee;delay(2);P2=0xfb;P0=tabled;66delay(2);P2=0xf7;P0=tablec;dela

51、y(2);P2=0xef;P0=tableb;delay(2);P2=0xdf;P0=tablea;delay(2);voidread_count()/读取计数寄存器内容读取计数寄存器内容函数函数6768docount_high=TH1;/读高字节读高字节count_low=TL1;/读低字节读低字节while(count_high!=TH1);num=count_high*256+count_low;/*可将两字节的机器周期数进行显示处理可将两字节的机器周期数进行显示处理* */ /voidmain()while(1)flag=0;TMOD=0x90;/设置定时器设置定时器T1T1为方式为方

52、式1 1定时定时TH1=0;/向定时器向定时器T1写入计数初值写入计数初值TL1=0;while(P3_3=1);/等待等待I INT1*变低变低TR1=1;/如果如果I INT1*为低,启动为低,启动T1(未真正开始计数)(未真正开始计数)while(P3_3=0);/等待等待I INT1*变高,变高后变高,变高后T1真正开始计数真正开始计数while(P3_3=1);/等待等待I INT1*变低,变低后变低,变低后T1停止计数停止计数TR1=0;read_count();/读计数寄存器内容的函数读计数寄存器内容的函数shiwan=num/100000;wan=num%100000/1000

53、0;qian=num%10000/1000;bai=num%1000/100;shi=num%100/10;69ge=num%10;while(flag!=100)/减小刷新频率减小刷新频率flag+;display(ge,shi,bai,qian,wan,shiwan); 执行上述程序仿真,把执行上述程序仿真,把I INT1*引脚上出现的引脚上出现的正脉冲宽度正脉冲宽度显示在显示在LED数数码管显示器上码管显示器上。晶振频率为。晶振频率为12MHz,如果默认信号源输出频率为,如果默认信号源输出频率为1kHz的的方波,则方波,则数码管显示为数码管显示为500。 注意:在仿真时,偶尔显示注意:在

54、仿真时,偶尔显示501是因为信号源的问题,若将信号源是因为信号源的问题,若将信号源换成频率固定的激励源则不会出现此问题。换成频率固定的激励源则不会出现此问题。7071727.4.7LCD时钟的设计时钟的设计【例【例7-77-7】使用定时器实现一个使用定时器实现一个LCDLCD显示时钟。采用显示时钟。采用LCD 1602LCD 1602,具体见,具体见第第5 5章的绍。章的绍。LCDLCD时钟的原理电路时钟的原理电路见见图图7-227-22。 最小计时单位是秒,最小计时单位是秒,如何获得如何获得1s1s的定时?的定时?可将可将T0T0定时时间定为定时时间定为50ms50ms,采用中断方式进行溢出

55、次数累计,满,采用中断方式进行溢出次数累计,满2020次,则秒计数变量次,则秒计数变量secondsecond加加1 1;若秒计满若秒计满6060,则分计数变量,则分计数变量minuteminute加加1 1,同时将秒计数变量,同时将秒计数变量secondsecond清清0 0;若分钟计满若分钟计满6060,则小时计数变量,则小时计数变量hourhour加加1 1;若小时计数变量满;若小时计数变量满2424,则将小,则将小时计数变量时计数变量hourhour清清0 0。图图7-22LCD时钟的原理电路时钟的原理电路73先将定时器以及各计数变量设定完毕,然后调用时间显示子程序。秒计先将定时器以及

56、各计数变量设定完毕,然后调用时间显示子程序。秒计时由时由T0中断服务子程序来实现中断服务子程序来实现。参考程序如下:参考程序如下:#include#include#defineucharunsignedchar#defineuintunsignedintucharint_time;/定义中断次数计数变量定义中断次数计数变量ucharsecond;/秒计数变量秒计数变量74ucharminute;/分钟计数变量分钟计数变量ucharhour;/小时计数变量小时计数变量ucharcodedate=H.I.T.CHINA;/LCD第第1行行显示的内容显示的内容ucharcodetime=TIME23

57、:59:55;/LCD第第2行行显示的内容显示的内容ucharsecond=55,minute=59,hour=23;voidclock_init()uchari,j;for(i=0;i16;i+)write_data(datei);write_com(0x80+0x40);75for(j=0;j16;j+)write_data(timej);voidclock_write(uints,uintm,uinth)write_sfm(0x47,h);write_sfm(0x4a,m);write_sfm(0x4d,s);voidmain()init1602();/LCD初始化初始化clock_in

58、it();/时钟初始化时钟初始化76TMOD=0x01;/设置定时器设置定时器T0为方式为方式1定时定时EA=1;/总中断开总中断开ET0=1;/允许允许T0中断中断TH0=(65536-46483)/256;/给给T0装初值装初值TL0=(65536-46483)%256;TR0=1;int_time=0;/中断次数、秒、分、时单元清中断次数、秒、分、时单元清0second=55;minute=59;hour=23;while(1)clock_write(second,minute,hour);77voidT0_interserve(void)interrupt1using1/T0中断服务子

59、程序中断服务子程序int_time+;/中断次数加中断次数加1if(int_time=20)/若若中断次数中断次数计满计满20次次int_time=0;/中断次数变量清中断次数变量清0second+;/秒计数变量加秒计数变量加1if(second=60)/若若计满计满60ssecond=0;/秒计数变量清秒计数变量清0minute+;/分计数变量加分计数变量加178if(minute=60)/若计满若计满60分分minute=0;/分计数变量清分计数变量清0hour+;/小时计数变量加小时计数变量加1if(hour=24)hour=0;/小时计数计满小时计数计满24,将小时计数变量清,将小时计

60、数变量清0TH0=(65536-46083)/256; /定时器定时器T0重新赋值重新赋值TL0=(65536-46083)%256;执行上述程序仿真运行,就会在执行上述程序仿真运行,就会在LCDLCD上上显示实时时间。显示实时时间。79807.5AT89S52新增定时器新增定时器/计数器计数器T2简介简介AT89S52与与AT89S51相比,新增加了一个相比,新增加了一个16位定时器位定时器/计数器计数器T2(可简写(可简写为为T2)。)。与与T2相关的特殊功能寄存器共有相关的特殊功能寄存器共有2个个:T2CON和和T2MOD。7.5.1T2的特殊功能寄存器的特殊功能寄存器T2CON和和T2

61、MOD1.特殊功能寄存器特殊功能寄存器T2CONT2有有3种工作方式种工作方式:自动重装载(递增或递减计数)、捕捉和波特率发生:自动重装载(递增或递减计数)、捕捉和波特率发生器,由特殊功能寄存器中的控制寄存器器,由特殊功能寄存器中的控制寄存器T2CON中的相关位来进行选择。中的相关位来进行选择。T2CON的字节地址为的字节地址为C8H,可,可位寻址位寻址,位地址,位地址C8HCFH,格式见,格式见图图7-23。81图图7-23TCON格式格式T2CON寄存器寄存器各位的定义各位的定义如下:如下:TF2(D7):):T2计数溢出中断请求标志位。当计数溢出中断请求标志位。当T2计数溢出时,由内部硬

62、计数溢出时,由内部硬件置位件置位TF2,向,向CPU发出中断请求。但是当发出中断请求。但是当RCLK位或位或TCLK位为位为1时将不予时将不予置位。本标志位必须由软件清置位。本标志位必须由软件清0。82EXF2(D6):):T2外部中断请求标志位。当由引脚外部中断请求标志位。当由引脚T2EX上的负跳变引起上的负跳变引起“捕捉捕捉”或或“自动重装载自动重装载”且且EXEN2位为位为1,则置位,则置位EXF2标志位,并向标志位,并向CPU发出中断请求。该标志位必须由软件清发出中断请求。该标志位必须由软件清0。RCLK(D5):):串行口接收时钟标志位。当串行口接收时钟标志位。当RCLK位为位为1时

63、,串行通信端时,串行通信端使用使用T2的溢出信号作为串行通信方式的溢出信号作为串行通信方式1和方式和方式3的接收时钟;当的接收时钟;当RCLK位为位为0时,使用时,使用T1的溢出信号作为串行通信方式的溢出信号作为串行通信方式1和方式和方式3的接收时钟。的接收时钟。TCLK(D4):):串行发送时钟标志位。当串行发送时钟标志位。当TCLK位为位为1时,串行通信端使用时,串行通信端使用T2的溢出信号作为串行通信方式的溢出信号作为串行通信方式1和方式和方式3的发送时钟;当的发送时钟;当TCLK位为位为0时,时,串行通信端使用串行通信端使用T1的溢出信号作为串行通信方式的溢出信号作为串行通信方式1和方

64、式和方式3的发送时钟;的发送时钟;83EXEN2(D3):):T2外部采样允许标志位。当外部采样允许标志位。当EXEN2位位=1时,如果时,如果T2不是不是正工作在串行口的时钟,则在正工作在串行口的时钟,则在T2EX引脚(引脚(P1.1)上的负跳变将触发)上的负跳变将触发“捕捉捕捉”或或“自动重装载自动重装载”操作;当操作;当EXEN2位位=0时,在时,在T2EX引脚(引脚(P1.1)上的负)上的负跳变对跳变对T2不起作用。不起作用。TR2(D2):):T2启启动/停止控制位。当停止控制位。当软件置位件置位TR2时,即,即TR2=1,则启启动T2开始开始计数,当数,当软件清件清TR2位位时,即

65、,即TR2=0,则T2停止停止计数。数。84C/T2*(D1):):T2的计数或定时方式选择位,当设置的计数或定时方式选择位,当设置C/T2*=1时,为对外时,为对外部事件计数方式;部事件计数方式;C/T2*=0时,为定时方式。时,为定时方式。CP/RL2(D0):):T2捕捉捕捉/自动重装载选择位。当设置自动重装载选择位。当设置CP/RL2=1时,如果时,如果EXEN2为为1,则在,则在T2EX引脚(引脚(P1.1)上的负跳变将触发)上的负跳变将触发“捕捉捕捉”操作;当操作;当设置设置CP/RL2=0时,如果时,如果EXEN2为为1,则,则T2计数溢出或计数溢出或T2EX引脚上的负跳变引脚上

66、的负跳变都将引起自动重装载操作;当都将引起自动重装载操作;当RCLK位为位为1或或TCLK位为位为1,CP/RL2标志位不标志位不起作用。起作用。T2计数溢出时,将迫使计数溢出时,将迫使T2进行自动重装载操作。进行自动重装载操作。85通过软件编程对通过软件编程对T2CON中的相关位进行设置来中的相关位进行设置来选择选择T2的的3种种工作方式工作方式:16位自动重装载(递增或递减计数)、捕捉和波特率发生器,如位自动重装载(递增或递减计数)、捕捉和波特率发生器,如表表7-2所所示。示。862.特殊功能寄存器特殊功能寄存器T2MOD与与T2相关的另一个特殊功能寄存器为相关的另一个特殊功能寄存器为T2

67、MOD。T2MOD寄存器的格式见寄存器的格式见图图7-24。图图7-24T2MOD的格式的格式87T2MOD寄存器寄存器各位的定义各位的定义如下:如下:T2OE(D1):):T2输出的启动位。输出的启动位。DCEN(D0):):置位为置位为1时允许时允许T2增增1/减减1计数计数,并由并由T2EX引脚(引脚(P1.1)上的逻辑电平决定是增上的逻辑电平决定是增1还是减还是减1计数。计数。:保留位。保留位。当单片机复位时,当单片机复位时,DCEN为为0,默认,默认T2为增为增1计数方式;当把计数方式;当把DCEN置置1时,将由时,将由T2EX引脚(引脚(P1.1)上的逻辑电平决定)上的逻辑电平决定

68、T2是增是增1还是减还是减1计数。计数。88897.5.2T2的的16位自动重装载方式位自动重装载方式工作方式见工作方式见图图7-25。图中图中RCAP2L为陷阱寄存器为陷阱寄存器低字节低字节,字节地址为,字节地址为CAH;RCAP2H为陷阱为陷阱寄存器寄存器高字节高字节,字节地址为,字节地址为CBH。T2引脚为引脚为P1.0,T2EX引脚为引脚为P1.1,因此,因此当使用当使用T2时,时,P1.0和和P1.1就不能作就不能作I/O口用了。口用了。另外有两个中断请求,通过一个另外有两个中断请求,通过一个“或或”门输出。因此当单片机响应中断门输出。因此当单片机响应中断后,在中断服务程序中应该用软

69、件识别是哪一个中断请求,分别进行处理,后,在中断服务程序中应该用软件识别是哪一个中断请求,分别进行处理,该中断请求标志位必须用软件清该中断请求标志位必须用软件清“0”。(1)当设置当设置T2MOD寄存器的寄存器的DCEN位为位为0(或上电复位为(或上电复位为0)时,)时,T2为增为增1型自动重新装载方式,此时根据型自动重新装载方式,此时根据T2CON寄存器中的寄存器中的EXEN2位的状态,位的状态,可选择两种操作方式:可选择两种操作方式:90图图7-25T2的自动重装载方式的工作示意图的自动重装载方式的工作示意图91 当当EXEN2标志位清标志位清0,T2计满溢出回计满溢出回0,一方面使中断请

70、求标志位,一方面使中断请求标志位TF2置置1,同时又将陷阱寄存器,同时又将陷阱寄存器RCAP2L、RCAP2H中预置的中预置的16位计数初值位计数初值自动重装入计数器自动重装入计数器TL2、TH2中,自动进行下一轮的计数操作,其功能中,自动进行下一轮的计数操作,其功能与与T0、T1的方式的方式2(自动装载)相同,只是本计数方式为(自动装载)相同,只是本计数方式为16位,计数范位,计数范围大。围大。RCAP2L、RCAP2H寄存器的计数初值由软件预置。寄存器的计数初值由软件预置。 当设置当设置EXEN2标志位为标志位为1,T2仍具有上述仍具有上述的功能,并增加了新的特性。的功能,并增加了新的特性

71、。当外部输入引脚当外部输入引脚T2EX(P1.1)产生负跳变时,能触发三态门将)产生负跳变时,能触发三态门将RCAP2L、RCAP2H陷阱寄存器中的计数初值自动装载到陷阱寄存器中的计数初值自动装载到TH2和和TL2中,中,重新开始计数,并置位重新开始计数,并置位EXF2为为1,发出中断请求。,发出中断请求。(2)当当T2MOD寄存器的寄存器的DCEN位置为位置为1时,可以使时,可以使T2既可以增既可以增1计数,也计数,也可实现减可实现减1计数,计数,增增1还是还是减减1取决于取决于T2EX引脚引脚上的逻辑电平上的逻辑电平。 图图7-26为为T2增增1/减减1计数方式的结构示意图。计数方式的结构

72、示意图。92图图7-26T2的增的增1/减减1计数的工作示意图计数的工作示意图93由图由图7-26可见,当设置可见,当设置DCEN位为位为1时,可以使时,可以使T2具有增具有增1/减减1计数功能。计数功能。当当T2EX(P1.1)引脚为)引脚为“1”时,时,T2执行增执行增1计数功能。当不断加计数功能。当不断加1计满溢计满溢出回出回0时,一方面置位时,一方面置位TF2为为1,发出中断请求,另一方面,溢出信号触,发出中断请求,另一方面,溢出信号触发三态门,将存放在陷阱寄存器发三态门,将存放在陷阱寄存器RCAP2L、RCAP2H中的计数初值自动中的计数初值自动装载到装载到TL2和和TH2计数器中继

73、续进行加计数器中继续进行加1计数。计数。当当T2EX(P1.1)引脚为)引脚为“0”时时,T2执行减执行减1计数功能。当计数功能。当TL2和和TH2计数计数器中的值等于陷阱寄存器器中的值等于陷阱寄存器RCAP2L、RCAP2H中的值时,产生向下溢出,中的值时,产生向下溢出,一方面置位一方面置位TF2为为1,发出中断请求,另一方面,下溢信号触发三态门,发出中断请求,另一方面,下溢信号触发三态门,将将0FFFFH装入装入TL2和和TH2计数器中,继续进行减计数器中,继续进行减1计数。计数。中断请求标志位中断请求标志位TF2和和EXF2位必须用软件清位必须用软件清0。94【例例7-8】利用利用T2实

74、现实现1秒定时并控制秒定时并控制P1.0引脚上的引脚上的LED1秒闪灭秒闪灭1次,晶振次,晶振频率为频率为12MHz。编程思想:编程思想:将将T2设置为设置为1/16秒的定时,定时中断秒的定时,定时中断16次,即为次,即为1秒,秒,1秒时间秒时间到后,把到后,把P1.0的状态求反。的状态求反。定时初值定时初值x计算计算:每秒中断:每秒中断16次,则每次溢出为次,则每次溢出为1000000/16=62500个机器个机器周期。周期。因此因此:65536-x=62500,初值初值x=3036=0BDCH。9596说明:说明:在中断函数中用到了在中断函数中用到了静态变量静态变量“staticuinti

75、”。静态变量的特点静态变量的特点是语句执行后,其是语句执行后,其占用的的存储单元不释放占用的的存储单元不释放,在下一次执行该语句时,该变,在下一次执行该语句时,该变量仍为上一次的值,它只需赋一次初值。也就是说,只有在第一次进中断时量仍为上一次的值,它只需赋一次初值。也就是说,只有在第一次进中断时“uinti=0”,才对,才对i赋值,以后再进入中断时,不会再对赋值,以后再进入中断时,不会再对i赋值。赋值。97987.5.3T2的捕捉方式的捕捉方式捕捉方式就是及时捕捉方式就是及时“捕捉捕捉”住输入信号发生的跳变及有关信息。常用于住输入信号发生的跳变及有关信息。常用于精确测量输入信号的变化如脉宽等等

76、。捕捉方式的工作示意结构见精确测量输入信号的变化如脉宽等等。捕捉方式的工作示意结构见图图7-27。根据根据T2CON寄存器中寄存器中EXEN2位的不同设置,位的不同设置,“捕捉捕捉”方式有方式有两种选择两种选择。(1)当)当EXEN2位位=0时,时,T2是一个是一个16位的定时器位的定时器/计数器。当设置计数器。当设置C/位为位为1时,选择外部计数方式,即对时,选择外部计数方式,即对T2引脚(引脚(P1.0)上的负跳变信号进行计数。)上的负跳变信号进行计数。计数器计满溢出时置计数器计满溢出时置1中断请求标志中断请求标志TF2,发出中断请求信号。,发出中断请求信号。CPU响应中响应中断进入该中断

77、服务程序后,必须用软件将标志位断进入该中断服务程序后,必须用软件将标志位TF2清清0。其他操作均与。其他操作均与T0和和T1的工作方式的工作方式1相同。相同。(2)当)当EXEN2位位=1时,时,T2除上述功能外,还可增加除上述功能外,还可增加“捕捉捕捉”功能。当功能。当外部外部T2EX引脚(引脚(P1.1)上的信号发生负跳变,将选通三态门控制端(见图)上的信号发生负跳变,将选通三态门控制端(见图7-27“捕捉捕捉”处),把计数器处),把计数器TH2和和TL2中的当前计数值分别中的当前计数值分别“捕捉捕捉”进进RCAP2L和和RCAP2H中,同时中,同时T2EX引脚(引脚(P1.1)上的信号负

78、跳变将置位)上的信号负跳变将置位T2CON的的的的EXF2标志位,向标志位,向CPU请求中断。请求中断。99图图7-27T2的捕捉方式结构示意图的捕捉方式结构示意图1007.5.4T2的的波特率发生器波特率发生器方式及方式及可编程时钟可编程时钟输出输出T2可工作于波特率发生器方式,还可作为可编程时钟输出。可工作于波特率发生器方式,还可作为可编程时钟输出。1.波特率发生器方式波特率发生器方式T2具有专用的具有专用的“波特率发生器波特率发生器”(波特率发生器就是控制串行口接收(波特率发生器就是控制串行口接收/发送发送数字信号的时钟发生器)的工作方式。通过软件置位数字信号的时钟发生器)的工作方式。通

79、过软件置位T2CON寄存器中的寄存器中的RCLK和和/或或TCLK,可将,可将T2设置为波特率发生器。需要注意的是,如果设置为波特率发生器。需要注意的是,如果T2用用于波特率发生器和于波特率发生器和T1用于别的功能,则这个接收用于别的功能,则这个接收/发送波特率可能是不同的。发送波特率可能是不同的。当置位当置位RCLK和和/或或TCLK,T2进入波特率发生器模式,如进入波特率发生器模式,如图图7-28所示。由所示。由图图7-28,当设置,当设置T2CON寄存器中的寄存器中的C/为为0,设置,设置RCLK和和/或或TCLK为为1时,输时,输出出16分频的接收分频的接收/发送波特率。发送波特率。1

80、01图图7-28T2作为串行通信波特率发生器示意图作为串行通信波特率发生器示意图102另外通过对另外通过对T2EX引脚(引脚(P1.1)跳变信号的检测,并置位)跳变信号的检测,并置位EXF2中断请求中断请求标志位,向标志位,向CPU请求中断。需要注意的是,图请求中断。需要注意的是,图7-28中的主振频率中的主振频率fosc是经是经过过2分频,而不是分频,而不是12分频。分频。T2工作在波特率发生器方式,属于工作在波特率发生器方式,属于16位自动重装载的定时模式。串行通位自动重装载的定时模式。串行通信方式信方式1和方式和方式3(见第(见第8章的介绍)的波特率计算公式为:章的介绍)的波特率计算公式

81、为:方式方式1和和方式方式3的波特率的波特率=定时器定时器T2的溢出率的溢出率/16103T2的波特率发生器可选择定时模式或计数模式,一般都选择定时模式。注意,的波特率发生器可选择定时模式或计数模式,一般都选择定时模式。注意,在选择定时器使用时,是主振频率在选择定时器使用时,是主振频率fosc经经12分频为一个机器周期作为加分频为一个机器周期作为加1计数计数信号,而作为波特率发生器使用时是以每个时钟状态信号,而作为波特率发生器使用时是以每个时钟状态S(2分频主振频率)作分频主振频率)作为加为加1计数信号。计数信号。因此因此串行通信方式串行通信方式1和方式和方式3的波特率计算公式的波特率计算公式

82、为:为:方式方式1和和方式方式3的波特率的波特率(b/s)=(fosc/32)65536-(RCAP2HRCAP2L)(7-1)104式(式(7-1)中)中“RCAP2HRCAP2L”为为T2的初值。例如的初值。例如“RCAP2HRCAP2L”初值为初值为FFFFH,则,则65536-65535=1,则式(,则式(7-1)的波特率)的波特率=(fosc/32)b/s。设主振频率设主振频率fosc=12MHz,则上述波特率则上述波特率=375kb/s。从式(从式(7-1)可见,采用)可见,采用T2用作波特率发生器,其波特率设置范围极广。用作波特率发生器,其波特率设置范围极广。从从图图7-28可见

83、,当可见,当T2用作波特率发生器时,具有以下特点:用作波特率发生器时,具有以下特点:必须设置必须设置T2CON寄存器中的寄存器中的RCLK和和/或或TCLK为为1(有效);(有效);计数器溢出再装载计数器溢出再装载,但不会置位但不会置位TF2向向CPU请求中断;请求中断;105如果如果T2EX引脚上发生负跳变将置位引脚上发生负跳变将置位EXF2为为1,向,向CPU请求中断处理,请求中断处理,但不会将陷阱寄存器但不会将陷阱寄存器“RCAP2HRCAP2L”中预置的计数初值装入中预置的计数初值装入TH2和和TL2中。因此,可将中。因此,可将T2EX引脚用作额外的输入引脚或外部中断源;引脚用作额外的

84、输入引脚或外部中断源;采用定时模式作波特率发生器时,是对采用定时模式作波特率发生器时,是对fosc经经2分频(时钟状态分频(时钟状态S)作)作为计数单位,而不是为计数单位,而不是fosc经经12分频的机器周期信号。分频的机器周期信号。波特率波特率设置范置范围广,精确度高。广,精确度高。106另外要注意的是,另外要注意的是,T2在波特率工作方式下作为定时器模式时(在波特率工作方式下作为定时器模式时(TR2为为1),),不能对不能对TH2、TL2进行读写。这时的进行读写。这时的T2是以每个时钟状态(是以每个时钟状态(S)进行加)进行加1计数,计数,这时进行读写可能出错。对陷阱寄存器这时进行读写可能

85、出错。对陷阱寄存器RCAP2可以读,但不能写,因为写可以读,但不能写,因为写RCAP2可能会覆盖重装的数据并使装入出错。处理可能会覆盖重装的数据并使装入出错。处理T2或或RCAP2寄存器前不寄存器前不能关闭能关闭T2(即清(即清0TR2位)。位)。2.可编程时钟信号输出可编程时钟信号输出T2可通过软件编程在可通过软件编程在P1.0引脚输出时钟信号。引脚输出时钟信号。P1.0除用作通用除用作通用I/O引脚外引脚外还有两个功能可供选用:用于还有两个功能可供选用:用于T2的外部计数输入和频率为的外部计数输入和频率为61Hz4MHz的时钟的时钟信号输出。信号输出。图图7-29为时钟输出和外部事件计数方

86、式示意图。为时钟输出和外部事件计数方式示意图。107图图7-29T2时钟输出和外部事件计数方式示意图时钟输出和外部事件计数方式示意图108通过软件对通过软件对T2CON.1位位C/复位为复位为0,对,对T2MOD.1位位T2OE置置1就可将就可将T2选选定为时钟信号发生器,而定为时钟信号发生器,而T2CON.2位位TR2控制时钟信号输出开始或结束控制时钟信号输出开始或结束(TR2为启动为启动/停止控制位)。由主振频率停止控制位)。由主振频率fosc和和T2定时、自动重装载方式的定时、自动重装载方式的计数初值决定时钟信号的输出频率计数初值决定时钟信号的输出频率,其设置公式如下:其设置公式如下:时

87、钟信号输出频率时钟信号输出频率=(12106)/4(65536-(RCAP2HRCAP2L)(7-2)从从式(式(7-2)可见,在主振频率(可见,在主振频率(fosc)设定后,时钟信号输出频率就取)设定后,时钟信号输出频率就取决于计数初值。决于计数初值。在时钟输出模式下,计数器溢出回在时钟输出模式下,计数器溢出回0不会产生中断请求。这种功能相当于不会产生中断请求。这种功能相当于T2用作波特率发生器,同时又可用作时钟发生器。但必须注意,无论如何波用作波特率发生器,同时又可用作时钟发生器。但必须注意,无论如何波特率发生器和时钟发生器都不能单独确定各自不同的频率。原因是两者都用特率发生器和时钟发生器都不能单独确定各自不同的频率。原因是两者都用同一个陷阱寄存器同一个陷阱寄存器RCAP2H、RCAP2L,不可能出现两个计数初值。,不可能出现两个计数初值。109110

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号