定时器工作原理(二)
(2011-08-29 17:45:17)
标签:
定时器计数器杂谈 |
分类: 单片机 |
定时器/计数器工作方式与程序设计
通过对特殊功能寄存器TMOD中的设置M1、M0两位的设置来选择四种工作方式,定时器/计数器0、1和2的工作方式相同,方式3的设置差别较大。
工作方式寄存器TMOD中的M1M0为:00。定时器/计数器T0工作在方式0时,16位计数器只用了13位,即TH0的高8位和TL0的低5位,组成一个13位定时器/计数器。当TL0的低5位计满溢出时,向TH0进位,TH0溢出时,对中断标志位TF0置位,向CPU申请中断。定时器/计数器0方式0的逻辑结构如图6.2所示。
|
|
1.工作在定时方式
C/ =0,定时器对机器周期计数。定时器在工作前,应先对13位的计数器赋值,开始计数时,在初值的基础上进行减1计数。
定时时间的计算公式为:
定时时间=(213 –计数初值)×晶振周期×12
或
若晶振频率为12MHz,则最短定时时间为
[213-(213-1)]×(1/12)×10-6×12=1 μs
最长定时时间为
(213-0)×(1/12)×10-6×12=8 192 μs
2.工作在计数方式
C/ =1,13位计数器对外部输入信号进行加1计数。
利用 由0变为1时,开始计数, 由1变为0时,停止计数,可以测量在 端出现的正脉冲的宽度。计数值的范围是1~213=8192 (个外部脉冲)。
【例6.2】假设AT89S52单片机晶振频率为12MHz,要求定时时间8ms,使用定时器T0,工作方式0,计算定时器初值X。
解:∵ t = (213 –X)×机器周期
【例6.3】假设AT89S52单片机晶振频率为12MHz,所需定时时间为250μs,当T0工作在方式0时T0计数器的初值是多少?
解:∵ t = (213 –X)×机器周期
【例6.4】利用T0方式0产生1ms的定时,在P1.2引脚上输出周期为2ms的方波。设单片机晶振频率fosc=12MHz。
解:(1)解题思路
要在P1.2引脚输出周期为2ms的方波,只要使P1.2每隔1ms取反一次即可。执行指令为CPL
(2)确定工作方式
:
|
|
C/ =0:T0为定时功能;(D2位)
GATE=0,只要用软件使TR0(或TR1)置1就能启动定时器T0(或T1);
(3)计算1 ms定时时T0的初值
机器周期
计数个数:X =1ms/lμs = 1000
设T0的计数初值为x0,则 x0= (213一X)s
|
|
|
|
(4)编程
可采用中断和查询两种方式编写程序。
方法一:中断方式
ORG
SETB
HERE:
SJMP
中断服务程序:
IT0P:
方法二:查询方式
LOOP:
JBC
NEXT:MOV
工作方式寄存器TMOD中的M1M0为:01。定时器T0工作方式1与工作方式0类同,差别在于其中的计数器的位数。工作方式1以16位计数器参与计数。
定时器/计数器0方式1的逻辑结构如图6.3所示。
|
1.工作在定时方式
C/ =0,定时器对机器周期计数。定时时间的计算公式为:
定时时间=(213 –计数初值)×晶振周期×12
或
若晶振频率为12MHz,则最短定时时间为
[216-(216-1)]×(1/12)×10-6×12=1 μs
最长定时时间为
(216-0)×(1/12)×10-6×12=65 536 μs=65.5 ms
2.工作在计数方式
C/ =1,16位计数器对外部输入信号进行加1计数。计数值的范围是1~216=65 536 (个外部脉冲)。
【例6.5】假设AT89S52单片机晶振频率为12MHz,所需定时时间为10ms,当T0工作在方式1时T0计数器的初值是多少?
解:∵ t = (216 –X0)×机器周期
【例6.6】假设AT89S52单片机晶振频率为12MHz,定时器T0的定时初值为9800,计算T0工作在方式1时的定时时间。
解:∵ t = (216 –X0)×机器周期
【例6.7】 用定时器T0产生50HZ的方波。由P1.0输出此方波(设时钟频率为12MHZ)。采用中断方式。
解:50HZ的方波周期T为
|
|
|
|
可以用定时器产生10ms的定时,每隔10ms改变一次P1.0的电平,即可得到50HZ的方波。
定时器T0应工作在方式1。
(1)工作在方式1时的T0初值,根据下式计算:
转换为二进制数:11011000
高8位 = 0D8H装入TH0,低8位 = 0CCH装入TL0。
(2)程序
ORG
AJMP
MAIN:
MOV
MOV
MOV
SETB
SETB
SETB
SJMP
中断服务程序;
ORG
T0INT:CPL
MOV
MOV
RETI
注:
SETB
这两条指令可以等效为
定时器/计数器0方式2的逻辑结构如图6.4所示。
工作方式寄存器TMOD中的M1M0为:10
定时器/计数器在工作方式2时,16位的计数器分成了两个独立的8位计数器TH和TL。此时,定时器/计数器构成了一个能重复置初值的8位计数器。
其中,TL用作8位计数器,TH用来保存计数的初值。每当TL计满溢出时,自动将TH的初值再次装入TL。
1.工作在定时方式
C/ =0,定时器对机器周期计数。定时时间的计算公式为:
定时时间=(28 –计数初值)×晶振周期×12
或
若晶振频率为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计数。计数值的范围是1~28=256 (个外部脉冲)。
【例6.8】利用T0方式2实现以下功能:
当T0(P3.4)引脚每输入一个负脉冲时,使P1.0输出一个500μs的同步脉冲。设晶振频率为6MHz,请编程实现该功能。其波形如图6.5所示。
图6.5
(1) 确定工作方式
首先选T0为方式2,外部事件计数方式。当P3.4引脚上的电平发生负跳变时,T0计数器加1,溢出标志TF0置1;然后改变T0为500μs定时工作方式,并使P1.0输出由1变为0。T0定时到产生溢出,使P1.0引脚恢复输出高电平。T0先计数,后定时,分时操作。
根据题目要求方式控制字TMOD是:
计数时:(TMOD) = 0000 0110B = 06H
定时时:(TMOD) = 0000 0010B = 02H
(2)计算初值
机器周期T = 12/fosc = 12/6MHZ =2μs
计数时:计数个数
计数初值 = (256﹣X) = (256﹣1) =255=0FFH,(TH0)=(TL0)=0FFH
定时时:计数个数
定时初值 = 256﹣X = 256﹣250 = 6,
(TH0) = (TL0) =
06H
(3)编程方法
采用查询方法
START:MOV
LOOPl:JBC
且TF0=0(查P3.4负跳变)
PTF01:CLR
TR0
LOOP2:JBC
且TF0=0(第一个500μs到否?)
PTF02:SETB
工作方式寄存器TMOD中的M1M0为:11。工作方式3仅对定时器/计数器0有效,此时,将16位的计数器分为两个独立的8位计数器TH0和TL0。当定时器/计数器0工作在方式3时,定时器/计数器1只能工作在方式0~2,并且工作在不需要中断的场合。
在一般情况下,当定时器/计数器1用作串行口波特率发生器时,定时器/计数器0才设置为工作方式3。此时常把定时器/计数器1设置为方式2,用作波特率发生器。
定时器/计数器0在方式3下的逻辑结构如图6.6所示。
|
【例6.9】设某用户系统中已使用了两个外部中断源,并置定时器T1工作在方式2,作串行口波特率发生器用。现要求再增加一个外部中断源,并由P1.0引脚输出一个5kHz的方波。fosc=12MHz。
(1) 确定工作方式
T0方式3下,TL0作计数用,而TH0可用作8位的定时器,定时控制P1.0引脚输出5kHz的方波信号。T1为方式2,定时。
TMOD是: 0010 0111B = 27H
(2) 计算初值
TL0初值:FFH,TH0初值X0计算如下:
∵P1.0的方波频率为5kHz,故周期
T=1/(5kHz)=0.2ms=200μs
∴用TH0定时100μs时,
X0=256﹣100×12/12=156
(3)程序如下:
MOV
TL0INT:
MOV
TL0,#0FFH
TH0INT:MOV
TH0,#156