第7章定时器计数器文档格式.docx
《第7章定时器计数器文档格式.docx》由会员分享,可在线阅读,更多相关《第7章定时器计数器文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
自动装入时间常数的8位定时器/计数器
11
3
对T0分为两个8位独立计数器;
对T1置方式3时停止工作(无中断重装8位计数器)
②C/
定时器方式或计数器方式选择位。
=1时,为计数器方式;
=0时,为定时器方式。
③GATE定时器/计数器运行控制位,用来确定对应的外部中断请求引脚(
,
)是否参与T0或T1的操作控制。
当GATE=0时,只要定时器控制寄存器TCON中的TR0(或TR1)被置1时,T0(或T1)被允许开始计数(TCON各位含义见后面叙述);
当GATE=1时,不仅要TCON中的TR0或TR1置位,还需要P3口的
或
引脚为高电平,才允许计数。
2、定时器控制寄存器TCON
特殊功能寄存器TCON用于控制定时器的操作及对定时器中断的控制。
其各位定义如图7-2所示。
其中D0~D3位与外部中断有关,已在中断系统一节中介绍。
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
用于外部中断
图7-2TCON寄存器各位定义
①TR0T0的运行控制位。
该位置1或清0用来实现启动计数或停止计数。
②TF0T0的溢出中断标志位。
当T0计数溢出时由硬件自动置1;
在CPU中断处理时由硬件清为0。
③TR1T1的运行控制位,功能同TR0。
④TF1T1的溢出中断标志位,功能同TF0。
TMOD和TCON寄存器在复位时其每一位均清零。
7.2工作方式
如前所述,MCS-51片内的定时器/计数器可以通过对特殊功能寄存器TMOD中的控制位C/
的设置来选择定时器方式或计数器方式;
通过对M1M0两位的设置来选择四种工作方式,现以T0为例加以说明。
1、方式0
当M1M0设置为00时,定时器选定为方式0工作。
在这种方式下,16位寄存器只用了13位,TL0的高三位未用。
由TH0的8位和TL0的低5位组成一个13位计数器。
当GATE=0时,只要TCON中的TR0为1,TL0及TH0组成的13位计数器就开始计数;
当GATE=1时,此时仅TR0=1仍不能使计数器计数,还需要
引脚为1才能使计数器工作。
由此可知,当GATE=1和TR0=1时,TH0+TL0是否计数取决于
引脚的信号,当
由0变1时,开始计数;
当
由1变0时,停止计数,这样就可以用来测量在
端出现的脉冲宽度。
当13位计数器从0或设定的初值,加1到全“1”以后,再加1就产生溢出。
这时,置TCON的TF0位为1,同时把计数器变为全“0”。
2、方式1
方式1和方式0的工作相同,唯一的差别是TH0和TL0组成一个16位计数器。
3、方式2
方式2把TL0配置成一个可以自动恢复初值(初始常数自动重新装入)的8位计数器,TH0作为常数缓冲器,TH0由软件预置值。
当TL0产生溢出时,一方面使溢出标志TF0置1,同时把TH0中的8位数据重新装入TL0中。
方式2常用于定时控制。
例如希望每隔250µ
s产生一个定时控制脉冲,则可以采用12MHz的振荡器,把TH0预置为6,并使C/
=0就能实现。
方式2不用作串行口波特率发生器。
4、方式3
方式3对定时器T0和定时器T1是不相同的。
若T1设置为方式3,则停止工作(其效果与TR1=0相同)。
所以方式3只适用于T0。
方式3使MCS-51具有三个定时器/计数器(增加了一个附加的8位定时器/计数器)。
当T0设置为方式3时,将使TL0和TH0成为两个相互独立的8位计数器,TL0利用了T0本身的一些控制(C/
,GATE,TR0,
和TF0)方式,它的操作与方式0和方式1类似。
而TH0被规定为用作定时器功能,对机器周期计数,并借用了T1的控制位TR1和TF1。
在这种情况下TH0控制了T1的中断。
这时T1还可以设置为方式0~2,用于任何不需要中断控制的场合,或用作串行口的波特率发生器。
通常,当T1用作串行口波特率发生器时,T0才定义为方式3,以增加
一个8位计数器。
7.3定时器/计数器的初始化
1、初始化步骤
MCS-51内部定时器/计数器是可编程序的,其工作方式和工作过程均可由MCS-51通过程序对它进行设定和控制。
因此,MCS-51在定时器/计数器工作前必须先对它进行初始化。
初始化步骤为:
(1)根据题目要求先给定时器方式寄存器TMOD送一个方式控制字,以设定定时器/计数器的相应工作方式。
(2)根据实际需要给定时器/计数器选送定时器初值或计数器初值,以确实需要定时的时间和需要记数的初值。
(3)根据需要给中断允许寄存器IE选送中断控制字和给中断优先级寄存器IP选送中断优先级字,以开放相应中断和设定中断优先级。
(4)给定时器控制寄存器TCON送命令字,以启动或禁止定时器/计数器的运行。
2、计数器初值的计算
定时器/计数器可用软件随时随地起动和关闭,起动时它就自动加“1”记数,一直记到满,即全为“1”,若不停止,计数值从全“1”变为全“0”,同时将计数溢出位置“1”并向CPU发出定时器溢出中断申请。
对于各种不同的工作方式最大的定时时间和计数数不同。
这里在使用中就会出现两个问题:
一是要产生比定时器最大的定时时间还要小的时间和计数器最大计数次数还要小的计数次数怎么办?
二是要产生比定时器最大的定时时间还要大的时间和计数器最大计数次数还要大的计数次数怎么办?
解决以上第一个问题只要给定时器/计数器一个非零初值,开定时器/计数器时,定时器/计数器不从0开始,而是从初值开始,这样就可得到比定时器/计数器最大的定时时间和计数次数还要小的时间和计数次数,解决第二个问题就要用到循环程序了,循环几次就相当于乘几。
例如要产生1秒的定时你可先用定时器产生50MS的定时,再循环20次就行了,因为1S=1000MS,也可用其它的组合。
有时也可采用中断来实现。
由上可见,解决问题的基本出路在于初值的计算,下面就来具体讨论计数器的初值计算和最大值的计算。
我们把计数器从初值开始作加1计数到计满为全1所需要的计数值设定为C和计数初值设定为D,由此便可得到如下的计算通式:
D=M-C
(1)
式中,M为计数器模值,该值和计数器工作方式有关。
在方式0时M为213;
在方式1时M为216;
在方式2和方式3时M为28。
3、定时器初值的计算
在定时器模式下,计数器由单片机脉冲经12分频后计数。
因此,定时器定时时间T的计算公式为:
T=(TM—TC)12/fOSC(µ
s)
(2)
式中TM为计数器从初值开始作加1计数到计满为全1所需要的时间,
TM为模值,和定时器的工作方式有关;
fOSC是单片机晶体振荡器的频率,TC为定时器的定时初值。
在式
(2)中,若设TC=0,则定时器定时时间为最大(初值为0,计数从全0到全1,溢出后又为全0)。
由于M的值和定时器工作方式有关,因此不同工作方式下定时器的最大定时时间也不一样。
例如:
若设单片机主脉冲晶体振荡器频率fOSC为12MHz,则最大定时时间为:
方式0时TMmax=213×
1µ
S=8.192ms
方式1时TMmax=216×
s=65.536ms
方式2和3时TMmax=28×
s=0.256ms
例1、设方式0工作时,定时时间为1ms,时钟振荡频率为6MHz,
解:
将数据代入公式
(2)得:
(213—TC)12/6µ
S=1ms=1000µ
S
TC=213-500=7692
化成二进制数为TC=11110000001100
根据13位定时器/计数器特性,高8位F0H送至TH0低5位0CH送TL0,一般TL0的高三位置“0”,可用下列指令实现。
MOVTL0,#0CH;
5位送TL0寄存器
MOVTH0,#0F0H;
8位送TH0寄存器
例2若单片机时钟频率fOSC为12MHz,请计算定时2ms所需的定时器初值。
解:
由于定时器工作在方式2和方式3下时的最大定时时间只有0.256ms,因此要想获得2ms的定时时间定时器必须工作在方式0或方式1。
若采用方式0,则根据式
(2)可得定时器初值为:
TC=213-2MS/1µ
s=6129
用计算机附件中的计算器可将6129转换为十六进制数为1830H
注意:
这不是定时器工作在方式0时的初值,因定时器工作在方式0时是13位,高字节8位,低字节5位,所以还要进行适当的变换,因为
1830H可写成0001100000110000
按13位重新组合成0001100000110000这组数就可拼成
1100000100010000
这样就得到定时器工作在方式0时的初值C110H
即:
TH0应装C1H;
TL0应装10H(高三位为0)。
若采取方式1,则有:
TC=216-2MS/1µ
s=63536=F830H
即:
TH0应装F8H;
TL0应装30H。
例3、设T1作定时器,以方式1工作,定时时间为10MS;
T0作计数器,以方式2工作,外界发生一次事件即溢出。
T1的时间常数为:
(216-TC)×
2µ
s=10ms
TC=EC78H
初始化程序:
MOVTMOD,#16H;
T1定时方式1,T0计数方式2,即置TMOD寄存器的内容为00010110
MOVTL0,#0FFH;
T0时间常数送TL0
MOVTH0,#0FFH;
T0时间常数送TH0
MOVTL1,#78H;
T1时间常数(低8位)送TL1
MOVTH1,#0ECH;
T1时间常数(高8位)送TH1
SETBTR0;
置TR0为1允许T0启动计数
SETBTR1;
置TR1为1允许T1启动计数
例4设定时器T0,以方式1工作,试编写一个延时1秒的子程序。
若主频频率为6MHZ可求得T0的最大定时时间为:
TMmax=216×
s=131.072ms
我们就用定时器获得100ms的定时时间再加10次循环得到1秒的延时,可算得100ms定时的定时初值:
(216-TC)×
s=100ms=100000µ
s
TC=216-50000=15536
TC=3CB0H
程序如下:
ORG0000H
MOVTMOD,#01H
MOVR7,#10
TIME:
MOVTL0,#0B0H
MOVTH0,#3CH
SETBTR1
LOOP1:
JBCTF0,LOOP2
JMPLOOP1
LOOP2:
DJNZR7,TIME
RET
END
7.4应用举例
例1、广告灯的左移右移
方法1:
延时时间使用TIMER0在MODE0下工作
1、功能说明
①开始时P1.0亮,延时0.2秒后左移至P1.1亮,如此左移7次后至P1.7亮,再延时0.2秒右移至P1.6亮,如此右移7次后至P1.0亮。
②延时时间0.2秒,使用TIMER0在MODE0下工作(时钟频率fOSC为12MHz)。
2、硬件:
见第二章图2-15或图2-16
3、程序如下:
ORG00H;
起始地址
MOVTMOD,#00H;
设定TIMER0工作在MODE0
START:
CLRC;
C=0
MOVA,#0FFH;
ACC=FFH,左移初值
MOVR2,#08;
R2=08,设左移8次
LOOP:
RLCA;
左移一位
MOVP1,A;
输出至P1
MOVR3,#100;
0.2秒
ACALLDELAY;
2000微妙
DJNZR2,LOOP;
左移8次
MOVR2,#07;
R2=07,设右移7次
LOOP1:
RRCA;
右移一位
DJNZR2,LOOP1;
右移7次
JMPSTART
DELAY:
启动TIMER0开始计时
AGAIN:
MOVTL0,#10H;
设定TL0的值
MOVTH0,#0C1H;
设定TH0的值
JBCTF0,LOOP3;
TF0是否为1,是则跳至LOOP3,并清TF0
JMPLOOP1;
不是则跳到LOOP1
LOOP3:
DJNZR3,AGAIN;
R3是否为0?
不是则跳到AGAIN
CLRTR0;
是则停止TIMR0计数
RET
END
方法2:
延时时间0.2秒,使用TIMER0在MODE1下工作。
程序如下:
MOVTMOD,#01H;
设定TIMER0工作在MODE1
MOVR3,#20;
10000微妙
MOVTL0,#0F0H;
MOVTH0,#0D8H;
TF0是否为1,是则
;
跳至LOOP3,并清楚TF0
不是
则跳到AGAIN
方法3:
延时时间0.2秒,使用TIMER0在MODE2下工作。
MOVTMOD,#02H;
设定TIMER0工作在MODE2
MOVR4,#04;
200毫秒
A1:
MOVR3,#200;
50毫秒
250微妙
DJNZR4,A1
A2:
DJNZR4,A2
MOVTL0,#6;
MOVTH0,#6;
JBCTF0,LOOP;
跳至LOOP3,并清TF0
方法4:
延时时间0.2秒,使用TIMER0在MODE3下工作。
MOVTMOD,#03H;
设定TIMER0工作在MODE3
A=FFH
JBCTF0,LOOP3;
TF0是否为1,是则跳至LOOP3,并清楚TF0
例2、计数器(TIMER0)
①T0每输入脉冲3次则P1的LED会做BCD码加1的变化,P1.3∽P1.0为个位(8421码),P1.7∽P1.4为十位(8421码)。
②方法1:
TIMER0工作在MODE0计数模式下。
见第二章图2-16,只是在8031的14脚(T0)接一个由555组成的方波振荡器,提供计数脉冲。
ORG0000H
MOVR2,#00H;
计数指针
MOVTMOD,#00000100B;
设定计数工作方式
MOVTH0,#0FFH;
设定计数3次
MOVTL0,#1DH
SETBTR0;
启动计数器
溢出吗?
是则跳LOOP3
不是则往LOOP1
MOVA,R2;
计数指针加1
ADDA,#01H
DAA;
作BCD码调整
MOVR2,A;
存入R2
CPLA;
反相以作LO输出
JMPLOOP1
TIMER0在MODE1的计数工作方式下。
ORG00H
MOVTMOD,#00000101B;
MOVTH0,#0FDH;
MOVTL0,#0FFH
TIMER0在MODE2的计数工作方式下。
MOVR2,#00H;
MOVTMOD,#00000110B;
MOVTL0,#0FDH
TIMER0在MODE3的计数工作方式下。
MOVTMOD,#00000111B;
应用定时器T0、T1来进行定时或对外部事件计数、利用MCS-51的中断功能,就能使CPU并行地执行多种操作,提高CPU的工作效率。
例3:
低频信号发生器驱动程序
我们设计一个控制程序,使8031的P1口输出8路低频方波脉冲,频率分别为100、50、25、20、10、5、2、1Hz。
我们使用定时器T0,产生5ms的定时,若晶振选11.0592MHz,则5ms相当于4608个机器周期,T