定时器 / 计数器的控制

31

description

知识点:. 定时器 / 计数器的工作方式. 定时器工作原理. 定时器 / 计数器的控制. 定时器 / 计数器的初值的设置. 问题的提出. 在实际工作、生活中,许多控制离不开时间。尤其是定时控制更是以时间为核心,如家用的洗衣机中的洗涤、脱水都是定时的。 单片机又是如何完成定时的呢? 通过前面的学习, 当晶振频率一定时,单片机的机器周期相应固定,如晶振频率为 12MHE 时单片机的机器周期为 1μs 。单片机对其机器周期进行计数便可以实现定时。如计数值为 1000 则定时 1ms 、如计数值为 1000000 则定时 1s ,以此类推。 - PowerPoint PPT Presentation

Transcript of 定时器 / 计数器的控制

Page 1: 定时器 / 计数器的控制
Page 2: 定时器 / 计数器的控制

定时器定时器 // 计数计数器的控制器的控制

定时器定时器 // 计数计数器的控制器的控制

定时器 / 计数器

的工作方式

定时器 / 计数器

的工作方式

知识点:知识点:

定时器定时器 // 计数计数器的初值的设器的初值的设

置置

定时器定时器 // 计数计数器的初值的设器的初值的设

置置

定时器工作原理

定时器工作原理

Page 3: 定时器 / 计数器的控制

在实际工作、生活中,许多控制离不开时间。尤其是定时控制更是以时间为核心,如家用的洗衣机中的洗涤、脱水都是定时的。

单片机又是如何完成定时的呢? 通过前面的学习,当晶振频率一定时,单片机的机器周

期相应固定,如晶振频率为 12MHE 时单片机的机器周期为 1μs 。单片机对其机器周期进行计数便可以实现定时。如计数值为 1000 则定时 1ms 、如计数值为 1000000则定时 1s ,以此类推。

本章要解决的是单片机如何完成对机器周期进行计数。

问题的提出问题的提出

Page 4: 定时器 / 计数器的控制

振荡器 ÷12

加 1 计数器

TFX

起/停

控制信号

C /T=0

C /T=1

中断

TX 端

MCS-51单片机片内有两个 16位的定时器/计数器,定时器 0(T0)和定时器 1(T1)。它们均可用作定时控制、延时以及对外部事件的计数及检测。 当外部晶体

振荡器为 12MHz时,它提供 ( 输出 ) 12MHz 的脉冲。

经过除以 12 变成 1MHz 的脉冲记住:此时脉冲的周期为 1 / 1MHz= 1μs

当 C /T=0 时,开关接通

在起/停控制信号中“起”信号作用下开关接通

加 1 计数器对1MHz 的脉冲进行自动计数,直至计数器计满

当计数器计满时,自动将 TFX置“ 1” ,作为向单片机中断请求信号。

当 C / T=1 时,开关向下接通, TX 端的外部信号至此

在起/停控制信号中“起”信号作用下开关接通

加 1 计数器对1MHz 的脉冲进行自动计数,直至计数器计满

当计数器计满时,自动将 TFX置“ 1” ,作为向单片机中断请求信号。

Page 5: 定时器 / 计数器的控制

16 位的定时器/计数器分别由两个 8 位的专用寄存器组成 ,由此可见:定时器/计数器的核心是一个加 1 计数器。 即 T0 由 TH0 和 TL0 构成, T1 由 THl 和 TLl 构成。

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

TH0 TL0TH0 TL0

0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0

T0

输入

TL0 、 TL1 、 TH0 、 TH1 的地址顺序依次是8AH 、 8BH 、 8CH 、 8DH 。这些寄存器用来存放定时或计数初值,每个定时器都可以由软件设置成定时工作方式或计数工作方式。 定时器/计数器可工作在定时方式或计数方式,由方式寄存器 TMOD 确定,由控制寄存器 TCON 控制。

Page 6: 定时器 / 计数器的控制

注意: 1 、当定时器工作在计数方式时,外部输人信号是加到

T0(P3 . 4) 或 T1(P3 . 5) 端。 一个外部输入信号的下降沿触发加 1 计数器加 1 ,直至计

满溢出。 外部输入信号的高电平与低电平保持时间均需大于一个机

器周期。 2 、当定时 / 计数器工作在定时方式时,加 1 计数器每一个机

器周期加 1 ,直至计满溢出。 一旦定时器/计数器被设置成某种工作方式后,它就会按

设定的工作方式独立运行,不再占用 CPU 的操作时间,直到加 1 计数器计满溢出,才向 CPU 申请中断。

Page 7: 定时器 / 计数器的控制

定时器/计数器是一种可编程的部件,在其工作之前必须做三件事:

1 、将方式字写入 TMOD

2 、将控制字写入 TCON

3 、将计数初值写入相应计数器

这个过程称为定时器/计数器的初始化

定时器/计数器工作方式及控制

Page 8: 定时器 / 计数器的控制

TMOD 用于控制 T0 和 T1 的工作方式,其各位定义如下:

工作方式寄存器TMOD

工作方式寄存器TMOD

Page 9: 定时器 / 计数器的控制

TCON 用于控制定时器的启动、停止以及标明定时器的溢出和中断情况。各位的含义如下:

控制寄存器 TCON控制寄存器 TCON

Page 10: 定时器 / 计数器的控制

TMOD 中的 M1 、 M0 具有 4 种组合,从而构成了定时器/计数器的 4 种工作方式,这 4 种工作方式除了方式 3 以外,其它 3 种工作方式的基本原理都是一样的。

下面分别介绍 4 种工作方式的特点及工作情况。

定时器/计数器的工作方式定时器/计数器的工作方式

Page 11: 定时器 / 计数器的控制

在单片机中定时/计数的原理是对其寄存器的内容完成对机器周期/外部脉冲进行 +1 计数直至溢出。为了获取不同时间/不同脉冲个数,只要对寄存器预先写入一个数据就可以实现。这个数据称为初值。

工作方式 0工作方式 0

X

200ML

N

其中:

200ML :最大值

N :计数值

X : 初值

Page 12: 定时器 / 计数器的控制

方式 0 : 16 位的计数器 (THO 和 TL0) 只用了13 位构成 13 位定时器/计数器。

TL0 的高 3 位未用,当 TL0 的低 5 位计满时,向TH0 进位,而 TH0 溢出后对中断标志位 TF0 置 1 ,并向 CPU 申请中断。

13 位计数器 : 最大计数值为213= 8192( 相当 200ML) 定时值 t (相当 N ,但 t 是时间单位) 初值(相当 X ) 即: t/ 机器周期 + 初值 = 213= 8192 t=( 213- T0 初值 )× 机器周期

Page 13: 定时器 / 计数器的控制

1 、初值

根据上式可知:初值 = 213 - t/ 机器周期例如:定时值为 5000μs ,机器周期为 1μs

初值 =8192-5000/μs=3192=0000110001111000B

将初值写入 T0 寄存器的方法是 : 高 8 位写入 01100011TH0 ,低 5 位 11000 写入 TL0

Page 14: 定时器 / 计数器的控制

例如:要求计满 129个外部脉冲后溢出中断,则计数初值为 8192-129=8063=1F7FH

即 TLO=1FH、 TH0=FBH

又如:已知单片机的机器周期为 1μs,要求定时值到达 5000μs时溢出中断,则定时初值为 8192-( 5000μs/1 μs) = 3192=0C78H

即 TLO=18H、 TH0=63H

Page 15: 定时器 / 计数器的控制

2 、控制

Page 16: 定时器 / 计数器的控制

T0 工作在方式 1 的逻辑结构如下图所示。由图可

见,它与工作方式 0 的差别仅在于工作方式 1 是以16 位计数器参加计数,且定时时间为:

t=(216- T0 初值 )× 机器周期

即:初值 = 216- t/ 机器周期

工作方式 1工作方式 1

Page 17: 定时器 / 计数器的控制
Page 18: 定时器 / 计数器的控制

T0 在工作方式 2 的逻辑结构如下图所示。

工作方式 2工作方式 2

Page 19: 定时器 / 计数器的控制

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

在工作方式 0 、工作方式 1 中,若用于重复定时计数,则每次计满溢出后,计数器变为全 0 ,故还得重新装入初值。

而工作方式 2 可在计数器计满溢出时自动装入初值,工作方式 2 把 16 位的计数器拆成两个 8位计数器。 TL0 用作 8 位计数器, TH0 用来保存初值,每当 TL0 计满溢出时,可自动将 TH0 的初值再装入 TL0 中。工作方式 2 的定时时间为:

t= ( 28—T0 初值)×机器周期 即:初值 =256- t/ 机器周期

Page 20: 定时器 / 计数器的控制

工作方式 3 的逻辑结构图如下图所示。

工作方式 3工作方式 3

Page 21: 定时器 / 计数器的控制

该工作方式只适用于定时器/计数器 T0 。 T0 在工作方式 3 被拆成两个相互独立的计数器,其中, TL0使用原 T0 的各控制位、引脚和中断源C/T 、 GATE 、 TR0 、 INT0 和 TF0;

而 TH0 则只能作为定时器使用,但它占用 T1 的TR1 和 TF1 ,即占用了 T1 的中断标志和运行控制位。

一般在系统需增加一个额外的 8 位定时器时,可设置为工作方式 3 ,此时, T1虽仍可定义为工作方式0 、工作方式 1 和工作方式 2 ,但只能用在不需中断控制的场合。

Page 22: 定时器 / 计数器的控制

1 、要求计满 2000 个外部脉冲后溢出中断,方式 0 ,求计数初值的 TL0= ?、 TH0= ?

2 、已知单片机的机器周期为 1μs ,要求定时值到达7000μs 时溢出中断,定时、方式 1 ,求定时初值的 TL0= ?、 TH0= ?

3 、 T0 方式 1 ,定时值 5ms , TH0= ?、 TL0= ?

4 、 T1 方式 2 ,定时值 250μs , TH1= ?、 TL1= ?

TH0=C1 TL0=10

TH0=E4 TL0=A8

TH0=EC TL0=78

TH0=06 TL0=06

Page 23: 定时器 / 计数器的控制

应用定时器 / 计数器时应注意两点:一是初始化(写入控制字),二是对初值的计算。

初始化步骤为:①向 TMOD 写工作方式控制字。②向计数器 TL 、 TH装入初始值。③置 TR=1 ,启动计数。④置 ET=1 ,允许定时器/计数器中断 ( 若需要

时 )。⑤置 EA=1 , CPU 开中断 ( 若需要时 )。

定时器 / 计数器应用举例定时器 / 计数器应用举例

Page 24: 定时器 / 计数器的控制

例如:设 T0 为工作方式 1 ,设置为定时状态,定时时间为 2ms ,每当 2ms 到,申请中断,在中断服务程序中将P1.0 的内容取反送出 ( 假设晶振为 6MHz) 。

解:已知晶振频率为 6MHz ,机器周期 =2μs

下面先计算 2ms 定时的 TO 初始值 当 T0 工作在方式 1 时 TO 初始值 =216-定时时间/机器周期 =216-2ms / 2μs

           = 216- 2×10-3 /2 ×10-6

           =65536-1000=64536 =FC18H 。 即: TH0=FCH 、 TL0=18H

Page 25: 定时器 / 计数器的控制

由于题目要求 T0 工作在方式 1 ,所以 TMOD=01H

Page 26: 定时器 / 计数器的控制

编程如下 :

ORG 0000H ;AJMP MAIN ;转主程序ORG 000BH ;INT : MOV TL0 , #18H ; T0中断服务程序

MOV TH0 , #0FCH ;重设计数初值 CPL P1.0 ;输出取反 RETI ;MAIN : MOV SP , #63H ;置堆栈指针 MOV TMOD , #01H ; T0初始化 MOV TL0 ; #18H ; MOV TH0 ; #0FCH; SETB TR0 ;启动 T0计数 SETB ET0 ;允许 T0中断 SETB EA ; CPU开中断RLL : SJMP RLL ;等待 END

Page 27: 定时器 / 计数器的控制

中断程序

主程序MAIN

中断响应

中断服务程序入口地址

RETI

ORG 000BH INT : MOV TL0 , #18H MOV TH0 , #0FCH CPL P1.0 RETI

MAIN : MOV SP , #63H MOV TMOD , #01H MOV TL0 ; #18H MOV TH0 ; #0FCH SETB TR0 SETB ET0 SETB EA RLL : SJMP RLL END

主程序与中断服务程序的关系

Page 28: 定时器 / 计数器的控制

又例如:当 GATE=1 时, TR0=1 时,只有INTO 引脚上出现高电平时, T0 才被允许计数。试利用这一功能测试 INTO引脚上的正脉冲的宽度(机器周期数)。

设外部待测脉冲由 INTO ( P3.2 )输入, T0 工作在方式 1 ,设置为定时状态, GATE 置为“ 1”,测试时,在 INTO 端为“ 0” 时置 TR0 为“ 1” ,当 INTO 端变为“ 1” 时启动计数; INTO 端再次变为“ 0” 时停止计数,此时的计数值就是被测正脉冲的宽度。

Page 29: 定时器 / 计数器的控制

编程思路:

在此期间对机器周期进行计数

根据题意: T0 工作在方式 1 、定时状态、 INT0=“1” 期间对机器周期进行计数。

于是,确定方式字如下:即 TMOD=09H 。并在 INT0=0 期间置TR0=1

TR0=1 、 INT0=1 时开始计数

TR0=0 、 INT0=0 时停止计数

Page 30: 定时器 / 计数器的控制

编程如下: ORG 0000H MOV TMOD , #09H ; T0 工作方式 1 定时, GATE=1

MOV TL0, #00H ; MOV TH0, #00H ;RLL1: JB P3.2, RLL1 ;等待 P3.2变低 SETB TR0 ;启动 T0

RLL2: JNB P3.2, RLL2 ;等待 P3.2变高RLL3: JB P3.2, RLL3 ;等待 P3.2再变低 CLR TR0 ; T0停止计数 MOV A, TL0 ;存放计数值 MOV B, TH0 SJMP $

Page 31: 定时器 / 计数器的控制

1 、设 T0 为工作方式 0 ,设置为定时状态,定时时间为 0.5ms ,每当0.5ms 到,申请中断,在中断服务程序中将 P1.7 的内容取反送出 ( 假设晶振为 12MHz) 。请编写该方案的程序 .

ORG 0000H ;AJMP MAIN ;转主程序ORG 000BH ;INT : MOV TL0 , #0CH ; T0 中断服务程序 MOV TH0 , #0F0H ;重设计数初值 CPL P1.7 ; 输出取反 RETI ;MAIN : MOV SP , #63H ;置堆栈指针 MOV TMOD , #01H ; T0 初始化 MOV TL0 ; #0CH ; MOV TH0 ; #0F0H ; SETB TR0 ;启动 T0 计数 SETB ET0 ;允许 T0 中断 SETB EA ; CPU 开中断RLL : SJMP RLL ;等待 END