4.4 定时/计数器

23
定定 定定 对对对对对对对 f0/12 对对对 对 对对对对对 )。 对对对对 = 2 n 对对× 对对 对对 定定定定定定定定定定 定定定定 CPU 定定 定定定定 / 定定定定定 定定定定定 CPU 定定定定定89 89 C51 C51 定定定定定 定定定定定 16 16 定定 定定 定定定定 定定定定 / / 定定定 定定定 T0 T0 T1 T1 定定 一、 定定 一、 / / 定定定定定定定定定定 定定定定定定定定定定 定定定定对 T0/T1 对对对对 对对对 对 。一 1 对 0 对对对对对对对对对对对 对对对对对对 对对对对对对对 1/24 对对对 对对对对对 。, 对对 对对对对对对对对对 一。 4.4 定定 定定 / / 定定定 定定定

description

4.4 定时/计数器. 一、定时/计数器结构及工作原理. 89 C51 片内有两个16位可 编程定时/计数器 T0、T1. 定时: 对片内振荡器的 f0/12( 机器周期)进行计数。 定时时间=(2 n - 初值)×机器 周期. 计数: 计 T0/T1 端下降沿 。检测一个1至0的跳变需要两个机器周期,故最高计数频率为振荡频率的1/24。同时,高电平至少保持 一个完整的机器周期。. 特点: 定时或计数时,都不占用 CPU 时间。除非定时/计数器溢出,才可能中断 CPU 的当前操作。. - PowerPoint PPT Presentation

Transcript of 4.4 定时/计数器

Page 1: 4.4   定时/计数器

定 时 :定 时 : 对 片 内 振 荡 器 的f0/12 (机器周期)进行计数。定时时间 = ( 2n -初值) × 机器 周期

特点:特点:定时或计数时,都不占用 CPU 时间。除非定时 / 计数器溢出,才可能中断 CPU 的当前操作。

8989C51C51 片内有两个片内有两个 1616 位位可可编 程 定 时编 程 定 时 // 计 数 器计 数 器T0T0 、、 T1T1

一、定时一、定时 // 计数器结构及工作原理计数器结构及工作原理

计数:计数:计 T0/T1 端下降沿 。检测一个 1 至 0 的跳变需要两个机器周期,故最高计数频率为振荡频率的 1/24 。同时,高电平至少保持 一个完整的机器周期。

4.4 定时定时 //计数器计数器

Page 2: 4.4   定时/计数器

定时 / 计数器工作方式由控制字 TMOD 、 TCON 来决定 (注意:(注意: TMODTMOD 不能以位寻不能以位寻址)址)1. TMOD(89H)—— 工作方式寄存器

二、控制字和工作方式二、控制字和工作方式

注:注: GATE 决定对定时器的启动控制 1 -外部 INT 选通 0 -内选通 INT0 、 INT1 引脚“ 1” 且TR0 、 TR1 置 1 ,则启动定时器。 只需 TR0 、 TR1置 1 就启动定时器。

Page 3: 4.4   定时/计数器

2. TCON ( 88H ——) 控制和标志寄存器(注意:除了可字节(注意:除了可字节寻址外,还可位寻寻址外,还可位寻址)址)

SETB TR0SETB TR1

IT0IT0IE0IE0IT1IT1IE1IE1TR0TF0TF0TR1TF1TF1TCON( 88H

Page 4: 4.4   定时/计数器

定时 / 计数器 0 可以工作在模式 0 ~ 3定时 / 计数器 1 可以工作在模式 0 ~ 2

图 6-7 ① 按 13 位加法计数器工作 TL0TH0

TF0

当加至 TH0 溢出,则 TF0置位,并申请中断。8 5

TL0TL0 高高 33 位未位未用用

1. 模式 0

三、工作方式三、工作方式

M1 M0 0 0

Page 5: 4.4   定时/计数器

③ GATE

一般不用,但是当 GATE = 0 时,禁止 INTi 。

2. 模式 1 : 16 位 , 其他同方式 0 。 (初值 =216 - t / 机器周期)3. 模式 2 : 8 位 ,时间常数可以自动装载 , 其余同方式 0 。 初始化时, TH0TL0 ,具有相同的初值。 t = (28 - TH0 初值) × 机器周期 P136 ,例 6-2 ,模式 2 的应用。

C/T=0C/T=0 , T0 对机器周期计数,定时工作。定时时间定时时间: t t =(=( 221313 -- T0T0 初值)初值) ×× 振荡周期振荡周期 ×12×12

C/T=1C/T=1 , T0 对外部事件 (P3.4) 计数,下降沿到来则计数器加1 。

T1 对外部事件 (P3.5) 计数,下降沿到来则计数器加 1 。

② C/ T

Page 6: 4.4   定时/计数器

START : MOV TMOD,#06H ;设置 T0 为模式 2 ,外部计数方式 MOV TH0,#0FFH ; T0 计数器初值 255 MOV TL0,#0FFH SETB TR0 ;启动 T0 计数

LOOP1 : JBC TF0,PTF01 ;查询 T0 溢出标志 ,TF0 = 1 转移 , 且TF0=0. SJMP LOOP1

PTF01 : CLR TR0 ;停止计数 MOV TMOD,#02H ;设置 T0 为模式 2 ,定时方式 MOV TH0,#06H ; T0 定时 500us MOV TL0,#06H CLR P1.0 ; p1.0 清 0 SETB TR0 ;启动定时 500us

LOOP2 : JBC TF0,PTF02 ;查询溢出标志 , 定时到 TF0 = 1 转移 , 且TF0=0. SJMP LOOP2

PTF02 : SETBP1.0 ; P1.0 置 1 CLR TR0 ;停止计数 SJMP START

外部计数方式 定时方式 外部计数方式 定时方式

P3.4P1.0 500us 500us

P136 ,例 6-2

Page 7: 4.4   定时/计数器

4. 模式 3 :仅对定时 / 计数器 0 有效 T0TH0+TL0 对定时 / 计数器 1 ,停止计数。

② TH0TH0 占用占用 T1T1 的控制位的控制位 TR1TR1 和中断标志位和中断标志位 TF1TF1 ,仅能工作在定时方式定时方式,其启动和关闭仅受 TR1 的控制。

将定时将定时 // 计数器计数器 00 分成两个独立的分成两个独立的 88 位计数器位计数器 TH0TH0 、、 TL0TL0 。

③ 定时 / 计数器 1 不能工作在方式 3 ,若要其工作在方式 3 ,就会立即停止计数,即保持住原有的计数值。

① TL0 除仅用 8 位Reg 外,其余同模式 0 、 1 。可工作在定时或计数方式。 这时, TL0 用原来T0 的各控制位、引脚和中断源: C/T, GATE, TR0, TF0 和T0(P3.4) 、 INT0(P3.2)。

Page 8: 4.4   定时/计数器

但但 T1T1 仍可工作在方式 仍可工作在方式 00 ~~ 22 。。 这时:由于 TR1 、 TF1 被 T0 占用,仅用 T1 控制位 C/T 切换其定时器或计数器工作方式就可使 T1 工作。 计数器溢出时 (13 、 16 或 8 bit 时),只能将输出送入串口或用于不需要中断的场合。 当当 T1T1 需要用作串行口波特率发生器时,需要用作串行口波特率发生器时, T0T0 才设置为工作方才设置为工作方式式 33 ,这时,常将,这时,常将 T1T1 设置为工作方式设置为工作方式 22 。。

通常,写入控制字的次序为: 1. 把工作方式控制字写入 TMOD 2. 把定时、计数初值装入 TLx 、 THx ( x =0 、 1 ) 3. 置位 EA 使 CPU 开放中断 4. 置位 ETx 允许定时 / 计数器中断(需要时) 5. 置位 TRx 以启动计数

四、举例四、举例定时 / 计数器的应用编程需注意 能正确设置会计算时间常数

TMODTCON

Page 9: 4.4   定时/计数器

当工作于定时状态时,由于定时 / 计数器是计数机器周期,每个机器周期包括 12 个振荡周期,则有: 1 个机器周期 = 2us ( 6MHz )

或 = 1us ( 12MHz )

因为是加 1 计数器,所以当计数值为 X 时,装入定时 / 计数器的初值应为 22nn -- XX : 方式 0 , n=13 方式 1 , n=16 方式 2 、 3 , n=8

例例 11 :设单片机的 fosc = 6MHz , T0 工作在方式 0 : ① ① 求求 T0T0 的最大定时时间的最大定时时间 TT ; ; ②②产生产生 11msms 定时的定时的 T0T0 初值;初值; ③ ③ 11msms 定时定时在在 P1.0P1.0 引脚输出周期为引脚输出周期为 22msms 的方波。的方波。 t = (213 -初值 )× 机器周期 ( 12 / (6×106) )

t = (213 -初值 )×2us

① ① T0T0 最大定时时间对应于初值最大定时时间对应于初值 00 ,所以有:,所以有:tmax = 213×12 / (6×106) = 16384 us =

16 .384ms

Page 10: 4.4   定时/计数器

③ ③ 对以上要求编程如下(以定时 1ms 中断方式控制 P1.0 输出方波): ORG 0000H

RESET: AJMP MAIN ORG 000BH

AJMP IT0P ORG 0100HMAIN: MOV SP,#60H

ACALL PT0MDHERE: AJMP HEREPT0MD: MOV TMOD, #00H

MOV TL0, #0CH MOV TH0, #0F0H

SETB EA SETB ET0

SETB TR0 RET

ORG 0120HIT0P: MOV TL0, #0CH

MOV TH0, #0F0H CPL P1.0 RETI

当 t = 1ms 时,有: 1000 = 2×( 213 -初值) ② ② 初值= 213-500 = 7692 = 00011110000 01100 B

TH0 TL0

Page 11: 4.4   定时/计数器

例例 2:2: 用方式 1 在 P1.0 输出脉冲

1ms 1ms 1ms

程序: ① 以中断方式: ORG 0000H AJMP MAIN ;转主程序 ORG 000BH ;到中断服务程序 AJMP TOINT

设 fosc = 6MHz , 可通过定时 / 计数器定时 1ms 申请中断, 在中断程序中让 P1.0 输出 1 或 0 实现。 当 fosc = 6MHz 时,振荡周期= 1/6 us 机器周期= 12×1/6 us = 2us 所以,定时时间常数为: 1ms/2us = 500 。 方式 0 时计数器为 13 位, 计数常数= 213 - 500 = 7692 =1E0CH 若用方式若用方式 11 ,计数器为,计数器为 1616 位,计数常数=位,计数常数= 221616 -- 500500 == 6503650366

== FE0CHFE0CH

Page 12: 4.4   定时/计数器

ORG 0100HMAIN: MOV SP , #60H MOV TMOD ,#00 ;

MOV TL0 , #0CH ;MOV TH0 , #0F0H ;SETB EA ; CPU 开中断

SETB ET0 ;允许定时器 0 中断SETB TR0 ;启动定时器 0 工作

HERE : AJMP HERE ;或用 SJMP $ ORG 0200H ;中断服务程序 TOINT : MOV TL0 , #0CH ;重新装入时间常数 MOV TH0 , #0F0H CPL P1.0 ;在 P1.0 脚得到方波

RETI

MOV TM0D ,#01HMOV TL0 , #0CHMOV TH0 , #0FEH

方式 1方式 0

Page 13: 4.4   定时/计数器

② 以查询方式 ORG 0000H AJMP MAIN ORG 2000H

MAIN: MOV TMOD, #01 ;定时器 0 工作在方式 1 MOV TL0 , #0CH MOV TH0, #0FEH SETB TR0 ;启动定时器 0 工作

LOOP : JNB TF0 ,$ ;查询 TF0, 若计数器未溢出 , 原地等待 CLR TF0 CPL P1.0 ;得到方波 MOV TL0 , #0CH MOV TH0 , #0FEH ;装入 16 位时间常数

SJMP LOOP

Page 14: 4.4   定时/计数器

③ 用方式用方式 22 做。做。定时时间为: t =( 28 - TL0 初值) × 机器周期。 所以,仅当定时时间不超过 tmax 方可用方式 2 。 这时, TL0 、 TH0 赋予相同的值,一旦 TL0 溢出,置位 TF0,并将 TH0 中的初值自动装入 TL0 ,继续计数,循环往复。例例 33 ::设定时 / 计数器 T0 工作于方式 2 。要求其 500us 定时中断, 在中断服务程序中把累加器 A 的内容减 1 ,然后送 P1 口。设晶 振频率为 6MHz ,程序如下:

ORG 0000H AJMP MN ORG 000BH DEC A MOV P1 , A RETIMN : MOV SP , #53H

MOV TMOD , #02H

MOV TL0 , #06H ; 送 500usMOV TH0 , #06H ; 时间常数SETB EA ; CPU 开中断SETB ET0 ; 允许 T0 中断SETB TR0 ; 启动 T0 计数 SJMP $ ; 等待

Page 15: 4.4   定时/计数器

例例 44 ::脉冲宽度的测量—— TMOD 中 GATE =1 的一个应用 当当 GATE=1GATE=1 时,若时,若 TRTRXX=1=1 ,,只有只有 INTINTXX 引脚输入高电平时,引脚输入高电平时, TTXX 才被允许才被允许计数。计数。 利用利用 GATEGATE 的这一功能,可测试的这一功能,可测试 INTINTXX 引脚上正脉冲的宽度(机器周期引脚上正脉冲的宽度(机器周期数)。其方法如图所示:数)。其方法如图所示:

对 T0 初始化编程GATE=1. T0 从 0 开始计数

T0 停止计数 读 T0 的值。

XINTX①①②② ③③

④④程序 : ORG 4000H ; T0 初始化

MOV TMOD,#09H ; T0 工作于方式 1, 定时 , GATE=1MOV TL0 , # 00HMOV TH0 , # 00H ; 置最大时间常数JNB P3.2 , $ ; ①① P3.2 低电平,原地不动SETB TR0 ; ②② P3.2 高,设置 TR0JB P3.2 ,$ ; ③③ P3.2 高,原地不动CLR TR0 ; ④④ P3.2 低,清 TR0 , 读 TL0,

TH0MOV A , TL0MOV B , TH0

脉宽=计数值脉宽=计数值 ××TTpp(( 机器周期机器周期 ))

Page 16: 4.4   定时/计数器

设晶振频率为 6MHZ ,程序如下: ORG 0000H AJMP MAIN ;转主程序

ORG 000BH ; T0 中断首地址 MOV TL0 , #131 ; TL0 装入时间常数 (256-125) CPL P1.1 ; P1.1 口得到方波 RETI ORG 001BH ; T1 中断处理程序首地址 MOV TH0 , #06H ; TH0 装入时间常数 (256-250) CPL P1.2 ; P1.2 口得到方波 RETIMAIN : MOV TMOD , #03H ; T0 工作于方式 3 、定时 MOV TL0 , #131

例例 55 ::设定时 / 计数器 T0 工作于方式 3 , TL0TL0 和和 TH0TH0 作为两个作为两个独立独立 的的 88 位定时位定时 // 计数器计数器分别产生 250us 和 500us 的定时中断,使 P1.1 和 P1.2 产生 500us 和 1000us 的方波 ( 晶振频率为6MHz ) 。

Page 17: 4.4   定时/计数器

注意: 注意: 当一个定时器的最大定时时间仍不能满足定时要求,如: 6MHZ 时钟时, 一个机器周期为 2us , 最大定时时间 65536×2 = 131072us = 131ms= 0.13s 若希望定时 0.2s = 200ms ,则不可能用一个定时器来完成。 这时可以对定时器进行级联这时可以对定时器进行级联。

MOV TH0 , #06H ;送时间常数SETB EA ; CPU 开中断SETB ET0 ;允许中断

SETB ET1 SETB TR0 ;启动定时 SETB TR1

SJMP $ ;等待 方式方式 33 时,由于只能是时,由于只能是 88 位计数器,所以可以在中断程序位计数器,所以可以在中断程序中辅以软件计数,实现较长时间定时。中辅以软件计数,实现较长时间定时。

Page 18: 4.4   定时/计数器

例例 66 :如上述:如上述 ,, 希望定时希望定时 200ms200ms 。。时间到时,发光二极管或明或时间到时,发光二极管或明或暗。暗。设定时器 0 定时 20ms , 在软件中查询定时器 0 定时是否到 20ms?若到,用一个口位 (P1.0) 输出方波,周期为 40ms ,将此方波加到 T1 (定时器 T1的外部输入),并设置 T1 的计数常数为 5 ,则可实现 200ms 定时:

时钟 时钟 66MHZ MHZ 时时 , 20, 20ms/2usms/2us == 1000010000 ,,时间常数:时间常数: 65536-65536-10000=5553610000=55536

5V300Ω

P1.7

P1.0

P3.5

CTC0定时CTC1计数

40ms

定时器 0 :方式 1 ,定时定时器 1 :方式 2 ,计数( 5个)

Page 19: 4.4   定时/计数器

例例 : : P139 6-4 P139 6-4 要求:①用 T0扩展外部中断源; ② P1.0 引脚输出一个 5KHz( 周期 200us) 的方波。

使 T0 工作在方式3 ,此时, TL0 、 TH0 为两个独立的 8 位计数器

TH0 仅可用于定时,且占据了 T1的 TR1 和 TF1 。

TL0 可工作在定时或计数方式,使用原 T0 的各控制位、引脚和中断源。

这时, T1 可工作在方式 0 ~ 2 ,仅用 C/T 即可切换其运行在定时或计数工作方式(本题中要求 T1 用于串行口波特率发生器)。

11100100TMOD

10101010TCON

T0T0 :: TL0TL0 作计数用,初值作计数用,初值 FFHFFH ,,当当 T0T0 引脚电平有变化则产生引脚电平有变化则产生中断中断 TH0TH0 作为作为 88 位定时器,控制位定时器,控制 P1.0P1.0 输出输出 55KHzKHz 的方波。的方波。T1 : 工作在方式 2 ,定时,溢出信号作串行口波特率发生器。

设置 INT0INT1 申请中断

启动 T0 、 T1

Page 20: 4.4   定时/计数器

MOV TMOD,#27H ; T0 为模式 3 , T1 为模式 2 , MOV TL0,#0FFH ;置 TL0 计数初值。

MOV TH0,#156 ;置 TH0 计数初值 ( 定时100us)

MOV TH1,#data ; data 是根据波特率要求设;置的常数(即初值)MOV TL1,#dataMOV TCON,#55H ;外中断 0 ,外中断 1边沿触;发,启动 T0 , T1MOV IE , #9FH ;开放全部中断……

TL0INT: MOV TL0,#0FFH ; TL0 重赋初值……RETI

TH0INT : MOV TH0,#156 ; TH0 重赋初值CPL P1.0 ; P1.0取反输出RETI

程序:

Page 21: 4.4   定时/计数器

例例: P141 P141 6-66-6 设计实时钟程序 . ( fosc=6MHz ,一个机器周期2us) 定时器各种工作方式的最大定时时间见定时器各种工作方式的最大定时时间见 P140P140 。。 用 T1 产生 1s 定时 ( 方式 1 , 100ms 定时中断,每中断一次软件计数器+ 1 , 10 次则 1s 。 ) ,分与时则通过对秒的软件计数来实现。源程序: ORG 0000H

AJMP MAIN ;上电,转向主程序ORG 001BH ; T1 的中断入口地址AJMP SERVE ;转向中断服务程序

MAIN : MOV TMOD , #10H ;设 T1 工作于模式 1MOV 20H , #0AH ;装入中断次数CLR AMOV 30H , A ;时单元清 0MOV 31H , A ;分单元清 0MOV 32H , A ;秒单元清 0SETB ET1 ;允许 T1 中断SETB EA ;允许 CPU 中断

Page 22: 4.4   定时/计数器

MOV TH1 , #3CHMOV TL1 , #0B0H ;赋计数初值SETB TR1 ;启动定时器 T1SJMP $ ;等待中断 ( 可反复调用显示)

SERVE : PUSH PSWPUSH ACC ;保护现场MOV TH0 , #3CHMOV TL0 , #0B0H ;重新赋计数初值DJNZ 20H , RETUNT ; 1s 未到,返回MOV 20H , #0AH ;重置中断次数MOV A , #01HADD A , 32H ;秒位加 1DA AMOV 32H , A ;转换为 BCD码CJNE A , #60H , RETURN ;未满 60秒,返回

MOV 32H , #00H ;记满 60秒,秒位清0

Page 23: 4.4   定时/计数器

MOV A , #01HADD A , 31H ;分位加 1DA AMOV 31H , A ;转换为 BCD码CJNE A , #60H , RETUNT ;未记满

60min ,返回MOV 31H , #00H ;记满 60min ,分位清

0MOV A , #01HADD A , 30H ;时位加 1DA AMOV 30H , A ;转换为 BCD码CJNE A , #24H , RETUNT ;未记满 24小时,返回MOV 30H , #00H ;记满 24小时,时位清 0

RETUNT :POP ACCPOP PSW ;恢复现场RETI ;中断返回END