6.3 定时器 / 计数器的应用
description
Transcript of 6.3 定时器 / 计数器的应用
第 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 ;中断返回