第6章at89c52单片机的定时器计数器_第1页
第6章at89c52单片机的定时器计数器_第2页
第6章at89c52单片机的定时器计数器_第3页
第6章at89c52单片机的定时器计数器_第4页
第6章at89c52单片机的定时器计数器_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主讲教师赵晓安第6章AT89C52单片机的定时器/计数器在单片机实时应用系统中,往往需要实时时钟或对外部事件计数的功能。一般常用软件、专门的硬件电路或可编程定时器/计数器实现。

采用软件只能定时,且占用CPU的时间,降低了CPU的使用效率;

采用专门的硬件电路,参数调节不便;

采用可编程的定时器/计数器是最好的方法。

可以方便灵活地修改定时或计数的参数或方式

与CPU并行工作,大大提高了CPU的工作效率6.1定时器/计数器的结构6.2定时器/计数器T0和T1的控制6.3定时器/计数器的工作方式及应用6.4定时器/计数器T2第6章AT89C52单片机的定时器/计数器6.1定时器/计数器的结构T0(P3.4)T1(P3.5)TCONT0T2(P1.0)89C52CPUTH0TL0T1TH1TL1T2TH2TL2TMODT2CONT2MOD共同点:都是通过计数器计脉冲的个数来实现的定时方式与计数方式1、定时方式

T/C计数8051内部机器周期的个数,由计数个数可以计算出定时时间。每个机器周期使T/C的计数器增加1,直至计满回零后自动产生溢出中断请求,表示定时时间到。

fosc=12MHz时,Tcy=1us2、计数方式

T/C计数来自引脚T0(P3.4)和T1(P3.5)的外部脉冲信号的个数。输入脉冲由1变0的下降沿时,计数器的值增加1直到回零产生溢出中断,表示计数已达预期个数。

最高计数频率为振荡频率的1/24。即计数周期=2机器周期。不同点:6.2定时器/计数器的控制定时器/计数器的工作由TCON和TMOD控制。由软件把控制字写入TCON和TMOD,用来设置T/C0和T/C1的工作方式和控制功能。当8051系统复位时,TCON和TMOD所有位都被清0。一、工作模式寄存器TMOD(89H)TMOD用于控制T/C0和T/C1的工作模式,其各位的定义格式如下:1.M1和M0工作方式选择位这两位可形成四种编码,对应四种工作方式:

M1M0方式功能描述000为13位定时器/计数器,TL存放低5位,TH存高8位011为16位定时器/计数器102常数自动装入8位定时器/计数器113仅适于T/C0,两个8位定时器/计数器2.C/T计数/定时选择位

C/T=0,设为定时方式,对机器周期计数;

C/T=1,设为计数方式,对来自T0或T1引脚的外来脉冲计数。

3.GATE门控位(控制启动方式)

GATE=0时,T/C的启动只要用软件使TR0(或TR1)置1即可,而不管/INT0(或/INT1)的电平是高还是低。

GATE=1时,只有/INT0(或/INT1)引脚为高电平且由软件使TR0(或TR1)置1时,才启动T/C工作。也就是T/C的启动受双重控制。注意:TMOD不能位寻址,只能由字节设置T/C的工作方式,低半字节设定T/C0,高半字节设定T/C1。二、

控制寄存器TCON(88H)控制寄存器TCON除可字节寻址外,各位还可位寻址。各位定义及格式如下:1)TF1(TCON.7)T/C1的溢出标志位。当T/C1被允许计数后,T/C1从初值开始加1计数,回零时由高位产生溢出,由硬件自动置TF1为“1”,并向CPU请求中断,当CPU响应并进入中断服务程序后,TF1又被硬件自动清0。TF1也可以由程序查询和清0。2)TF0(TCON.5)T/C0溢出标志位。其功能同TF1。3)TR1(TCON.6)T/C1运行控制位。由软件置位或复位。当GATE(TMOD.7)为0时,

TR1为1时,启动T/C1计数;

TR1为0时,停止T/C1计数。4)TR0(TCON.4)T/C0运行控制位。其功能同TR1,只是GATE为TMOD.3。

5)IE1、IT1、IE0、IT0(TCON.3~TCON.0)

外部中断INT1、INT0的中断标志位和申请信号的触发方式控制位。

6.2.3定时器的四种工作方式TMOD中控制位C/T设置定时或计数功能;

M1M0位的设置选择四种工作方式,即方式0、方式1、方式2和方式3方式0、1和2时,T/C0和T/C1的工作相同

方式3时,T/C0和T/C1的工作不同方式0方式1方式2方式3TH0TL0T/C1TH1TL1T/C0方式0

高8位和低5位的一个13位计数器的运行方式当TL1的低5位溢出时,向TH1进位,而TH1溢出(回零)时向TF1标志进位(硬件置位TF1),并申请中断。还可以通过查询TF1是否置位来判断TH1是否回零溢出。图6-6T/C1(或T/C0)方式0结构启动控制

B=TR1A=TR1(/INT1+/GATE)利用这一特性可以测量在/INT1端出现的正脉冲的宽度

GATETR1INT1

启动情况00X停止01X启动10X停止11启动11停止

其中:1表示高电平,0表示低电平,X表示任意状态

方式1

方式1是一个16位定时器/计数器,见图6-7。方式1的结构几乎与方式0完全一样,唯一的差别是:方式1中的TH1(TH0)和TL1(TL0)均是8位的,构成16位计数器。图6-7T/C1(或T/C0)方式1结构

方式2

在方式2时,T/C被拆成一个8位的寄存器TH1(TH0)和一个8位计数器TL1(TL0),两者构成可以自动重装载的8位T/C,如图6-8所示。图6-8T/C1(或T/C0)方式2结构每当它计满回零时

一方面向CPU发出溢出中断请求,另一方面从TH1(或TH0)中重新获得初值并启动计数;也就是CPU自动将TH1(或TH0)中存放的初值重新装回到TL1(或TL0),并在此初值的基础上对TL1(或TL0)开始新一轮计数,周而复始,直到写入停止计数或更改工作方式命令为止。方式3

方式3下T/C0和T/C1功能就不同了。此时,TH0和TL0按两个独立的8位计数器工作(如图6-9所示)。T/C1只能按不中断的方式工作,常常利用它的定时功能作串行口波特率发生器(如图6-10所示)。T/C0方式3时,TL0占用了T/C0的C/T、GATE、TR0、TF0、T0(P3.4)和/INT0控制引脚,可设置为定时或计数方式。

TH0只有简单的内部定时功能,它占用了T/C1的TR1控制位和TF1中断标志位,其启动/关闭仅受TR1控制。

图6-9T/C0方式3结构在T/C0工作在方式3时,T/C1仍可设置为方式0~2。由于TR1和TF1已被T/C0(TH0)占用,计数开关已被接通,此时仅用T/C1的C/T来切换其定时或计数工作方式就可使T/C1工作。计数器(8位、13位或16位)回零溢出时,只能将输出送入串行口或用于不需要中断的场合。一般情况下,当T/C1用作串行口波特率发生器时,T/C0才设置为工作方式3。此时,常把T/C1设置为方式2用作波特率发生器。图6-10T/C1在T/C0方式3时的工作方式

1.初始化的步骤

AT89C52内部的T/C是可编程的,其工作方式和模式通过程序进行设定和控制,称为对T/C的初始化。初始化的步骤是:确定工作方式,即根据要求先给TMOD送一个方式控制字;计算计数初值/定时初值,并写入TH0、TL0或TH1、TL1中;根据需要,置位EA使CPU开放中断,同时置位ETx允许T/C中断。IP设定中断优先级;给TCON送命令控制字,即置位TRx启动T/C计数。

T/C的初始化2.计数器初值的计算

T/C在计数模式下,计数之前必须给它的计数器TH0、TL0或TH1、TL1选送计数初值。T/C的计数器是在计数初值的基础上加1计数的,当计数器回“0”时自动产生溢出,置位TFx中断标志,向CPU提出中断请求。设需要计数器计数的个数为X,计数初值为C,由此可得出如下计算计数初值的通式:计数初值:C=M-X(6-1)式中M为计数器的模值,该值和计数器的工作方式有关。213方式0

M=216

方式1(6-2)28方式2、33.定时器初值计算

在定时模式下,计数器对单片机振荡频率fosc经12分频后的机器周期进行加1计数,用X表示计数个数,M表示模,C表示定时初值,Tcy表示机器周期,则1Tcy=12/fosc,因此,定时时间T的计算公式为:

T=X·Tcy=(M-C)Tcy

定时初值公式C=M-T/Tcy

定时器的溢出率=1/T=fosc/(12·X)=fosc/(12·(M-C))解:(1)确定T/C0的工作方式要在P1.0输出周期为2ms的方波,只要使P1.0每隔1ms取反一次即可。

(2)送T/C0的方式控制字(TMOD)=00H,即T/C0定时,方式0,只由TR0启动,因为T/C1不用,高4位取0。即:00000000M0M1C/TGATEM0M1C/TGATET/C1不用,高4位取0只由TR0启动定时方式0[例1]利用T/C0方式0产生1ms的定时,在P1.0引脚上输出周期为2ms的方波。设单片机晶振频率fosc=12MHz。应用举例(3)计算定时初值

Tcy=12/fosc=12/(12×106)S=1us

计数个数:X=1ms/1us=1000

定时初值:C=(213-X)=8192-1000=7192D=1C18H=1110000011000B

高8位0E0H低5位18HTH0初值为0E0H,TL0初值为18H。若采用方式1,16位,则定时初值:C=65536-1000=64536=FC18HTH0初值为0FCH,TL0初值为18H

(4)

编程可以采用中断或查询两种方式编写程序。

1)中断方式当T/C0定时溢出时,TF0被置1,申请中断。编程使CPU以响应中断方式输出方波,效率比较高。

ORG0000HAJMPMAIN;转到主程序MAIN ORG000BHAJMPTC0S;转到T/C0的中断服务程序TC0S主程序:

ORG1000HMAIN:MOVSP,#6FHMOVTMOD,#00H;置T/C0为方式0,定时

MOVTH0,#0E0H;送计数初值

MOVTL0,#18HSETBET0;T/C0允许中断

SETBEA;CPU开中断

SETBTR0;启动T/C0定时

HERE:SJMPHERE;等待中断中断服务程序:

ORG1200HTC0S:MOVTH0,#0E0H;重新装入计数初值

MOVTL0,#18HCPLP1.0;输出方波

RETI;中断返回

END

ORG0000HMOVTMOD,#00H MOVTH0,#0E0HMOVTL0,#18HSETBTR0LOOP:JBCTF0,DO1SJMPLOOPDO1:MOVTH0,#0E0HMOVTL0,#18HCPLP1.0SJMPLOOPEND

2)

查询方式还可以采用查询TF0的方式处理T/C0定时溢出,编程简单,但效率较低。程序中查询采用JBCTF0,DO1指令,目的是当判到TF0=1后,必须用软件复位TF0,为下次计数器回零溢出做好准备,这条指令具有判TF0为1后清零的双重功能。方式最小定时最大定时01×1/fosc×128192×1/fosc×1211×1/fosc×1265536×1/fosc×122、31×1/fosc×12256×1/fosc×12最大计数值扩大计数个数和定时时间

[例]利用MCS-51单片机的T/C,产生电子时钟的1s基时,并且由P1.7输出2s的方波。(fosc=12MHz)焦点:16位计数器最大定时65.536ms。要产生比这个时间长的定时,怎么办?1.两个定时器级联-一个T/C定时,回0溢出时,使P1.0输出一个负脉冲送到另一个T/C的外部脉冲输入端用以计数。2.硬件定时加软件计数相结合

首先选T0为模式2,外部事件计数方式。当P3.4引脚上的电平发生负跳变时,T0计数器加1,溢出标志TF0置1;然后改变T0为500us定时工作方式,并使P1.0输出由1变为0。T0定时到产生溢出,使P1.0引脚恢复输出高电平,T0又恢复外部事件方式。[例2]

当T0(P3.4)引脚上的电平发生负跳变时,从P1.0输出一个500us的同步脉冲。请编程实现该功能。

⑴模式选择T0工作在外部事件计数方式,当计数到28时,再加1计数器就会溢出。设计数初值为X,当再出现一次外部事件时,计数器溢出。则

X+1=28

X=28-1=11111111B=0FFH

T0工作在定时方式时,设晶振频率为6MHz,机器周期为2us。因此,初值X为(28-X)=500us/2usX=28-250=6=06H

⑵计数初值

START:MOVTMOD,#06H;设置T0为方式2,外部计数

MOVTH0,#0FFH;计1个数

MOVTL0,#0FFHSETBTR0;启动计数

LOOP1:JBCTF0,PTFO1;查询溢出标志,TF0=1时转移同时清除标志

SJMPLOOP1PTFO1:CLRTR0;停止计数

MOVTMOD,#02H;设置T0为方式2,定时方式

MOVTH0,#06H;定时500us

MOVTL0,#06H

CLRP1.0;P1.0清0

SETBTR0;启动定时LOOP2:JBCTF0,PTFO2;查询溢出标志,TF0=1时转移同时清除标志

SJMPLOOP2PTFO2:SETBP1.0;P1.0置1(到了第一个500us)

CLRTR0;停止计数

SJMPSTART⑶程序清单

(1)送方式控制字(TMOD)=10010000B=90H;T/C1定时,方式1,GATE=1。(2)计算初值由于被测正脉冲宽度未知,假设宽度<=65.536ms,fosc=12MHz,则计数个数:X=65536(最大)定时初值:C=65536-X=65536-65536=0(TH1)=00H(TL1)=00H

[例3]利用GATE门控位测量从INT1引脚输入的正脉冲宽度。置1TR1 TH1TL1从0开始计数清0TR1,停止T/C1计数被测脉宽P3.3INT1图6-12脉冲测试原理

ORG0000HMAIN:MOVSP,#6FMOVTMOD,#90HMOVTL1,#00HMOVTH1,#00HLOOP:JBP3.3,LOOPSETBTR1;由1变0时启动TR1LOOP1:JNBP3.3,LOOP1;等待正脉冲到来并开始计数LOOP2:JBP3.3,LOOP2CLRTR1;由1变0时停止计数MOV30H,TL1MOV31H,TH1......ACALLCalc;计算子程序略

ACALLDIR;显示子程序略

SJMP$END

程序清单:本例涉及到了定时器与中断的联合应用。时钟就是以秒、分、时为单位进行计时。

(1)实现时钟计时的基本方法①计算计数初值。时钟计时的最小单位是秒,但使用单片机定时器/计数器进行定时,即使按方式1工作,其最大定时时间也只能达131ms.

鉴于此,可把定时器的定时时间定为100ms,这样,计数溢出10次即得到时钟计时的最小单位-----秒;而10次计数可用软件方法实现。假定使用定时器T1,以工作模式1进行100ms的定时。如单片机晶振频率为6MHZ,为得到100ms定时,设计数初值为X,则补充:设计定时时钟程序②采用中断方式进行溢出次数的累计,记满10次即得到秒计时。③从秒到分和从分到时的计时是通过累加和数值比较实现的。④时钟显示及显示缓存区部分留给读者自己设计。

(2)程序流程及程序清单①主程序(MAIN)的主要功能是进行定时器T1的初始化编程并启动T1,然后通过反复调用显示子程序,等待100ms定时中断的到来。其流程图如图6-13所示。②中断服务程序(PITO)的主要功能是进行计时操作。程序开始先判断计数溢出是否满了10次,不满10次表明还没达到最小计时单位-----秒,中断返回;满10次表示已达到最小计时单位----秒,程序继续往下运行,进行计时操作。要求满1秒则“秒位”32H单元内容加1,满60s则“分位”31H单元内容加1,满60min则“时位”30H单元内容加1,满24h则将30H,31H,32H的内容全部清0。

设T1为模式1设中断次数为10清计时单元

调用显示子程序启动T1开中断图时钟主程序流程源程序如下:

ORG0000HAJMPMAIN;上电,转向主程序

ORG001BH;T1的中断入口地址

AJMPSERVE;转向中段服务程序MAIN:MOVTMOD,#10H;设T1工作于模式1

MOV20H,#0AH;装入中断次数

CLRAMOV30H,A;时单元清0

MOV31H,A;分单元清0

MOV32H,A;秒单元清0

SETBET1;允许T1中断

SETBEA;允许CPU中断

MOVTH1,#3CHMOVTL1,#0B0H;赋计数初值

SETBTR1;启动定时器T1

SJMP$;等待中断(可反复调用显示子程序)SERVE:PUSHPSWPUSHACC;保护现场

MOVTH1,#3CHMOV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论