AT89S52定时器计数器.docx

上传人:b****3 文档编号:26914551 上传时间:2023-06-24 格式:DOCX 页数:29 大小:64.47KB
下载 相关 举报
AT89S52定时器计数器.docx_第1页
第1页 / 共29页
AT89S52定时器计数器.docx_第2页
第2页 / 共29页
AT89S52定时器计数器.docx_第3页
第3页 / 共29页
AT89S52定时器计数器.docx_第4页
第4页 / 共29页
AT89S52定时器计数器.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

AT89S52定时器计数器.docx

《AT89S52定时器计数器.docx》由会员分享,可在线阅读,更多相关《AT89S52定时器计数器.docx(29页珍藏版)》请在冰豆网上搜索。

AT89S52定时器计数器.docx

AT89S52定时器计数器

第6章       AT89S52定时器/计数器

本章要点:

Ø 掌握定时器/计数器的定义

Ø 理解定时器/计数器的内部结构

Ø 掌握4种工作方式的初始化编程方法

Ø 学会使用定时器/计数器编写计数、定时应用程序的方法

 

AT89S52单片机内部有三个16位可编程的定时器/计数器,即定时器T0、定时器T1和定时器T2。

它们既可用作定时器方式,又可用作计数器方式,且都有4种工作方式可供选择。

但T0、T1与T2的4种工作方式不同,将在本节内详细介绍。

  定时器/计数器的结构与功能

主要介绍定时器0〔T0〕和定时器1〔T1〕的结构与功能。

图是定时器/计数器的结构框图。

由图可知,定时器/计数器由定时器0、定时器1、定时器方式存放器TMOD和定时器控制存放器TCON组成。

定时器0,定时器1是16位加法计数器,分别由两个8位专用存放器组成:

定时器0由TH0和TL0组成,定时器1由TH1和TL1组成。

 

 

图6.1 定时器/计数器结构框图

 

TL0、TL1、TH0、TH1的访问地址依次为8AH~8DH,每个存放器均可单独访问。

定时器0或定时器1用作计数器时,对芯片引脚T0〔〕或T1〔〕上输入的脉冲计数,每输入一个脉冲,加法计数器加1;其用作定时器时,对内部机器周期脉冲计数,由于机器周期是定值,故计数值确定时,时间也随之确定。

TMOD、TCON与定时器0、定时器1间通过内部总线与逻辑电路连接,TMOD用于设置定时器的工作方式,TCON用于控制定时器的启动与停止。

       计数功能

计数方式时,T的功能是计来自T0(P3.4)T1(P3.5)的外部脉冲信号的个数。

输入脉冲由1变0的下降沿时,计数器的值增加1直到回零产生溢出中断,表示计数已达预期个数。

外部输入信号的下降沿将触发计数,识别一个从“1〞到“0〞的跳变需2个机器周期,所以,对外部输入信号最高的计数速率是晶振频率的1/24。

假如晶振频率为6MHz,如此计数脉冲频率应低于1/4MHz。

当计数器满后,再来一个计数脉冲,计数器全部回0,这就是溢出。

脉冲的计数长度与计数器预先装入的初值有关。

初值越大,计数长度越小;初值越小,计数长度越大。

最大计数长度为65536〔216〕个脉冲〔初值为0〕。

       定时方式

定时方式时,T记录单片机内部振荡器输出的脉冲(机器周期信号)个数。

   每一个机器周期使T0或T1的计数器增加1,直至计满回零自动产生溢出中断请求。

定时器的定时时间不仅与定时器的初值有关,而且还与系统的时钟频率有关。

在机器周期一定的情况下,初值越大,定时时间越短;初值越小,定时时间越长。

最长的定时时间为65536〔216〕个机器周期〔初值为0〕。

 定时器/计数器控制存放器

与对定时器/计数器有关的控制存放器共有4个:

TMOD、TCON、IE、IP。

IE、IP已在中断一节中介绍,这里不再赘述。

       定时器/计数器控制存放器TCON

特殊功能存放器TCON用于控制定时器的操作与对定时器中断的控制。

其各位定义格式如下。

其中D0~D3位与外部中断有关,已在中断系统一节中介绍。

TF0和TF1:

定时器/计数器溢出标志位。

当定时器/计数器0〔或定时器/计数器1〕溢出时,由硬件自动使TF0〔或TF1〕置1,并向CPU申请中断。

CPU响应中断后,自动对TF1清零。

TF1也可以用软件清零。

TR0和TR1:

定时器/计数起运行控制位。

TR0〔或TR1〕=0,停止定时器/计数器0〔或定时器/计数器1〕工作。

TR0〔或TR1〕=1,启动定时器/计数器0〔或定时器/计数器1〕工作。

可由软件置1〔或清0〕来启动〔或关闭〕定时器/计数器,使定时器/计数器开始计数。

用指令SETB〔或CLR〕使运行控制位置1〔或清0〕。

       工作方式存放器TMOD

TMOD用于控制定时器/计数器的工作方式。

字节地址为89H,不可位寻址,只能用字节设置其内容。

其格式如下:

 

 

定时器/计数器1

定时器/计数器0

位序

D7

D6

D5

D4

D3

D2

D1

D0

位标志

GATE

C/

M1

M0

GATE

C/

M1

M0

 

其中,低4位用于T0,高4位用于T1的。

GATE:

门控位。

GATE=0,只要用软件使TR0〔或TR1〕置1就能启动定时器/计数器0〔或定时器/计数器1〕;

GATE=1,只有在

〔或

〕引脚为高电平的情况下,且由软件使TR0〔或TR1〕置1时,才能启动定时器/计数器0〔或定时器/计数器1〕工作。

不管GATE处于什么状态,只要TR0〔或TR1〕=0定时器/计数器便停止工作。

C/

定时器/计数器工作方式选择位。

C/

=0,为定时工作方式;

C/

=1,为计数工作方式。

M0、M1:

工作方式选择位,确定4种工作方式。

如表所示。

 

 

表6.1 定时器/计数器工作方式选择

M1

M0

工作方式

功能说明

0

0

1

13位计数器

0

1

2

16位计数器

1

0

3

自动再装入8位计数器

1

1

4

定时器0:

分成两个8位计数器定时器1:

停止计数

 

【例】设置定时器1工作于方式1,定时工作方式与外部中断无关,如此M1=0,M0=1,GATE=0,因此,高4位应为0001;定时器0未用,低4位可随意置数,但低两位不可为11〔因方式3时,定时器1停止计数〕,一般将其设为0000。

因此,指令形式为:

MOV TMOD,#10H

 定时器/计数器工作方式与程序设计

通过对特殊功能存放器TMOD中的设置M1、M0两位的设置来选择四种工作方式,定时器/计数器0、1和2的工作方式一样,方式3的设置差异较大。

       工作方式0

工作方式存放器TMOD中的M1M0为:

00。

定时器/计数器T0工作在方式0时,16位计数器只用了13位,即TH0的高8位和TL0的低5位,组成一个13位定时器/计数器。

当TL0的低5位计满溢出时,向TH0进位,TH0溢出时,对中断标志位TF0置位,向CPU申请中断。

定时器/计数器0方式0的逻辑结构如下列图。

 

 

1.工作在定时方式

C/

=0,定时器对机器周期计数。

定时器在工作前,应先对13位的计数器赋值,开始计数时,在初值的根底上进展减1计数。

定时时间的计算公式为:

定时时间=〔213–计数初值〕×晶振周期×12

或            定时时间=〔213–计数初值〕×机器周期

假如晶振频率为12MHz,如此最短定时时间为

[213-(213-1)]×(1/12)×10-6×12=1μs

最长定时时间为

〔213-0〕×〔1/12〕×10-6×12=8192μs

2.工作在计数方式

C/

=1,13位计数器对外部输入信号进展加1计数。

利用

由0变为1时,开始计数,

由1变为0时,停止计数,可以测量在

端出现的正脉冲的宽度。

计数值的X围是1~213=8192(个外部脉冲)。

【例】假设AT89S52单片机晶振频率为12MHz,要求定时时间8ms,使用定时器T0,工作方式0,计算定时器初值X。

解:

∵t=〔213–X〕×机器周期

      当单片机晶振频率为12MHz时,机器周期=1μs

   ∴8×103=〔213–X〕×1

      X=8192-8000=192

      转换成二进制数为:

11000000B

【例】假设AT89S52单片机晶振频率为12MHz,所需定时时间为250μs,当T0工作在方式0时T0计数器的初值是多少?

解:

∵t=〔213–X〕×机器周期

      当单片机晶振频率为12MHz时,机器周期=1μs

   ∴250=〔213–X0〕×1

      X0=8192-250=7942

      转换成二进制数为:

【例】利用T0方式0产生1ms的定时,在引脚上输出周期为2ms的方波。

设单片机晶振频率fosc=12MHz。

解:

〔1〕解题思路

要在引脚输出周期为2ms的方波,只要使每隔1ms取反一次即可。

执行指令为。

〔2〕确定工作方式:

 方式0 TMOD=00H

 

C/

=0:

T0为定时功能;〔D2位〕

GATE=0,只要用软件使TR0〔或TR1〕置1就能启动定时器T0〔或T1〕;

   M1M0=00,工作方式0

   ∴TMOD的值为=00H

可取任意值,因T1不用,这里取0值。

   使用MOV TMOD,#00H即可设定T0的工作方式

〔3〕计算1ms定时时T0的初值

机器周期 T=1/fosc×12=1μs

计数个数:

X=1ms/lμs=1000

设T0的计数初值为x0,如此x0=(213一X)s

                         =8192—1000

                         =7192D

 转换成二进制数为:

11100000 11000B 

                                     高8位  低5位

  将高8位11100000=0E0H装入TH0

  将低5位11000=18H装入TL0

 

 

 

           1                                      1

   EA=1,CPU开放中断;

   ET0=1,允许T0中断;

〔4〕编程

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

方法一:

中断方式

ORG 0000H

             AJMP MAIN        ;转主程序MAIN

             ORG 000BH

             AJMP IT0P          ;转T0中断服务程序IT0P       

             ORG 1000H

 MAIN:

MOV  SP,#60H    ;设堆栈指针

             MOV TH0,#0E0H     ;给定时器T0送初值

       MOVTMOD,#00H   ;设置T0为方式0,定时

       MOV TL0,#18H    ;送定时初值

       MOVTH0,#0E0H

SETB EA           ;CPU开中断

       SETB ET0          ;T0允许中断

       SETBTR0            ;启动T0定时

HERE:

SJMP  HERE        ;等待中断

中断服务程序:

IT0P:

 ORG  1200H        ;T0中断入口

      MOV  TL0,#18H    ;重新装入计数初值 

       MOV TH0,#0E0H 

       CPL  P1.2            ;输出方波

       RETI                  ;中断返回 END

方法二:

查询方式

           MOV TMOD,#00H  ;设置T0为方式0,定时

           MOV TL0,#18H     ;送初值

           MOV TH0,#0E0H 

           SETB TR0           ;启动T0定时

LOOP:

C  TF0,NEXT    ;查询定时时间到否?

           SJMP LOOP

NEXT:

MOV TL0,#18H     ;重新装入计数初值

          MOVTH0,#0E0H

          CPL  P1.2            ;输出方波

      SJMP LOOP          ;重复循环

       工作方式1

工作方式存放器TMOD中的M1M0为:

01。

定时器T0工作方式1与工作方式0类同,差异在于其中的计数器的位数。

工作方式1以16位计数器参与计数。

定时器/计数器0方式1的逻辑结构如下列图。

1.工作在定时方式

C/

=0,定时器对机器周期计数。

定时时间的计算公式为:

定时时间=〔213–计数初值〕×晶振周期×12

或            定时时间=〔213–计数初值〕×机器周期

假如晶振频率为12MHz,如此最短定时时间为

[216-(216-1)]×(1/12)×10-6×12=1μs

最长定时时间为

〔216-0〕×〔1/12〕×10-6×12=65536μs=65.5ms

2.工作在计数方式

C/

=1,16位计数器对外部输入信号进展加1计数。

计数值的X围是1~216=65536(个外部脉冲)。

【例】假设AT89S52单片机晶振频率为12MHz,所需定时时间为10ms,当T0工作在方式1时T0计数器的初值是多少?

解:

∵t=〔216–X0〕×机器周期

      当单片机晶振频率为12MHz时,机器周期=1μs

   ∴10×103=〔213–X0〕×1

      X=65536-10000=55536

   转换成二进制数为:

【例】假设AT89S52单片机晶振频率为12MHz,定时器T0的定时初值为9800,计算T0工作在方式1时的定时时间。

解:

∵t=〔216–X0〕×机器周期

      当单片机晶振频率为12MHz时,机器周期=1μs

   ∴t=〔216–9800〕×1

      t=65536-9800=55736μs

【例】用定时器T0产生50HZ的方波。

由输出此方波〔设时钟频率为12MHZ〕。

采用中断方式。

解:

50HZ的方波周期T为 T=1/50=20ms

 

可以用定时器产生10ms的定时,每隔10ms改变一次的电平,即可得到50HZ的方波。

定时器T0应工作在方式1。

〔1〕工作在方式1时的T0初值,根据下式计算:

    t=〔216–X〕×机器周期

      时钟频率为12MHz,如此机器周期=1µs

    10×103=〔216–X〕×1

    X=65536–10000=55536

转换为二进制数:

11011000  11001100B

  

                高8位    低8位

高8位=0D8H装入TH0,低8位=0CCH装入TL0。

〔2〕程序

ORG 0000H                 

           AJMP MAIN

              ORG 000BH                    ;T0的中断入口地址

AJMP T0INT

              ORG 0100H

MAIN:

MOV TMOD,#01H     ;设置T0为工作方式1

MOV TH0,#0D8H      ;装入定时器初值

MOV TL0,#0CCH

SETB ET0                    ;设置T0允许中断

SETB EA           ;CPU开中断

SETB TR0                    ;启动T0

SJMP $                        ;等待中断

 

中断服务程序;

ORG 0300H

T0INT:

CPL P1.0                ;取反

MOV TH0,#0D8H;重新装入定时初值

MOV TL0,#0CCH

RETI

 

注:

 SETB ET0                    ;设置T0允许中断

SETB EA           ;CPU开中断

这两条指令可以等效为 MOV IE,#82H。

       工作方式2

定时器/计数器0方式2的逻辑结构如下列图。

工作方式存放器TMOD中的M1M0为:

10

定时器/计数器在工作方式2时,16位的计数器分成了两个独立的8位计数器TH和TL。

此时,定时器/计数器构成了一个能重复置初值的8位计数器。

其中,TL用作8位计数器,TH用来保存计数的初值。

每当TL计满溢出时,自动将TH的初值再次装入TL。

1.工作在定时方式

C/

=0,定时器对机器周期计数。

定时时间的计算公式为:

定时时间=〔28–计数初值〕×晶振周期×12

或            定时时间=〔28–计数初值〕×机器周期

假如晶振频率为12MHz,如此最短定时时间为

[28-(28-1)]×(1/12)×10-6×12=1μs

最长定时时间为

〔28-0〕×〔1/12〕×10-6×12=256μs

 

2.工作在计数方式

C/

=1,8位计数器对外部输入信号进展加1计数。

计数值的X围是1~28=256(个外部脉冲)。

【例】利用T0方式2实现以下功能:

当T0(P3.4)引脚每输入一个负脉冲时,使输出一个500μs的同步脉冲。

设晶振频率为6MHz,请编程实现该功能。

其波形如下列图。

图6.5 例波形图

(1)确定工作方式

首先选T0为方式2,外部事件计数方式。

当引脚上的电平发生负跳变时,T0计数器加1,溢出标志TF0置1;然后改变T0为500μs定时工作方式,并使输出由1变为0。

T0定时到产生溢出,使引脚恢复输出高电平。

T0先计数,后定时,分时操作。

根据题目要求方式控制字TMOD是:

计数时:

(TMOD)=00000110B=06H

定时时:

(TMOD)=00000010B=02H

〔2〕计算初值

机器周期T=12/fosc=12/6MHZ=2μs

计数时:

计数个数 X=1

计数初值=(256﹣X)=(256﹣1)=255=0FFH,(TH0)=(TL0)=0FFH

定时时:

计数个数 X=Т/Tm=500μs/2μs=250

定时初值=256﹣X=256﹣250=6,

(TH0)=(TL0)=06H    

〔3〕编程方法

采用查询方法

START:

MOV TMOD,#06H      ;T0方式2,外部计数方式

           MOV TH0,#0FFH       ;T0计数初值

           MOV TL0,#0FFH

           SETB TR0               ;启动T0计数

LOOPl:

C TF0,PTF01   ;查询T0溢出标志,TF0=1时转移,

且TF0=0(查负跳变)

           SJMPLOOPl

PTF01:

CLRTR0            ;停止计数

           MOV TMOD,#02H ;T0方式2,定时

           MOV TH0,#06H   ;T0定时500μs初值

           MOV TL0,#06H

           CLR  P1.0          ;清0

           SETB TR0          ;启动定时500μs

LOOP2:

C TF0,PTF02    ;查询溢出标志,定时到TF0=l转移,

且TF0=0(第一个500μs到否?

           SJMP LOOP2

PTF02:

SETB P1    ;置1(到了第一个500μs)

           CLR TR0                      ;停止计数

           SJMP START

       工作方式3

工作方式存放器TMOD中的M1M0为:

11。

工作方式3仅对定时器/计数器0有效,此时,将16位的计数器分为两个独立的8位计数器TH0和TL0。

当定时器/计数器0工作在方式3时,定时器/计数器1只能工作在方式0~2,并且工作在不需要中断的场合。

在一般情况下,当定时器/计数器1用作串行口波特率发生器时,定时器/计数器0才设置为工作方式3。

此时常把定时器/计数器1设置为方式2,用作波特率发生器。

定时器/计数器0在方式3下的逻辑结构如下列图。

【例】设某用户系统中已使用了两个外部中断源,并置定时器T1工作在方式2,作串行口波特率发生器用。

现要求再增加一个外部中断源,并由引脚输出一个5kHz的方波。

fosc=12MHz。

(1)确定工作方式

T0方式3下,TL0作计数用,而TH0可用作8位的定时器,定时控制引脚输出5kHz的方波信号。

T1为方式2,定时。

TMOD是:

00100111B=27H

(2)计算初值

TL0初值:

FFH,TH0初值X0计算如下:

∵的方波频率为5kHz,故周期

T=1/(5kHz)=0.2ms=200μs

∴用TH0定时100μs时,

X0=256﹣100×12/12=156

〔3〕程序如下:

MOV TMOD,#27H    ;T0为方式3,计数;T1为方式2,定时

        MOV TL0,#0FFH    ;置TL0计数初值

        MOV TH0,#156     ;置TH0计数初值

        MOV THl,#data     ;data是根据波特率要求设置的常数(即初值)

        MOV TLl,#data 

        MOV TCON,#55H    ;外中断0,外中断1边沿触发,启动T0,T1

        MOVIE,#9FH         ;开放全部中断

      

        TL0溢出中断服务程序(由000BH转来)

TL0INT:

MOVTL0,#0FFH     ;TL0重赋初值(中断处理)

        RETI

 

        TH0溢出中断服务程序(由001BH转来)

TH0INT:

MOVTH0,#156       ;TH0重新装入初值

        CPL   P1.0          ;输出波形

        RETI

 定时器/计数器2

定时器/计数器2是一个16位定时器/计数器,是定时器或外部事件计数器。

定时器2有三种操作方式:

捕获方式、自动重装方式和波特速率发生器方式。

工作方式由T2CON的控制位选择。

1.定时器/计数器2控制存放器T2CON

T2CON可位寻址,地址为0C8H。

其各位定义如下:

 

位 序

D7

D6

D5

D4

D3

D2

D1

D0

位标志

TF2

EXF2

RCLK

TCLK

EXEN2

TR2

C/

CP/

位地址

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1