文档详情

C51的定时器计数器.ppt

san****019
实名认证
店铺
PPT
435KB
约43页
文档ID:15670193
C51的定时器计数器.ppt_第1页
1/43

89C51定时/计数器 定时/计数器控制寄存器 定时/计数器工作方式 定时/计数器的应用,第6章 89C51的定时器/计数器,定时/计数器是单片机系统一个重要的部件,其工作方式灵活、编程简单、使用方便,可用来实现定时控制、延时、频率测量、脉宽测量、信号发生、信号检测等此外,定时/计数器还可作为串行通信中波特率发生器89C51有两个可编程的定时器/计数器T1、T0 2种工作模式: (1)计数器工作模式 (2)定时器工作模式 4种工作方式(方式0-方式3)6.1 定时器/计数器的结构 TMOD:选择定时器/计数器T0、T1的工作模式和工作方式 TCON:控制T0、T1的启动和停止计数,同时包含了T0、T1的状态定时器:对片内机器时钟(周期方波)进行计数 计数器:对Tx引脚输入的负脉冲进行计数,89C51单片机内部有两个定时/计数器T0和T1,其核心是计数器,基本功能是加1 对外部事件脉冲(下降沿)计数,是计数器;对片内机周脉冲计数,是定时器 计数器由二个8位计数器组成 定时时间和计数值可以编程设定,其方法是在计数器内设置一个初值,然后加1计满后溢出调整计数器初值,可调整从初值到计满溢出的数值,即调整了定时时间和计数值。

定时/计数器作为计数器时,外部事件脉冲必须从规定的引脚输入且外部脉冲的最高频率不能超过时钟频率的1/246.1.1 工作方式控制寄存器TMOD,TMOD用于设定定时/计数器的工作方式 低4位用于控制T0,高4位用于控制T1 M1M0 工作方式选择位, C/T 计数/定时方式选择位 C/T=1,计数工作方式,对外部事件脉冲计数,用作计数器 C/T=0,定时工作方式,对片内机周脉冲计数,用作定时器 GATE 门控位 GATE=0,运行只受TCON中运行控制位TR0/TR1的控制 GATE=1,运行同时受TR0/TR1和外中断输入信号的双重控制 只有当INT0/INT1=1且TR0/TR1=1,T0/T1才能运行 TMOD字节地址89H,不能位操作,设置TMOD须用字节操作指令6.1.2 定时器/计数器控制寄存器TCON,TCON低4位与外中断 、 有关,已在中断中叙述 高4位与定时/计数器T0、T1有关 TF1:定时/计数器T1溢出标志 TF0:定时/计数器T0溢出标志 TR1:定时/计数器T1运行控制位TR1=1,T1运行;TR1=0,T1停 TR0:定时/计数器T0运行控制位。

TR0=1,T0运行;TR0=0,T0停 TCON的字节地址为88H,每一位有位地址,均可位操作6.2 定时器/计数器的4种工作方式, 工作方式0 13位计数器,由TL0低5位和TH0 8位组成,TL0低5位计数满时不向TL0第6位进位,而是向TH0进位,13位计满溢出,TF0置“1”最大计数值213 = 8192 工作方式1 16位计数器,最大计数值为216 = 65536当fosc=12MHZ,最大定时65536 S,而用方式0最大定时时间为8192 S. 工作方式2 8位计数器,仅用TL0计数,最大计数值为28= 256,计满溢出后,一方面进位TF0,使溢出标志TF0 = 1;另一方面,使原来装在TH0中的初值装入TL0 优点:定时初值可自动恢复,TH0中存放初值;缺点:计数范围小 适用于需要重复定时,而定时范围不大的应用场合 工作方式3 方式3仅适用于T0,T1无方式3 T0方式3 在方式3情况下,T0被拆成二个独立的8位计数器TH0、TL0 TL0可以为定时/计数器; TH0只能作为8位定时器 TL0使用T0原有的控制寄存器资源:TF0,TR0,GATE,C/T,INT0,组成一个8位的定时/计数器; TH0借用T1的中断溢出标志TF1,运行控制开关TR1,只能对片内机周脉冲计数,组成另一个8位定时器(不能用作计数器)。

T0方式3情况下的T1 T1由于其TF1、TR1被T0的TH0占用,计数器溢出时,只能将输出信号送至串行口,即用作串行口波特率发生器6.3 计数器模式对输入信号的要求 外部计数脉冲的最高频率为系统振荡器频率的1/24,例如选用6MHz频率的晶体,则可输入250KHz的外部脉冲选用12MHz频率的晶体,则可输入500KHz的外部脉冲 输入信号的高、低电平至少要保持一个机器周期 如图6-12所示,图中Tcy为机器周期图6-12,6.4 定时器/计数器的编程和应用 4种工作方式中,方式0与方式1基本相同,由于方式0是为兼容MCS-48而设,初值计算复杂,在实际应用中,一般不用方式0,而采用方式1其中: N与工作方式有关: 方式0时,N=13; 方式1时,N=16; 方式2、3时,N=8 机周时间与主振频率有关:机周时间=12/fosc fosc=12MHZ时,1机周=1S; fosc=6MHZ 时,1机周=2S 计算定时/计数初值,89C51定时/计数初值计算公式:,解:工作方式0: 213500S/2S=8192-250=7942=1F06H 1F06H化成二进制: 1F06H=0001 1111 0000 0110B =000 11111000 00110 B 其中:低5位00110前添加3位000送入TL0 TL0=000 00110B=06H; 高8位11111000B送入TH0 TH0=11111000B=F8H。

计算定时/计数初值】 已知晶振6MHz,要求定时0.5ms,试分别求出T0工作于方式0、方式1、方式2、方式3时的定时初值 工作方式1: T0初值 =216-500s/2s=65536250=65286=FF06H TH0=FFH;TL0=06H 工作方式2: T0初值 =28-500s/2s=256-250=6 TH0=06H;TL0=06H 工作方式3: T0方式3时,被拆成两个8位定时器,定时初值可分别计算,计算方法同方式2两个定时初值一个装入TL0,另一个装入TH0因此: TH0=06H;TL0=06H从上例中看到,方式0时计算定时初值比较麻烦,根据公式计算出数值后,还要变换一下,容易出错,不如直接用方式1,且方式0计数范围比方式1小,方式0完全可以用方式1代替,方式0与方式1相比,无任何优点 定时/计数器应用步骤, 合理选择定时/计数器工作方式 计算定时/计数器定时初值(按上述公式计算) 编制应用程序 定时/计数器的初始化 包括定义TMOD、写入定时初值、设置中断系统、启动定时/计数器运行等 正确编制定时/计数器中断服务程序 注意是否需要重装定时初值,若需要连续反复使用原定时时间,且未工作在方式2,则应在中断服务程序中重装定时初值。

6.4.1 方式1应用 例6-1 假设系统时钟频率采用6MHz,要在P1.0上输出一个周期为2ms的方波,如图6-13所示方波的周期用T0来确定,让T0每隔1ms计数溢出1次(每1ms产生一次中断),CPU响应中断后,在中断服务程序中对P1.0取反1)计算初值X 设初值为X,则有: (216-X)210-6=110-3 216-X=500 X=65036 X化为16进制,即X=FE0CH=1111111000001100B 所以,T0的初值为: TH0=0FEH TL0=0CH (2)初始化程序设计 对寄存器IP、IE、TCON、TMOD的相应位进行正确设置,将计数初值送入定时器中3)程序设计 中断服务程序除产生方波外,还要注意将计数初值重新装入定时器中,为下一次中断作准备参考程序: ORG 0000H RESET: AJMP MAIN ;转主程序 ORG 000BH ;T0的中断入口 AJMP IT0P;转T0中断处理程序IT0P ORG 0100H MAIN: MOV SP,#60H ;设堆栈指针 MOV TMOD,#01H;设置T0为方式1 ACALL PT0M0 ;调用子程序PT0M0 HERE: AJMP HERE ;自身跳转 PT0M0: MOV TL0,#0CH;T0中断服务程序,T0重新置初值 MOV TH0,#0FEH SETB TR0 ;启动T0 SETB ET0 ;允许T0中断 SETB EA ;CPU开中断 RET ITOP: MOV TL0,#0CH ;T0中断服务子程序,T0置初值 MOV TH0,#0FEH CPL P1.0 ;P1.0的状态取反 RETI,查询方式的参考程序: MOV TMOD,#01H ;设置T0为方式1 LOOP: SETB TR0 ;接通T0 MOV TH0,#0FEH ;T0置初值 MOV TL0,# 0CH LOOP1:JNB TF0,LOOP1 ;查询TF0标志 CLR TR0 ;T0溢出,关闭T0 CPL P1.0 ;P1.0的状态求反 SJMP LOOP,例6-2 假设系统时钟为6MHz,编写定时器T0产生1秒定时的程序。

(1)T0工作方式的确定 定时时间较长,采用哪一种工作方式? 由各种工作方式的特性,可计算出: 方式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 ;上电,转主程序入口MAIN ORG 000BH ;T0的中断入口 LJMP IT0P ;转T0中断处理程序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,6.4.2 方式2的应用 方式2是一个可以自动重新装载初值的8位计数器/定时器。

这种工作方式可省去程序中重装初值的指令,并可产生相当精确的定时时间 例6-3 当T0(P3.4)引脚上发生负跳变时,从P1.0引脚上输出一个周期为1ms的方波,如图6-13所示系统时钟为6MHz),(1)工作方式选择 T0为方式1计数,初值 0FFFFH,即外部计数输入端T0(P3.4)发生一次负跳变时,T0加1且溢出,溢出标志TF0置“1”,发中断请求在进入T0中断程序后,把TF0标志置“1”,说明T0脚已接收了负跳变信号 T1定义为方式2定时在T0脚发生一次负跳变后,启动T1每500s产生一次中断,在中断服务程序中对P1.0求反,使P1.0产生周期1ms的方波 (2)计算T1初值 设T1的初值为X: 则 (28-X)210-6=510-4 X=28-250=6=06H,(3)程序设计 ORG 0000H RESET: LJMP MAIN ;复位入口转主程序 ORG 000BH JMP IT0P ;转T0中断服务程序 ORG 001BH LJMP IT1P ;转T1中断服务程序 ORG 0100H MAIN: MOV SP,#60H ACALL PT0M2 ;调用对T0,T1初始化子程序 LOOP: MOV C,TF0 ;T0产生过中断了吗,产生过 ;中断,则TF0=1 JNC LOOP;T0没有产生过中断,则跳到 ;LOOP,等待T0中断 SETB TR1 ;启动T1 SETB ET1 ;允许T1中断 HERE: AJMP HERE,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 TF0;把T0已发生中断标志TF0清0 SETB EA RET IT0P: CLR TR0 ;T0中断服务程序,停止T0计数 SETB TF0 ;建立产生中断标志 RETI IT1P: CPL P1.0;T1中断服务,P1.0位取反 RETI 在T1定时中断服务程序IT1P中,省去了T1中断服务程序中重新装入初值06H的指令。

例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)程序设计 ORG 0000H LJMP MAIN ORG 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,6.4.3 方式3的应用 T0 方式3时,TL0和TH0被分成两个独立的8位定时器/计数器其中, TL0:8位定时器/计数器; TH0:8位定时器 当T1作串行口波特率发生器时,T0才设置为方式3。

例6-5 假设某89C51应用系统的两个外中断源已被占用,设置T1工作在方式2,作波特率发生器用现要求增加一个外部中断源,并控制P1.0引脚输出一个5kHz的方波设系统时钟为6MHz1)选择工作方式 TL0为方式3计数,把T0引脚(P3.4)作附加的外中断输入端,TL0初值设为0FFH,当检测到T0引脚电平出现负跳变时,TL0溢出,申请中断,这相当于跳沿触发的外部中断源 TH0为8位方式3定时,控制P1.0输出5kHz的方波信号如图6-15所示 (2)初值计算 TL0的初值设为0FFH 5kHz的方波的周期为200s,TH0的定时时间为100sTH0初值X计算如下: (28-X)210-6=110-4 X=28-100=156=9CH,(3)程序设计 ORG 0000H LJMP MAIN ORG 000BH ;T0中断入口 LJMP TL0INT;跳T0(TL0)中断服务程序 ORG 001BH ;在T0方式3时,TH0占用T1的中断 LJMP TH0INT;跳TH0中断服务程序 ORG 0100H MAIN: MOV TMOD,#27H ;TL0方式3计数,TH0定时,T1方式2;定时(波特率发生器) MOV TL0,#0FFH ;置TL0初值 MOV TH0,#9CH;置TH0初值 MOV TL1,#dataL ;data为波特率常数 MOV TH1,#dataH MOV TCON,#55H;允许T0中断 MOV IE,#9FH;启动T1 中断处理 TL0INT:MOV TL0,#0FFH ;TL0中断服务程序;TL0重新装入初值 中断处理 TH0INT:MOV TH0,#9CH ;TH0中断服务程序,TH0重新装入初值 CPL P1.0 ;P1.0位取反输出 RETI,6.4.4 实时时钟的设计 1实时时钟实现的基本思想 如何获得1秒的定时,可把定时时间定为100ms,采用中断方式进行溢出次数的累计,计满10次,即得到秒计时。

片内RAM中规定3个单元作为秒、分、时单元,具体安排如下:42H:“秒”单元 ;41H:“分”单元;40H:“时”单元 从秒到分,从分到时是通过软件累加并进行比较的方法来实现的 2程序设计 (1)主程序的设计 流程如图6-17所示2)中断服务程序的设计 中断服务程序主要功能是实现秒、分、时的计时处理参考程序略图6-17,图6-18,6.4.5 定时器/计数器作为外部中断源的使用方法 定时器/计数器选择为计数器模式时,定时器/计数器T0(或T1)设置为方式2(自动恢复常数方式)计数工作模式,计数器TH0、TL0初值均为0FFH,并允许T0中断,总中断开放 当T0引脚上发生负跳变时,T0(或T1)计数器溢出,TF0(或TF1)置“1”,发出中断请求利用这一特性,可以把T0(或T1)引脚作为外部中断请求输入引脚,而溢出标志TF0(或TF1)可作为外部中断请求标志 初始化程序: ORG0000H AJMPIINI;跳到初始化程序 ,IINI:MOV TMOD,#06H;设置T0为方式2 MOV TL0,#0FFH;给计数器设置初值 MOV TH0,#0FFH SETB ET0;允许T0中断 SETB EA;开中断 SETBTR0;启动T0,开始计数 当连在P3.4(T0引脚)的外部中断请求输入线上的电平发生负跳变时,TL0加1,产生溢出,TF0置“1”,向CPU发出中断请求,同时TH0的内容0FFH送TL0,即TL0恢复初值0FFH,这样,P3.4脚相当于一个跳沿触发的外部中断请求源输入端。

对P3.5也可做类似的处理6.4.6 运行中读定时器/计数器 在读取运行中的定时器/计数器时,需注意:若恰好出现TLx溢出向THx进位的情况,则读得的(TLx)值就完全不对同样,先读(THX)再读(TLX)也可能出错 方法:先读(THx),后读(TLx),再读(THx)若两次读得(THx)相同,则读的内容正确 若前后两次读的(THx)有变化,则再重复上述过程,若重复读得的内容相同,就应是正确的下面是有关的程序,读得的(TH0)和(TL0)放置在R1和R0内 RDTIME:MOV A,TH0;读(TH0) MOV R0,TL0;读(TL0) CJNE A,TH0,RDTIME;比较2次读得的(TH0) ;不相等则重复读 MOV R1,A;(TH0)送入R1中 RET,定时/计数器的初始化编程及应用(C51),一定时/计数器的编程,MCS-51单片机定时/计数器初始化过程如下: 1根据要求选择方式,确定方式控制字,写入方式控制寄存器TMOD 2根据要求计算定时/计数器的计数值,再由计数值求得初值,写入初值寄存器 3根据需要开放定时/计数器中断(后面须编写中断服务程序) 4设置定时/计数器控制寄存器TCON的值,启动定时/计数器开始工作。

5等待定时/计数时间到,到则执行中断服务程序;如用查询处理则编写查询程序判断溢出标志,溢出标志等于1,则进行相应处理二定时/计数器的应用,通常利用定时/计数器来产生周期性的波形利用定时/计数器产生周期性波形的基本思想是:利用定时/计数器产生周期性的定时,定时时间到则对输出端进行相应的处理如产生周期性的方波只须定时时间到对输出端取反一次即可例 】 设系统时钟频率为12MHZ,用定时/计数器T0编程实现从P1.0输出周期为500s的方波 分析:从P1.0输出周期为500s的方波,只须P1.0每250s取反一次则可当系统时钟为12MHZ,定时/计数器T0工作于方式2时,最大的定时时间为256s,满足250s的定时要求,方式控制字应设定为00000010B(02H)系统时钟为12MHZ,定时250s,计数值N为250,初值X=256-250=6,则TH0=TL0=06H汇编程序: ORG 0000H LJMP MAIN ORG 000BH;中断处理程序 CPL P1.0 RETI ORG 0100H ;主程序 MAIN:MOV TMOD,#02H MOV TH0,#06H MOV TL0,#06H SETB EA SETB ET0 SETB TR0 SJMP $ END,C语言程序: # include //包含特殊功能寄存器库 sbit P1_0=P10; void main() TMOD=0 x02; TH0=0 x06;TL0=0 x06; EA=1;ET0=1; TR0=1; while(1); void time0_int(void) interrupt 1 //中断服务程序 P1_0=!P1_0; ,(1)采用中断处理方式的程序:,(2)采用查询方式处理的程序,汇编程序: ORG 0000H LJMP MAIN ORG 0100H ;主程序 MAIN:MOV TMOD,#02H MOV TH0,#06H MOV TL0,#06H SETB TR0 LOOP:JBC TF0,NEXT ;查询计数溢出 SJMP LOOP NEXT:CPL P1.0 SJMP LOOP SJMP $ END,C语言程序: # include //包含特殊功能寄存器库 sbit P1_0=P10; void main() char i; TMOD=0 x02; TH0=0 x06;TL0=0 x06; TR0=1; for(;;) if (TF0) TF0=0; P1_0=! P1_0; //查询计数溢出 ,如果定时时间大于65536s,这时用一个定时/计数器直接处理不能实现,这时可用两个定时/计数器共同处理或一个定时/计数器配合软件计数方式处理。

例】设系统时钟频率为12MHZ,编程实现从P1.1输出周期为1s的方波 根据上例的处理过程,这时应产生500ms的周期性的定时,定时到则对P1.1取反就可实现由于定时时间较长,一个定时/计数器不能直接实现,可用定时/计数器T0产生周期性为10ms的定时,然后用一个寄存器R2对10ms计数50次或用定时/计数器T1对10ms计数50次实现系统时钟为12MHZ,定时/计数器T0定时10ms,计数值N为10000,只能选方式1,方式控制字为00000001B(01H),初值X: X=65536-10000=55536=1101100011110000B 则TH0=11011000B=D8H,TL0=11110000B=F0H1)用寄存器R2作计数器软件计数,中断处理方式 汇编程序: ORG 0000H LJMP MAIN ORG 000BH LJMP INTT0 ORG 0100H MAIN:MOV TMOD,#01H MOV TH0,#0D8H MOV TL0,#0F0H MOV R2,#00H SETB EA SETB ET0 SETB TR0 SJMP $ INTT0:MOV TH0,#0D8H,MOV TL0,#0F0H INC R2 CJNE R2,#32H,NEXT CPL P1.1 MOV R2,#00H NEXT:RETI END,C语言程序: # include //包含特殊功能寄存器库 sbit P1_1=P11; char i ; void main() TMOD=0 x01; TH0=0 xD8; TL0=0 xf0; EA=1; ET0=1; i=0; TR0=1; while(1); void time0_int(void) interrupt 1 //中断服务程序 TH0=0 xD8; TL0=0 xf0; i++; if ( i = =50) P1_1=! P1_1; i=0; ,OVER!,。

下载提示
相关文档
正为您匹配相似的精品文档