《单片机(c语言版)定时器计数器.ppt》由会员分享,可在线阅读,更多相关《单片机(c语言版)定时器计数器.ppt(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第6章章AT89S51单片机的单片机的定时器定时器/计数器计数器1内容概要:内容概要:介绍介绍AT89S51单片机片内定时器单片机片内定时器/计数器的结计数器的结构与功能,两种工作模式和构与功能,两种工作模式和4种工作方式,以及与其相关种工作方式,以及与其相关的两个特殊功能寄存器的两个特殊功能寄存器TMOD和和TCON各位的定义及其各位的定义及其编程,最后介绍定时器编程,最后介绍定时器/计数器的计数器的C51编程及应用实例。编程及应用实例。6.1定定时器器/计数器的数器的结构构定时定时/计数器的实质是加计数器的实质是加1计数器(计数器(16位位),由),由高高8位位THX(X=0或或1)和)
2、和低低8位位TLX两个寄存器组成。两个寄存器组成。TMOD是定时是定时/计数器的工作方式寄存器,确定工作方式和功能;计数器的工作方式寄存器,确定工作方式和功能;TCON是是控制寄存器,控制控制寄存器,控制T0、T1的启动和停止及设置溢出标志的启动和停止及设置溢出标志。外部脉冲3图6-1AT89S51单片机的定片机的定时器器/计数器数器结构框构框图6.1.1工作方式控制寄存器工作方式控制寄存器TMODpAT89S51定时器工作方式寄存器定时器工作方式寄存器TMOD用于选择工作模式和用于选择工作模式和工作方式,字节地址为工作方式,字节地址为89H,不能位寻址。,不能位寻址。p8位分为两组,高位分为
3、两组,高4位控制位控制T1,低,低4位控制位控制T0。(1)GATE门控位门控位GATE=0时,仅由运行控制位时,仅由运行控制位TRx(x=0,1)来控制定时器运行来控制定时器运行GATE=1时,用外中断引脚时,用外中断引脚INT0*(或(或INT1*)上的电平与运行)上的电平与运行控制位控制位TRx共同控制定时器运行。共同控制定时器运行。4图6-2寄存器寄存器TMOD格式格式(2)M1、M0工作方式选择位工作方式选择位pM1、M0的的4种编码,对应于种编码,对应于4种工作方式种工作方式的选择。的选择。(3)C/T*计数器模式和定时器模式选择位计数器模式和定时器模式选择位nC/T*=0,为定时
4、器工作模式,对单片机的晶体振荡器,为定时器工作模式,对单片机的晶体振荡器12分分频后的脉冲进行计数。频后的脉冲进行计数。nC/T*=1,为计数器工作模式,计数器对外部输入引脚,为计数器工作模式,计数器对外部输入引脚T0(P3.4)或)或T1(P3.5)的外部脉冲(负跳变)计数。)的外部脉冲(负跳变)计数。56.1.2定时器定时器/计数器控制寄存器计数器控制寄存器TCONpTCON字节地址为字节地址为88H,可位寻址,位地址为,可位寻址,位地址为88H8FH。(1)TF1、TF0计数溢出标志位。计数溢出标志位。当当计数器计数溢出时,该位置计数器计数溢出时,该位置“1”。使用查询方式时,应注意。使
5、用查询方式时,应注意查询有效后,使用软件及时将该位清查询有效后,使用软件及时将该位清“0”。使用中断方式时,。使用中断方式时,中断请求标志位在进入中断服务程序后由硬件自动清中断请求标志位在进入中断服务程序后由硬件自动清“0”。(2)TR1、TR0计数运行控制位。计数运行控制位。TR1位(或位(或TR0位)位)=1,启动定时器工作。,启动定时器工作。TR1位(或位(或TR0位)位)=0,停止定时器工作。,停止定时器工作。该位可由软件置该位可由软件置“1”或清或清“0”。6图6-3TCON格式格式6.2 6.2 定时器定时器/计数器的计数器的4 4种工作方式种工作方式6.2.1 6.2.1 方式方
6、式0 0M1M0=00方式方式0 0为为1313位计数位计数,由,由TL0TL0的低的低5 5位(高位(高3 3位未用)和位未用)和TH0TH0的的8 8位位组成。组成。TL0TL0的低的低5 5位溢出时向位溢出时向TH0TH0进位,进位,TH0TH0溢出时,置位溢出时,置位TCONTCON中的中的TF0TF0标志,向标志,向CPUCPU发出中断请求。发出中断请求。7图6-4定时器/计数器方式0逻辑结构框图pC/T*C/T*位决定定时器位决定定时器/计数器的两种工作模式计数器的两种工作模式(1)C/T*=0,T1(或(或T0)为定时器工作模式,把时钟振荡)为定时器工作模式,把时钟振荡器器12分
7、频后的脉冲作为计数信号。分频后的脉冲作为计数信号。(2)C/T*=1,T1(或(或T0)为计数器工作模式,计数脉冲为)为计数器工作模式,计数脉冲为P3.4(或(或P3.5)引脚上的外部输入脉冲,当引脚上发生负跳变)引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加时,计数器加1。9pGATE位决定定时器的运行控制取决于位决定定时器的运行控制取决于TRx一个条件,还是一个条件,还是取决于取决于TRx和和INTX*(x=0,1)引脚状态这两个条件引脚状态这两个条件。(1)GATE=0时,仅由时,仅由TR0控制与门的开启。与门输出控制与门的开启。与门输出1时,时,控制开关接通,计数开始;控制开关接
8、通,计数开始;(2)GATE=1时,由外中断引脚信号控制或门的输出,此时,由外中断引脚信号控制或门的输出,此时控制时控制与门的开启由外中断引脚信号和与门的开启由外中断引脚信号和TR0共同控制共同控制。当当TR0=1时,外中断引脚信号引脚的时,外中断引脚信号引脚的高电平启动计数高电平启动计数,外中,外中断引脚信号引脚的断引脚信号引脚的低电平停止计数低电平停止计数。这种方式常用来测量外。这种方式常用来测量外中断引脚上正脉冲的宽度。中断引脚上正脉冲的宽度。l定定时器模式器模式时有有:Nt/Tcyl计数初数初值计算的公式算的公式为:6.2.2方式方式1M1M0=01方式方式1的计数位数是的计数位数是1
9、6位,由位,由TLX作为低作为低8位、位、THX作为高作为高8位,组成了位,组成了16位加位加1计数器计数器。计数个数与计数初值的关系为:计数个数与计数初值的关系为:6.2.3方式方式2M1M0=10方式方式2为自动重装初值的为自动重装初值的8位计数方式。位计数方式。工作方式2特别适合于用作较精确的脉冲信号发生器。计数个数与计数初值的关系为计数个数与计数初值的关系为:工作过程pT0分成两个分成两个8位定时位定时/计数器计数器TL0和和TH0;TL0:既可计数也可定时,是一个既可计数也可定时,是一个8位定时位定时/计数器。占用了计数器。占用了T0 所有控制位:所有控制位:C/T,TR0,GATE
10、,TF0和和INT0、T0引脚;引脚;TH0:只能作为定时器,因为只能作为定时器,因为T0已被已被TL0占用,占用,TH0用用 T1的的 控制位:控制位:TR1、TF1;6.2.4 6.2.4 方式方式3M1M0=113M1M0=1113pT0T0在方式在方式3 3时时T1T1的工作模式的工作模式T1T1只能工作在只能工作在0 0、1 1、2 2方式,作为串行口的方式,作为串行口的波特率发生器波特率发生器使用。使用。因为因为T1T1的运行控制位的运行控制位TR1TR1及计数溢出标志位及计数溢出标志位TF1TF1已被定时已被定时/计计数器数器T0T0借用。借用。当作为波特率发生器使用时,只需要设
11、置好工作方式,便可当作为波特率发生器使用时,只需要设置好工作方式,便可自动运行。如要停止工作,只需送入一个把自动运行。如要停止工作,只需送入一个把T1T1设置为方式设置为方式3 3的方式控制字。因为定时的方式控制字。因为定时/计数器计数器T1T1不能在方式不能在方式3 3下工作,下工作,因为因为T1处于方式处于方式3时相当于时相当于TR1=0,停止计数,停止计数。146.3对外部外部输入的入的计数信号的要求数信号的要求当定当定时器器/计数器工作在数器工作在计数器模式数器模式时,计数脉冲来自外部数脉冲来自外部输入入引脚引脚T0或或T1。当。当输入信号入信号产生由生由1至至0的跳的跳变(即(即负跳
12、跳变)时,计数器数器值增增1。由于确由于确认一次一次负跳跳变花花2个机器周期,即个机器周期,即24个振个振荡周期,因此周期,因此外部外部输入的入的计数脉冲的最高数脉冲的最高频率率为系系统振振荡器器频率的率的1/24。图6-12对外部外部计数数输入信号的要求入信号的要求例如,例如,选用用6MHz频率的晶体,率的晶体,允允许输入的脉冲入的脉冲频率最高率最高为250kHz。如果。如果选用用12MHz频率的晶体,率的晶体,则可可输入最高入最高频率率为500kHz的外部脉冲。的外部脉冲。156.3对外部输入的计数信号的要求对外部输入的计数信号的要求p当定时器当定时器/计数器工作在计数器模式时,计数脉冲来
13、自外部输计数器工作在计数器模式时,计数脉冲来自外部输入引脚入引脚T0或或T1。当输入信号产生由。当输入信号产生由1至至0的跳变(即负跳变)的跳变(即负跳变)时,计数器值增时,计数器值增1。p由于确认一次负跳变花由于确认一次负跳变花2个机器周期,即个机器周期,即24个振荡周期,因个振荡周期,因此此外部输入计数脉冲的最高频率为系统振荡器频率的外部输入计数脉冲的最高频率为系统振荡器频率的1/24。图6-12对外部外部计数数输入信号的要求入信号的要求p例如,选用例如,选用6MHz6MHz频率频率的晶体,的晶体,允许输入的脉冲频率最高为允许输入的脉冲频率最高为250kHz250kHz。如果选用。如果选用
14、12MHz12MHz频率频率的晶体,则可输入最高频率为的晶体,则可输入最高频率为500kHz500kHz的外部脉冲。的外部脉冲。p时间常数的计算u时间常数:定时器/计数器T0或T1的初始计数值,在T0或T1被启动后,每个机器周期使计数器中的计数值加1,计数器产生溢出后。u定时时间:计数器溢出时间,时间常数越大,定时时间就越短;时间常数越小,定时时间就越长。时钟的频率越高,定时时间越短;时钟的频率越低,定时时间越长。设系统时钟的频率为设系统时钟的频率为foscfosc,计数器的初始值为,计数器的初始值为N N,定,定时器工作于方式时器工作于方式1 1,则定时时间:,则定时时间:T=T=(2 21
15、616-N-N)12/fosc (1)12/fosc (1)如果定时器工作于方式如果定时器工作于方式2 2或方式或方式3 3,定时时间为:,定时时间为:T=T=(2 28 8-N-N)12/fosc (2)12/fosc (2)当初始值当初始值N=0N=0时,如果时,如果fosc=12MHZfosc=12MHZ,最大定时时间为:,最大定时时间为:方式方式1 1为:为:Tmax=2Tmax=2161612/fosc=65536us=65.536ms12/fosc=65536us=65.536ms 方式方式2 2、方式、方式3 3为:为:Tmax=2Tmax=28 812/fosc=256us12
16、/fosc=256us 根据定时时间根据定时时间T T,及公式,及公式(1)(1)、(2)(2)分别可以求出初值分别可以求出初值N N为:为:方式方式1 1:N=2N=21616-Tfosc/12 -Tfosc/12 (3 3)方式方式2 2、方式、方式3 3:N=2N=28 8-Tfosc/12 -Tfosc/12 (4 4)如果如果fosc=12MHZ,fosc=12MHZ,以上公式可简化为以上公式可简化为 方式方式1 1:N=2N=21616-T -T 方式方式2 2、方式、方式3 3:N=2N=28 8-T-T 例如:系统的时钟频率是例如:系统的时钟频率是12MHz12MHz,在方式,
17、在方式1 1下,如果希望定下,如果希望定时器时器/计数器计数器T0T0的定时时间的定时时间T T为为10ms10ms,则初值,则初值N=2N=21616-T=65536-T=65536-10000=5553610000=55536 如何将如何将5553655536给两个给两个8 8位寄存器位寄存器TH0TH0、TL0TL0赋值呢?可将十进制数赋值呢?可将十进制数5553655536转换成四位十六进制数,将高转换成四位十六进制数,将高2 2位送位送TH0TH0,低,低2 2位送位送TL0TL0。更简单的方法是:对于更简单的方法是:对于1616位计数器来讲,位计数器来讲,2 21616等效为等效为
18、0 0,对于,对于8 8位计数器,位计数器,2 28 8等效为等效为0 0,这样公式(,这样公式(3 3)、()、(4 4)可简化为可简化为 N=-N=-T T,直接用下面两条语句就可以完成计数器初值的设置:,直接用下面两条语句就可以完成计数器初值的设置:TH0=-10000/256TH0=-10000/256;/取取-N-N的高的高8 8位位 TL0=-10000%256TL0=-10000%256;/取取-N-N的低的低8 8位位 例如:设系统的时钟频率是例如:设系统的时钟频率是12MHz12MHz,定时器工作于方式,定时器工作于方式2 2,定,定时时间时时间200us200us。根据前面
19、分析,根据前面分析,N=-T=-200N=-T=-200,可直接用以下语句实现:,可直接用以下语句实现:TH0=-200TH0=-200;TL0=-200TL0=-200;pMCS-51单片机的定时器是可编程的,但在进行定时或计数之前要对程序进行初始化,具体步骤如下:(1)确定工作方式字:对TMOD寄存器正确赋值;(2)确定定时初值:计算初值,直接将初值写入寄存器的TH0、TL0或TH1、TL1;初值计算:设计数器的最大值为M,则置入的初值X为:计数方式:X=M-计数值 定时方式:由(M-X)T=定时值,得X=M-定时值/TT为计数周期,是单片机的机器周期。(模式0-M为213,模式1-M为2
20、16,模式2和3-M为28)(3)根据需要,对IE置初值,开放定时器中断;(4)启动定时/计数器,对TCON寄存器中的TR0或TR1置位,置位以后,计数器即按规定的工作模式和初值进行计数或开始定时。6.4定定时器器/计数器的数器的编程和程和应用用6.4.1P1口外接的口外接的8只只LED每每0.5s闪亮一次。闪亮一次。【例例6-1】在在AT89S51单片机的单片机的P1口上接有口上接有8只只LED(电(电路见图路见图4-7)。下面采用定时器)。下面采用定时器T0的方式的方式1的定时中断方式,的定时中断方式,使使P1口外接的口外接的8只只LED每每0.5s闪亮一次。闪亮一次。(1)设置)设置TM
21、OD寄存器寄存器p方式方式1;计时工作模式;仅由;计时工作模式;仅由TR0来控制;来控制;T1不使用。不使用。pTMOD寄存器应初始化为寄存器应初始化为0 x01=00000001B(2)计算)计算T0计数初值计数初值设定时时间设定时时间5ms(即(即5000s),设定时器),设定时器T0的计数初值为的计数初值为X,假设晶振的频率为,假设晶振的频率为11.0592MHz,则定时时间为:,则定时时间为:定时时间定时时间=(216X)12/晶振频率晶振频率则则5000=(216X)12/11.0592得:得:X=60928,转换成,转换成16进制后为:进制后为:0 xee00,其中,其中0 xee
22、装入装入TH0,0 x00装入装入TL0。(3)设置)设置IE寄存器寄存器本例由于采用定时器本例由于采用定时器T0中断,因此需将中断,因此需将IE寄存器中的寄存器中的EA、ET0位置位置1。(4)启动和停止定时器)启动和停止定时器T0将定时器控制寄存器将定时器控制寄存器TCON中的中的TR0=1,则启动定时器,则启动定时器T0;TR0=0,则停止定时器,则停止定时器T0定时。定时。21#includeChari=100;/*给变量给变量i赋初值,定时赋初值,定时0.5S,每次定时中断,每次定时中断5MS,需要中断,需要中断100次次*/voidmain()TMOD=0 x01;/*设置定时器设
23、置定时器T0为方式为方式1*/TH0=0 xee;/*向向TH0写入初值的高写入初值的高8位位*/TL0=0 x00;/*向向TL0写入初值的低写入初值的低8位位*/P1=0 x00;/*P1口口8只只LED点亮点亮*/EA=1;/*总中断允许总中断允许*/ET0=1;/*定时器定时器T0中断允许中断允许*/TR0=1;/*启动定时器启动定时器T0*/while(1);/*无穷循环,等待定时中断无穷循环,等待定时中断*/22/*以下为定时器以下为定时器T0的中断服务程序的中断服务程序*/voidT0_int(void)interrupt1TH0=0 xee;/*给给T0装入装入16位初值,计位
24、初值,计4608个数后,个数后,T0溢出溢出TL0=0 x00;i-;/*循环次数减循环次数减1*/if(i=0)P1=P1;/*P1口按位取反口按位取反*/i=100;/*重新设置循环次数重新设置循环次数*/23 案例2 如图所示,P0口接8只发光二极管,编程使发光管轮流点亮,点亮时间为500ms,要求使用定时器T0来控制,设晶振为12MHz。设计思想 我们可将P0口的初值设置为0 xFE,对应于发光管D1亮,每隔500ms将P0的值循环左移一位,这一周期性的定时作业用T0来完成。当时钟频率为12MHZ时,在定时器的4种工作方式中,方式1的最大溢出时间最长,但即使在方式1,最大的溢出时间也只
25、有65.536ms,所以我们不能在每次中断时都执行上述移位操作。可以这样处理:将定时器T0的溢出时间设定为50ms,累计满10次中断正好500ms,才允许程序执行1次移位动作。主函数ucharcount=0;/50ms定时中断次数计数器voidmain(void)led=0 xfe;TMOD=0 x01;/T0工作于方式1TH0=-50000/256;/定时时间为50msTL0=-50000%256;ET0=1;/允许T0中断TR0=1;/启动T0定时EA=1;/CPU开中断while(1);voidtime0(void)interrupt1TH0=-50000/256;TL0=-50000%
26、256;count+;if(count=10)count=0;led=_crol_(led,1);P0=led;定时器定时器T0T0中断服务程序中断服务程序重新装入时间常数重新装入时间常数每中断一次,计数器加每中断一次,计数器加1 11010次中断为次中断为0.50.5秒秒满满1010次变量次变量ledled左移左移1 1位送位送P0P0口口6.4.2计数器的应用计数器的应用【例例6-2】采用定时器采用定时器T1的方式的方式1的中断计数方式,如的中断计数方式,如图图6-13所示,计数输入引脚所示,计数输入引脚T1(P3.5)上外接开关)上外接开关K1,作为,作为计数信号输入。按计数信号输入。按
27、4次次K1后,后,P1口的口的8只只LED闪烁不停。闪烁不停。28(1 1)设置)设置TMODTMOD寄存器寄存器T1T1工作在方式工作在方式1 1,应使,应使TMODTMOD的的M1M1、M0=01M0=01;设置计数器工作模式;设置计数器工作模式C/T*=1C/T*=1;对;对T0T0的运行控制仅由的运行控制仅由TR0TR0来控制,应使来控制,应使GATE0=0GATE0=0。定。定时器时器T0T0不使用,各相关位均设不使用,各相关位均设为为0 0。所以,。所以,TMODTMOD寄存器应初始寄存器应初始化为化为0 x500 x50。图6-13(2)计算)计算T1计数初值计数初值由于每按由于
28、每按4次次K1,计数一次,因此计数器的初值为,计数一次,因此计数器的初值为65536-4=65532,将其转换成,将其转换成16进制后为:进制后为:0 xfffc,因此,因此,TH0=0 xff,TL0=0 xfc。(3)设置)设置IE寄存器寄存器本例由于采用定时器本例由于采用定时器T1中断,因此需将中断,因此需将IE寄存器中的寄存器中的EA、ET1位置位置1。(4)启动和停止定时器)启动和停止定时器T1将定时器控制寄存器将定时器控制寄存器TCON中的中的TR1=1,则启动定时器,则启动定时器T1计数;计数;TR1=0,则停止定时器,则停止定时器T1计数。计数。参考程序如下:参考程序如下:29
29、#include/*定义延时函数定义延时函数Delay(),i是形式参数,不能赋初值是形式参数,不能赋初值*/voidDelay(unsignedinti)unsignedintj;/*变量变量i由实际参数传入一个值,因此由实际参数传入一个值,因此i不能赋初值不能赋初值*/for(;i0;i-)for(j=0;j125;j+);/*空函数空函数*/voidmain()/*主函数主函数*/TMOD=0 x50;/*设置定时器设置定时器T1为方式为方式1计数计数*/TH0=0 xff;/*向向TH0写入初值的高写入初值的高8位位*/30TL0=0 xfc;/*向向TL0写入初值低写入初值低8位位*
30、/EA=1;/*总中断允许总中断允许*/ET1=1;/*T1中断允许中断允许*/TR1=1;/*启动启动T1*/while(1);/*无穷循环,等待定时中断无穷循环,等待定时中断*/*以下为定时器以下为定时器T1的中断服务程序的中断服务程序*/voidT1_int(void)interrupt3for(;)/*无限循环无限循环*/P1=0 xff;/*8位位LED全灭全灭*/Delay(500);/*延时延时500ms*/P1=0;/*8位位LED全亮全亮*/Delay(500);/*延时延时500ms*/31案例4 用定时器来控制数码管的动态显示。用定时器控制数码管动态显示的方法:设定时器的
31、定时时间为1ms,每次产生溢出中断,就根据位选变量bsel(主程序中将其初值设置为0 xfe)送位选口,点亮一位数码管,并将bsel左移一位,为下一位的显示做好准备,4次定时中断分别完成4位数码管的显示,之后将bsel的值再次初始化为0 xfe,准备下一轮显示。因此这种显示方式由定时中断自动完成,无需在主程序中调用主程序ucharbsel,n;voidmain(void)n=0;bsel=0 xfe;/首先显示数码管的最低位TMOD=0 x01;/T0工作于定时方式2TH0=-1000/256;/T0的定时时间为1000usTL0=-1000%256;ET0=1;/允许T0中断TR0=1;/启
32、动定时EA=1;/开中断while(1);ucharcodesegtab=ucharcodesegtab=0 xc0,0 xf9,0 xa4,0 xb0,0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e,0 x89,0 x8c;0 x83,0 xc6,0 xa1,0 x86,0 x8e,0 x89,0 x8c;uchardbuf4=uchardbuf4=4,3,2,1;4
33、,3,2,1;字符字符0F0F的的字形码表字形码表显示缓存,存显示缓存,存放要显示字符放要显示字符voidtime0(void)interrupt1TH0=-1000/256;TL0=-1000%256;P0=0 xff;P2=bsel;P0=segtabdbufn;bsel=_crol_(bsel,1);n+;if(n=4)n=0;bsel=0 xfe;重新装入时间常数重新装入时间常数定时器定时器T0T0中断服务程序中断服务程序熄灭数码管,防止上一位字熄灭数码管,防止上一位字符在当前位置显示出来。符在当前位置显示出来。点亮当前位点亮当前位根据显示缓存查字段码根据显示缓存查字段码准备显示下一位
34、准备显示下一位指向下一位要显示的数据指向下一位要显示的数据如果四位已显示完如果四位已显示完,重新从重新从最低位开始最低位开始6.4.3扩展一个外部中断源扩展一个外部中断源方式方式2可自动重新装载初值。此方式可省去用户程序中重新可自动重新装载初值。此方式可省去用户程序中重新装初值的指令。装初值的指令。当某个定时器当某个定时器/计数器不使用时,可为计数器不使用时,可为AT89S51扩展一个负扩展一个负跳沿触发的外部中断源。跳沿触发的外部中断源。基本思想:基本思想:把定时器溢出中断做成外部中断把定时器溢出中断做成外部中断,然后把计数输,然后把计数输入信号接到定时器的相应引脚上入信号接到定时器的相应引
35、脚上T0脚(或脚(或T1脚),并把定时脚),并把定时器被设置为方式器被设置为方式2(自动装入常数方式)计数工作模式,计数(自动装入常数方式)计数工作模式,计数器器TH0、TL0初值均为初值均为0FFH,并允许,并允许T0中断,总中断开放。中断,总中断开放。当检测到当检测到T0脚(或脚(或T1脚)引脚电平发生负跳变时,计数器脚)引脚电平发生负跳变时,计数器TF0(或或TF1)溢出,这时将产生一个中断请求。溢出,这时将产生一个中断请求。【例例6-3】扩扩展展一一个个负负跳跳沿沿触触发发的的外外部部中中断断源源,把把定定时时器器T0计计数输入引脚作为外部中断请求信号的输入端。数输入引脚作为外部中断请
36、求信号的输入端。35#include#includevoid main()void main()TMOD=0 x06TMOD=0 x06;/*/*设置定时器设置定时器T0T0为方式为方式2 2计数计数*/TH0=0 xffTH0=0 xff;/*/*给给T0T0装入初值装入初值*/TL0=0 xffTL0=0 xff;/*/*给给T0T0装入初值装入初值*/ET0=1ET0=1;/*/*允许允许T0T0中断中断*/EA=1EA=1;/*/*总中断开总中断开*/TF0=0TF0=0;/*T0/*T0中断溢出标志位清中断溢出标志位清0*/0*/TR0=1TR0=1/*/*接通接通T0 T0 计数计
37、数*/while (1)while (1)/*/*无限循环等待无限循环等待*/*/*以下为定时器以下为定时器T0T0的中断服务程序的中断服务程序*/void T0_int(void)interrupt 1 using 0void T0_int(void)interrupt 1 using 0 /*/*外中断处理部分外中断处理部分*/366.4.4P1.0上产生周期为上产生周期为2ms的方波的方波【例例6-4】系统时钟为系统时钟为12MHz,编程实现从,编程实现从P1.0引脚上输出引脚上输出一个周期为一个周期为2ms的方波,如的方波,如图图6-14所示。所示。基本思想:基本思想:要在要在P1.0
38、上产生周期为上产生周期为2ms的方波,定时器应产生的方波,定时器应产生1ms的周期性的定时,定时对的周期性的定时,定时对P1.0求反。选择定时器求反。选择定时器T0,方式,方式1定时,采用中断方式,定时,采用中断方式,GATE不起作用。不起作用。37图6-14定定时器控制器控制P1.0输出一个周期出一个周期为2ms的方波的方波计算计算T0的初值计算:的初值计算:设设T0的初值为的初值为X,则,则(216X)1 106=1 103=65536X=1000则初值为:则初值为:655361000=64536,因此因此TH0=(655361000)/256,TL0=(655361000)%256。参考
39、程序如下:参考程序如下:38#includesbitP1_0=P10;voidmain(void)TMOD=0 x01;/*设置定时器设置定时器T0为方式为方式2计数计数*/P1_0=0;TH0=(655361000)/256;/*给给T0装入初值装入初值*/TL0=(655361000)%256;/*给给T0装入初值装入初值*/ET0=1;/*允许允许T0中断中断*/EA=1;/*总中断开总中断开*/TR0=1/*接通接通T0计数计数*/do while(1);/*无限循环等待无限循环等待*/voidT0_int(void)interrupt1using1P1_0=!P1_0;TH0=(65
40、5361000)/256;TL0=(655361000)%256;396.4.5P1.1上产生周期为上产生周期为1s的方波的方波【例例6-5】假设系统时钟为假设系统时钟为12MHz,编程实现从,编程实现从P1.1引脚引脚上上输出一个周期为输出一个周期为1s的方波。的方波。基本思想:基本思想:要在要在P1.0上产生周期为上产生周期为1s的方波,定时器应产的方波,定时器应产生生500ms的周期性定时,定时到则对的周期性定时,定时到则对P1.0求反。由于定时时求反。由于定时时间较长,用定时器不能直接实现,直接定时时间最长的就是间较长,用定时器不能直接实现,直接定时时间最长的就是方式方式1,仅为,仅为
41、65ms(系统时钟系统时钟12MHz)多一点。多一点。实现:实现:T0定为定为10ms定时,每定时,每10ms对对P1.0求反一次,求反一次,P1.0输出的脉冲加到定时器输出的脉冲加到定时器T1的计数输入脚的计数输入脚P3.5(T1脚),脚),作为计数输入,定时作为计数输入,定时500ms需计数需计数50次。次。T1设为方式设为方式2计数,计数,初值初值X为:为:28X=50,则,则X=206,40所以所以TH1=TL1=206。T0设为方式设为方式1定时,则控制字为定时,则控制字为61H。定时器。定时器T0和和T1均采用中断方式工作。均采用中断方式工作。参考程序如下:参考程序如下:#incl
42、udesbitP1_0=P10;sbitP1_1=P11;voidmain(void)TMOD=0 x61;/*设置定时器设置定时器T0为方式为方式1定时,定时,T1为方式为方式2计数计数*/P1_0=0;TH0=(6553610000)/256;/*给给T0装初值装初值*/TL0=(6553610000)%256;TH1=206;/*给给T1装初值装初值*/TL1=206;41EA=1;/*总中断开总中断开*/ET0=1;/*允许允许T0中断中断*/ET1=1;/*允许允许T1中断中断*/TR0=1;TR1=1;while(1);voidT0_int(void)interrupt1TH0=(
43、655361000)/256;TL0=(655361000)%256;P1_0=!P1_0;voidT1_int(void)interrupt3P1_1=!P1_1;;/*P1.1脚产生脚产生1s的方波的方波*/。426.4.6T1控制发出控制发出1KHz的音频信号的音频信号【例例6-6】利用定时器利用定时器T1的中断来控制蜂鸣器发出的中断来控制蜂鸣器发出1KHz的音频的音频信号,电路图见信号,电路图见图图6-15。假设系统时钟为假设系统时钟为11.0592MHz,则每个脉冲的周期为,则每个脉冲的周期为12/11.0592=1.085s。1KHz的音频信号周期为的音频信号周期为1ms,因此,因
44、此要计数的脉冲数为要计数的脉冲数为1000/1.085=921次。所以次。所以T1的初值:的初值:TH1=(65536921)/256;TL1=(65536921)%256参考程序如下:参考程序如下:43#includesbitsound=P17;voidmain(void)EA=1;/*总中断开*/ET1=1;/*允许T0中断*/TMOD=0 x10;/*设置定时器T1为方式1定时*/sound=0;TH1=(65536921)/256;/*给T1装初值*/TL1=(65536921)%256;TR1=1;while(1);voidT1_int(void)interrupt3using0 s
45、ound=sound;TH1=(65536921)/256;TL1=(65536921)%256;446.4.7测量脉冲宽度(门控位测量脉冲宽度(门控位GATEx的应用)的应用)下面以定时器下面以定时器T1为例,介绍门控制位为例,介绍门控制位GATE的具体应用,即的具体应用,即测量测量INT0*(或(或INT1*)引脚上正脉冲的宽度。)引脚上正脉冲的宽度。【例例6-7】门控位门控位GATE1可使可使T1的启动计数受的启动计数受INT1*的控制,的控制,当当GATE1=1,TR1=1时,只有引脚时,只有引脚INT1*输入高电平时,输入高电平时,T1才被允许计数。利用才被允许计数。利用GATE1这
46、一功能,可测量引脚这一功能,可测量引脚INT1*(P3.3)上正脉冲的宽度(机器周期数),利用门控制)上正脉冲的宽度(机器周期数),利用门控制位位GATE1,测量引脚,测量引脚INT1*上正脉冲宽度。方法如上正脉冲宽度。方法如图图6-16所示。所示。45图6-16利用GATE位测量正脉冲的宽度参考程序如下:#includesbitP3_3=P33;/*位变量定义位变量定义*/unsignedcount_high;/*定义计数变量,用来读取定义计数变量,用来读取TH0*/unsignedcount_low;/*定义计数变量,用来读取定义计数变量,用来读取TL0*/voidread_count()
47、;/*读计数器函数读计数器函数*/voidmain()TMOD=0 x90;/*设置定时器设置定时器T1为方式为方式1定时定时*/TH1=0;/*向定时器向定时器T1写入计数初值写入计数初值*/TL1=0;TR1=1;while(P3_3=1);/*等待变低等待变低*/TR1=1;/*如果为低,启动如果为低,启动T1(未真正开始计数未真正开始计数)*/46while(P3_3=0);/*等待变高,变高后等待变高,变高后T1真正开始计数真正开始计数*/while(P3_3=1);/*等待变低,变低后等待变低,变低后T1停止计数停止计数*/TR1=0;read_count();/*读计数寄存器内容的函数读计数寄存器内容的函数*/voidread_count()/*读取计数寄存器的内容读取计数寄存器的内容*/docount_high=TH1;/*读高字节读高字节*/count_low=TL1;/*读低字节读低字节*/*可将两字节的机器周期数进行显示处理可将两字节的机器周期数进行显示处理*/while(count_high!=TH1);u正脉冲正脉冲宽度以机器周期数的形式度以机器周期数的形式读入到入到count_high和和count_low两个两个单元中,元中,
限制150内