6.3 定时器 / 计数器的应用

24
第6第 第第第 / 第第第 6.3 第第第 / 第第第第第第 6.3.1 初初初 初初初初初初初初(1) 初初初初初初初初初初初初 / 初初初初初初初初初初初初初初初初初初初初初初初初 TMOD 初初初初

Upload: kana

Post on 19-Mar-2016

79 views

Category:

Documents


8 download

DESCRIPTION

6.3 定时器 / 计数器的应用. 6.3.1 初始化 初始化的内容如下: (1) 根据设计需要先确定定时器 / 计数器的工作模式及工作方式,然后将相应的控制字送入 TMOD 寄存器中。. (2) 计算出计数初始值并写入 TH0 、 TL0 、 TH1 、 TL1 中。 (3) 通过对中断优先级寄存器 IP 和中断允许寄存器 IE 的设置,确定计数器的中断优先级和是否开放中断。 (4) 给定时器控制寄存器 TCON 送命令字,控制定时器 / 计数器的启动和停止。. 6.3.2 初值的计算 - PowerPoint PPT Presentation

TRANSCRIPT

第 6章 定时器 /计数器

6.3 定时器 / 计数器的应用 6.3.1 初始化 初始化的内容如下: (1) 根据设计需要先确定定时器 / 计数器的工作模

式及工作方式,然后将相应的控制字送入 TMOD 寄存器中。

第 6章 定时器 /计数器 (2) 计算出计数初始值并写入 TH0 、 TL0 、 TH1 、

TL1 中。 (3) 通过对中断优先级寄存器 IP 和中断允许寄存器 I

E 的设置,确定计数器的中断优先级和是否开放中断。 (4) 给定时器控制寄存器 TCON 送命令字,控制定时

器 / 计数器的启动和停止。

第 6章 定时器 /计数器

6.3.2 初值的计算 定时器 / 计数器 T0 、 T1 不论是工作在计数器模式

还是定时器模式下,都是加 1 计数器,因而写入计数器的初始值和实际计数值并不相同,两者的换算关系如下:设实际计数值为 C ,计数最大值为 M ,计数初始值为 X ,则 X=M-C 。其中计数最大值在不同工作方式下的值不同,具体如下:

第 6章 定时器 /计数器 (1) 工作方式 0 : M=213=8192 。(2) 工作方式 1 : M=216=65 536 。(3) 工作方式 2 : M=28=256 。(4) 工作方式 3 : M=28=256 。这样,在计数器模式和定时器模式下,计数初值都是 X=

M-C( 十六进制数 ) 。定时器模式下对应的定时时间为

T=C·T 机 =(M-X)T 机 式中, T 机为单片机的机器周期 (T 机为晶振时钟周期

的 12 倍 ) 。

第 6章 定时器 /计数器

6.3.3 应用举例 [ 例 6.1] 单片机晶振 fosc=6 MHz ,利用定时器 T1

定时中断方法产生周期为 4 ms 的方波,并由 P1.0 端输出。

时间常数 2 ms 对应的计数初值 X 为 T 机 =12/fosc=(12/6)×10-6 s=2 μs

X=M-T/T 机 =213-2×10-3/(2×10-6)=7192

转化为十六进制为X=1C18H=11100000011000B

第 6章 定时器 /计数器 主程序及中断服务程序如下:ORG 0000H

AJMP INITZ ;转主程序NOP

ORG 001BH ; T1 中断入口MOV TL1 , #18H

;中断服务程序送定时初值

MOV TH1 , #0E0H

第 6章 定时器 /计数器

CPL P1.0 ; R1.0 取反RETI ;中断返回 ORG 0052H

INITZ : MOV SP , #15H ;建立堆栈指针MOV TMOD , #00H ;设置 T1 工作方式MOV TL1 , #18H ;置 T1 初值

第 6章 定时器 /计数器

MOV TH1 , #0E0H

SETB EA ; CPU 开中断SETB ET1 ;允许 T1 中断SETB TR1 ;启动 T1

AD1 : MOV A , #00H

AJMP AD1

第 6章 定时器 /计数器

[ 例 6.2] 单片机晶振 fosc=12 MHZ ,利用定时器 T0 、 T1 产生周期为 200 ms 的方波,并由 P1.0 端输出。

方法 1 :由要求可知,只要使 P1.0 每隔 100 ms 取反一次即得周期为 200 ms 的方波信号。这样就需要一个 100 ms 的定时器。

第 6章 定时器 /计数器 当 fosc=12 MHZ 时, T0( 或 T1) 在工作方式 1 下的最大

定时时间为 65.536 ms ,所以一个定时器不能满足需要,采用 T0 、 T1 各定时 50 ms ,顺序定时的方法可达到100 ms 的要求,因而我们选 T0 、 T1 为定时器模式,工作在方式 1 下,启 / 停控制由 TR0 、 TR1 完成。 GATE=0 ,这样 TMOD 的控制字为 11H 。对应 50 ms 计数初值 X 为

H0CB3D536 15

000 50536 651012/12

10502X 6

316

即 TL0=TL1=0B0H , TH0=TH1=3CH 。

第 6章 定时器 /计数器 T0 、 T1 顺序定时可采用中断方法实现,也可采用

查询方式实现,这里假定 CPU 不做其它工作,采用查询法编写程序如下:

ORG 0052H

STI : MOV TMOD , #11H

;设置 T0 、 T1 为定时器,方式 1 工作

AD1 : MOV TL0 , #0B0H ;送 T0 初值 MOV TH0 , #3CH

第 6章 定时器 /计数器 SETB TR0 ;启动 T0 进行 50 ms 定时AD2 : JBC TF0 , AD3 ;查询 TF0 是否溢出 SJMP AD2

AD3 : CLR TR0 ;停止 T0 定时 CLR TF0

MOV TL1 , #0B0H ;送 T1 定时初值 (50 ms)

MOV TH1 , #3CH

第 6章 定时器 /计数器 SETB TR1 ;启动 T1

AD4 : JBC TF1 , AD5

STMP AD4

AD5 : CLR TR1 ;停止 T1

CLR TF1 ;清溢出标志 CPL P1.0 ; P1.0 取反 AJMP AD1

第 6章 定时器 /计数器 方法 2 :用一个定时器 T0( 或 T1) ,通过软件控制

完成。即将定时器 T0 定时 50 ms ,定时器溢出两次,P1.0 被取反一次。

ORG 0052H

MOV R7 , #02H

STI : MOV TM0D , #01H

;设置 T0 、 T1 为定时器,方式 1 工作AD1 : MOV TL0 , #0B0H ;送 T0 初值 MOV TH0 , #3CH

第 6章 定时器 /计数器 SETB TR0 ;启动 T0 进行 50 ms 定时AD2 : JBC TF0 , AD3 ;查询 TF0 是否溢出 SJMP AD2

AD3 : DJNZ R7 , AD1

CLR TR0 ;停止 T0 定时 CPL P1.0 ; P1.0 取反 MOV R7 , #02H

AJMP AD1

第 6章 定时器 /计数器

[ 例 6.3] 单片机晶振 fosc=12 MHZ ,利用定时器 /计数器测量某一外部脉冲信号频率,要求连续测量五次,取其平均值作为实测值。

主程序及中断服务程序如下: ORG 0000H

AJMP MAINT

ORG 000BH

AJMP INTZ1

ORG 0100H 

MAINT : MOV SP , #15H

第 6章 定时器 /计数器 MOV TMOD , #16H

MOV TH0 , #0F5H

MOV TL0 , #0F5H

MOV R2 , #05H

MOV R1 , #20H

SETB EA

SETB ET0

ORL TCON , #50H ;启动 T0 , T1

第 6章 定时器 /计数器

AD1 : MOV A , R2

JNZ AD2

计算频率值并输出显示

AD2 : STMP AD1

ORG 0052H

INTZ1 :ANL TCON , #0AFH ;停止 T0 , T1

第 6章 定时器 /计数器 MOV @R1 , TL1

INC R1

MOV @R1 , TH1

MOV TL1 , #00H

MOV TH1 , #00H

DJNZ R2 , L1

RETI

L1 : ORL TCON , #50H

INC R1

RETI

第 6章 定时器 /计数器 [ 例 6.4] 单片机晶振 fosc=6 MHz ,设定时器 T0 工

作在方式 3 ,利用 TL0 和 TH0 两个独立的定时器在 P1.0 端产生一个占空比为 200 μs/400 μs 的矩形脉冲波。

根据题意,让 TL0 和 TH0 分别定时 200 μs 和 400 μs ,采用中断方式交替启动 TL0 和 TH0 定时,并对 P1.0端交替取反就可实现题中要求。

第 6章 定时器 /计数器 因 fosc=6 MHz ,则 200 μs 定时初值为 9CH , 400 μ

s 定时初值为 38H 。 TH0 的启 / 停由 TR1 控制,溢出标志为 TF1 。主程序和中断服务程序如下:

ORG 0000H

AJMP ZCXK1 ;转主程序 ORG 000BH

AJMP ZD0 ;转 TL0 中断程序

第 6章 定时器 /计数器 ORG 001BH

AJMP ZD1 ;转 TH0 中断程序 ORG 0100H

ZCXK1 : MOV SP , #70H ;置堆栈栈底 MOV TMOD , #03H ;设 T0 工作方式 MOV TL0 , #9CH ;置 TL0 、 TH0 初值 MOV TH0 , #38H

CLR P1.0 ; P1.0 端清零 SETB ET0 ;开 T0 中断

第 6章 定时器 /计数器 SETB ET1 ;开 T1 中断 SETB EA ;开总中断 SETB TR1 ;启动 TH0 定时开始DENG1 : AJMP DENG1 ;等待中断 ZD0 : SETB TR0 ;启动 TL0 定时 CLR TR1 ;关闭 TH0 定时 CPL P1.0 ; P1.0 取反 MOV TH0 , #38H ;重装 TH0 初值 RETI ;中断返回

第 6章 定时器 /计数器

ZD1 : SETB TR1 ;启动 TH0 定时 CLR TR0 ;关闭 TL0 定时 CPL P1.0 ; P1.0 取反 MOV TL0 , #9CH ;重装 TL0 初值 RETI ;中断返回