C51的定时器计数器.ppt

上传人:小飞机 文档编号:5417031 上传时间:2023-07-05 格式:PPT 页数:42 大小:313.50KB
返回 下载 相关 举报
C51的定时器计数器.ppt_第1页
第1页 / 共42页
C51的定时器计数器.ppt_第2页
第2页 / 共42页
C51的定时器计数器.ppt_第3页
第3页 / 共42页
C51的定时器计数器.ppt_第4页
第4页 / 共42页
C51的定时器计数器.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《C51的定时器计数器.ppt》由会员分享,可在线阅读,更多相关《C51的定时器计数器.ppt(42页珍藏版)》请在三一办公上搜索。

1、1,第6章 89C51的定时器/计数器 两个可编程的定时器/计数器T1、T0。2种工作模式:(1)计数器工作模式(2)定时器工作模式4种工作方式(方式0方式3)。,2,6.1 定时器/计数器的结构TMOD:选择定时器/计数器T0、T1的工作模式和工作方式。TCON:控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。,单片机复位时,两个寄存器都清0。,3,6.1.1 工作方式控制寄存器TMOD 8位分为两组,高4位控制T1,低4位控制T0。(1)GATE门控位 0:仅以TRX(X=0,1)来启动定时器/计数器运行。1:用引脚/INT0(或/INT1)上的高电平和TRX两个条件来启动定时

2、器/计数器运行。,4,6.1.1 工作方式控制寄存器TMOD(2)M1、M0工作方式选择位(表6-1)M1 M0 工 作 方 式 0 0 方式0,13位定时器/计数器。0 1方式1,16位定时器/计数器。1 0 方式2,8位常数自动重新装载 1 1 方式3,仅适用于T0,T0分成两个8位计数器,T1停止计数,5,(3)C/T*计数器模式和定时器模式选择位0:定时器模式。1:计数器模式。,图6-2 TMOD 格式,6,6.1.2 定时器/计数器控制寄存器TCON 低4位与外部中断有关,已介绍。高4位的功能如下:(1)TF1、TF0计数溢出标志位(2)TR1、TR0计数运行控制位 1:启动定时器/

3、计数器工作 0:停止定时器/计数器工作,7,6.2 定时器/计数器的4种工作方式 6.2.1 方式0 M1、M0为00,定时器/计数器的框图:,图6-4 定时器/计数器方式0逻辑结构框图,8,为13位的计数器,C/T*位决定工作模式:0:开关打在上面,为定时器工作模式;1:开关打在下面,为计数器工作模式,计数脉冲为P3.4、P3.5引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加1。GATE位:决定定时器/计数器的运行取决于TRx一个条件还是TRx和/INTx引脚两个条件。(1)0:A点(见图6-4)电位恒为1。是否计数,仅取决于TRx的状态。(2)1:B点电位由/INTx的输入电平【高电

4、平有效】和TRX的状态这两个条来确定。是否计数是由TRx和/INTx二个条件来控制。,9,6.2.2 方式1 M1、M0=01,16位的计数器。,图6-5 定时器/计数器方式0逻辑结构框图,10,6.2.3 方式2 计数满后自动装入计数初值。M1、M0=10,等效框图如下。,TLX作为常数缓冲器,当TLX计数溢出时,在置“1”溢出标志TFX的同时,还自动地将THX中的初值送至TLX,使TLX从初值开始重新计数。定时器/计数器的方式2工作过程如图6-7(X=0,1)。省去用户软件中重装初值的程序,精确的定时。,11,6.2.4 方式3 增加一个附加的8位定时器/计数器,从而具有3个定时器/计数器

5、。只适用于定时器/计数器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的逻辑关系如图6-8所示:,12,图6-8(a)TL0作为8位定时/计数器,图6-8(b)TH0作为8位定时器,13,2T0工作在方式3下T1的各种工作方式 当T1用作串行口的波特率发生器时,T0才工

6、作在方式3。T0为方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合。(1)T1工作在方式0,图6-9 T0工作在方式3下,T1为方式0的工作示意图,14,(2)T1工作在方式1,图6-10 T0工作在方式3下,T1为方式1的工作示意图,图6-11 T0工作在方式3下,T1为方式1的工作示意图,(3)T1工作在方式2,15,6.3 计数器模式对输入信号的要求 当输入信号产生由1至0的跳变(即负跳变)时,计数器的值增1 每个机器周期的S5P2期间,对外部输入引脚进行采样。如在第一个机器周期中采得的值为1,而在下一个机器周期中采得的值为0,则在紧随着的再下

7、一个机器周期S3P1期间,计数器加1。由于确认一次负跳变要花2个机器周期,即24个震荡周期。外部计数脉冲的最高频率为系统振荡器频率的1/24,例如选用12MHz频率的晶体,则可输入500KHz的外部脉冲。输入信号的高、低电平至少要保持一个机器周期。如图6-12所示,图中Tcy为机器周期。,图6-12 对外部输入信号的基本要求,16,6.4 定时器/计数器的编程和应用 4种工作方式中,方式0与方式1基本相同,由于方式0是为兼容MCS-48而设,初值计算复杂,在实际应用中,一般不用方式0,而采用方式1。6.4.1 方式1应用【例6-1】假设系统时钟频率采用6MHz,要在P1.0上输出一个周期为2m

8、s的方波,如图6-13所示。,图6-13 在P1.0引脚上输出的波形,17,方波的周期用T0来确定,让T0每隔1ms计数溢出1次(每1ms产生一次中断),CPU响应中断后,在中断服务程序中对P1.0取反。(1)计算初值X 设初值为X,则有:(216-X)210-6=110-3【机器周期=121/(6106)】216-X=500 X=65036 X化为16进制,即 所以,T0的初值为:TH0=0FEH TL0=0CH(2)初始化程序设计 对寄存器IP、IE、TCON、TMOD的相应位进行正确设置,将计数初值送入定时器中。(3)程序设计 中断服务程序除产生方波外,还要注意将计数初值重新装入定时器中

9、,为下一次中断作准备。,18,ORG 0000HRESET:AJMP MAIN;转主程序 ORG 000BH;T0的中断入口 AJMP IT0P;转T0中断处理程序IT0P ORG 0100HMAIN:MOV SP,#60H;设堆栈指针 MOV TMOD,#01H;设置T0为方式1 ACALL PT0M0;调用子程序PT0M0HERE:AJMP HERE;自身跳转PT0M0:MOV TL0,#0CH;T0初始化子程序 MOV TH0,#0FEH SETB TR0;启动T0 FEOCH SETB ET0;允许T0中断 FEODH SETB EA;CPU开中断 FEOEH RET FE10HITO

10、P:MOV TL0,#0CH;T0中断服务子程序,T0重新置初值 MOV TH0,#0FEH CPL P1.0;P1.0的状态取反 RETI,19,查询方式的参考程序:MOV TMOD,#01H;设置T0为方式1 LOOP:MOV TH0,#0FEH;T0置初值 MOV TL0,#0CH SETB TR0;接通T0LOOP1:JNB TF0,LOOP1;查询TF0标志 CLR TR0;T0溢出,关闭T0 CPL P1.0;P1.0的状态求反 SJMP LOOP,20,【例6-2】假设系统时钟为6MHz,编写定时器T0产生1秒定时的程序。(1)T0工作方式的确定 定时时间较长,采用哪一种工作方式

11、?由各种工作方式的特性,可计算出:方式0最长可定时16.384ms:213210-6 方式1最长可定时131.072ms:216210-6 方式2最长可定时512s:218210-6 选方式1,每隔100ms中断一次,中断10次为1s。(2)计算计数初值 因为:(216-X)210-6=10-1【机器周期:210-6s】所以:X=15536=3CB0H 因此:TH0=3CH,TL0=B0H(3)10次计数的实现 采用循环程序法。(4)程序设计,21,ORG 0000HRESET:LJMP MAIN;上电,转主程序入口MAIN ORG 000BH;T0的中断入口 LJMP IT0P;转T0中断处

12、理程序IT0P ORG 1000H MAIN:MOV SP,#60H;设堆栈指针 MOV B,#0AH;设循环次数10次 MOV TMOD,#01H;设T0工作在方式1 MOV TL0,#0B0H;给T0设初值 MOV TH0,#3CH SETB TR0;启动T0 SETB ET0;允许T0中断 SETB EA;CPU开放中断 HERE:SJMP HERE;等待中断 ITOP:MOV TL0,#0B0H;T0中断子程序,重装初值 MOV TH0,#3CH;DJNZ B,LOOP CLR TR0;1s定时时间到,停止T0工作 LOOP:RETI,22,6.4.2 方式2的应用 省去程序中重装初值

13、的指令,并可产生相当精确的定时时间。【例6-3】当T0(P3.4)引脚上发生负跳变时,从P1.0引脚上输出一个周期为1ms的方波,如图6-14所示。(系统时钟为6MHz),图6-14,23,(1)工作方式选择 T0为方式1计数,初值 0FFFFH,即外部计数输入端T0(P3.4)发生一次负跳变时,T0加1且溢出,溢出标志TF0置“1”,发中断请求。在进入T0中断程序后,把F0标志置“1”,说明T0脚已接收了负跳变信号。T1定义为方式2定时。在T0脚发生一次负跳变后,启动T1每500s产生一次中断,在中断服务程序中对P1.0求反,使P1.0产生周期1ms的方波。(2)计算T1初值 设T1的初值为

14、X,则(28-X)210-6=50010-6 X=28-250=6=06H(3)程序设计,24,ORG 0000HRESET:LJMP MAIN;复位入口转主程序 ORG 000BH JMP IT0P;转T0中断服务程序 ORG 001BH LJMP IT1P;转T1中断服务程序 ORG 0100HMAIN:MOV SP,#60H ACALL PT0M2;调用对T0,T1初始化子程序LOOP:MOV C,F0;T0产生过中断了吗,产生过中断,则F0=1 JNC LOOP;T0没有产生过中断,则跳到LOOP,等待T0中断 SETB TR1;启动T1,T1的启动受T0控制 SETB ET1;允许T

15、1中断HERE:AJMP HERE,25,PT0M2:MOV TMOD,#26H;初始化,T1为方式2定时,T0为方式1计数 MOV TL0,#0FFH;T0置初值 MOV TH0,#0FFH SETB TR0;启动T0 SETB ET0;允许T0中断 MOV TL1,#06H;T1置初值 MOV TH1,#06H CLR F0;把T0是否发生中断标志F0清0 SETB EA RET IT0P:CLR TR0;T0中断服务程序,停止T0计数 SETB F0;建立产生中断标志 RETI IT1P:CPL P1.0;T1中断服务,P1.0位取反 RETI 在T1定时中断服务程序IT1P中,省去了T

16、1中断服务程序中重新装入初值06H的指令。,26,【例6-4】利用T1的方式2对外部信号计数,要求每计满100个数,将P1.0取反。本例是方式2计数模式的应用。(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)程序设计,27,ORG 0000HLJMP MAI

17、NORG 001BH;T1中断服务程序入口 CPL P1.0;P1.0位取反 RETI ORG 0100H MAIN:MOV TMOD,#60H;设T1为方式2计数 MOV TL0,#9CH;T0置初值 MOV TH0,#9CH SETB TR1;启动T1 HERE:AJMP HERE,28,6.4.3 方式3的应用 T0 方式3时,TL0和TH0被分成两个独立的8位定时器/计数器。其中,TL0:8位定时器/计数器;TH0:8位定时器。当T1作串行口波特率发生器时,T0才设置为方式3。【例6-5】假设某89C51应用系统的两个外中断源已被占用,设置T1工作在方式2,作波特率发生器用。现要求增加

18、一个外部中断源,并控制P1.0引脚输出一个5kHz的方波。设系统时钟为6MHz。,29,(1)选择工作方式 TL0为方式3计数,把T0引脚(P3.4)作附加的外中断输入端,TL0初值设为0FFH,当检测到T0引脚电平出现负跳变时,TL0溢出,申请中断,这相当于跳沿触发的外部中断源。TH0为8位方式3定时,控制P1.0输出5kHz的方波信号。如图6-15所示。(2)初值计算 TL0的初值设为0FFH。5kHz的方波的周期为200s,TH0的定时时间为100s。TH0初值X计算如下:(28-X)210-6=10010-6 X=28-50=206=0CEH(3)程序设计,30,ORG 0000H L

19、JMP MAIN ORG 000BH;T0中断入口 LJMP TL0INT;跳T0(TL0)中断服务程序 ORG 001BH;在T0方式3时,TH0占用T1的中断 LJMP TH0INT;跳TH0中断服务程序 ORG 0100HMAIN:MOV TMOD,#27H;TL0方式3计数,TH0定时,T1方式2;定时(波特率发生器)MOV TL0,#0FFH;置TL0初值,计数用 MOV TH0,#0CEH;置TH0初值,定时用 MOV TL1,#dataL;data为波特率常数 MOV TH1,#dataH MOV TCON,#55H;允许T0中断 MOV IE,#9FHHERE:AJMP HER

20、E,31,;TL0中断处理,计数TL0INT:MOV TL0,#0FFH;TL0重新装入初值 SETB TR1;启动TR1,开始产生方波;THO中断处理,定时 TH0INT:MOV TH0,#0CEH;TH0中断服务程序,TH0重新装入初值 CPL P1.0;P1.0位取反输出 RETI,32,6.4.4 门控制位GATE的应用测量脉冲宽度 GATE1可使定时器/计数器T1的启动计数受/INT1的控制,可测量引脚/INT1(P3.3)上正脉冲的宽度(机器周期数)。,图6-16 利用GATE位测量正脉冲的宽度,33,ORG 0000HRESET:AJMP MAIN;复位入口转主程序 ORG 01

21、00H MAIN:MOV SP,#60H MOV TMOD,#90H;90H为T1方式1定时控制字 MOV TL1,#00H MOV TH1,#00HLOOP0:JB P3.3,LOOP0;等待/INT1为低,不为低,就一直循环 SETB TR1;如/INT1为低,启动T1LOOP1:JNB P3.3,LOOP1;/INT1低,则等待/INT1为高,T1不工作LOOP2:JB P3.3,LOOP2;/INT1高,T1计数开始工作 CLR TR1;/INT1低,停止T1计数 MOV A,TL1;T1计数值送A 将A中的T1计数值送显示缓冲区转换成显示的代码 LOOP3:LCALL DIR;调用显

22、示子程序DIR,显示T1计数值 AJMP LOOP3 执行程序,使/INT1引脚上出现的正脉冲宽度以机器周期数的形式显示在显示器上。,34,6.4.5 实时时钟的设计 1实时时钟实现的基本思想 如何获得1秒的定时,可把定时时间定为100ms,采用中断方式进行溢出次数的累计,计满10次,即得到秒计时。片内RAM中规定3个单元作为秒、分、时单元,具体安排如下:42H:“秒”单元;41H:“分”单元;40H:“时”单元 从秒到分,从分到时是通过软件累加并进行比较的方法来实现的。,35,(2)中断服务程序的设计中断服务程序主要功能是实现秒、分、时的计时处理。,2程序设计(1)主程序的设计 流程如图6-

23、17所示。,图6-17 时钟主程序流程图,36,ORG 0000H AJMP MAIN;跳至主程序 ORG 000BH AJMP IT0P;T0中断程序入口MAIN:MOV TMOD,#01H;设T0为方式1 MOV 20H,#0AH;装入中断次数,每次定时0.1秒 CLR A MOV 40H,A;“时”单元清0 MOV 41H,A;“分”单元清0 MOV 42H,A;“秒”单元清0 SETB ET0;允许T0申请中断 SETB EA;CPU开中断 MOV TH0,#3CH;给T0装入计数初值 MOV TL0,#0BOH SETB TR0;启动T0HERE:SJMP HERE,37,IT0P:

24、PUSH PSW;保护现场 PUSH A MOV TH0,#3CH;重新装入初值 MOV TL0,#0BOH DJNZ 20H,RETURN;1秒定时未到,跳至RETURN MOV 20H,#0AH;重置中断次数 MOV A,#01H;秒单元增1 ADD A,42H DA A;秒单元十进制调整 MOV 42H,A;秒单元BCD码存回 CJNZ A,#60,RETURN;未到60秒,则跳至RETURN MOV 42H,#00H;到60s,秒单元清0 MOV A,#01H;分单元增1 ADD A,41H DA A;分单元十进制调整 MOV 41H,A;分单元BCD码存回,38,CJNZ A,#60

25、,RETURN;未到60分,跳至RETURN MOV 41H,#00H;计满60分,分单元清0 MOV A,#01H;时单元增1 ADD A,40H MOV 40H,A;时单元存回 CJNZ A,#24,RETURN;未到24小时,跳至RETURN MOV 40H,#00H;时单元清0RETURN:POP A POP PSW RETI END,39,6.4.6 定时器/计数器作为外部中断源的使用方法 定时器/计数器选择为计数器模式时,定时器/计数器T0(或T1)设置为方式2(自动恢复常数方式)计数工作模式,计数器TH0、TL0初值均为0FFH,并允许T0中断,总中断开放。当T0引脚上发生负跳变

26、时,T0(或T1)计数器溢出,TF0(或TF1)置“1”,发出中断请求。利用这一特性,可以把T0(或T1)引脚作为外部中断请求输入引脚,而溢出标志TF0(或TF1)可作为外部中断请求标志。,40,初始化程序:ORG0000HAJMPIINI;跳到初始化程序IINI:MOV TMOD,#06H;设置T0为方式2MOV TL0,#0FFH;给计数器设置初值MOV TH0,#0FFH SETB ET0;允许T0中断 SETB EA;开中断 SETBTR0;启动T0,开始计数 当连在P3.4(T0引脚)的外部中断请求输入线上的电平发生负跳变时,TL0加1,产生溢出,TF0置“1”,向CPU发出中断请求

27、,同时TH0的内容0FFH送TL0,即TL0恢复初值0FFH,这样,P3.4脚相当于一个跳沿触发的外部中断请求源输入端。对P3.5也可做类似的处理。,41,6.4.7 运行中读定时器/计数器 在读取运行中的定时器/计数器时,需注意:若恰好出现TLx溢出向THx进位的情况,则读得的(TLx)值就完全不对。同样,先读(THx)再读(TLx)也可能出错。方法:先读(THx),后读(TLx),再读(THx)。若两次读得(THx)相同,则读的内容正确。若前后两次读的(THX)有变化,则再重复上述过程,若重复读得的内容相同,就应是正确的。下面是有关的程序,读得的(TH0)和(TL0)放置在R1和R0内。,42,RDTIME:MOV A,TH0;读(TH0)MOV R0,TL0;读(TL0)CJNE A,TH0,RDTIME;比较2次读得的(TH0);不相等则重复读 MOV R1,A;(TH0)送入R1中 RET,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号