第7章定时器计数器.docx

上传人:b****5 文档编号:7336062 上传时间:2023-01-23 格式:DOCX 页数:21 大小:55.40KB
下载 相关 举报
第7章定时器计数器.docx_第1页
第1页 / 共21页
第7章定时器计数器.docx_第2页
第2页 / 共21页
第7章定时器计数器.docx_第3页
第3页 / 共21页
第7章定时器计数器.docx_第4页
第4页 / 共21页
第7章定时器计数器.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

第7章定时器计数器.docx

《第7章定时器计数器.docx》由会员分享,可在线阅读,更多相关《第7章定时器计数器.docx(21页珍藏版)》请在冰豆网上搜索。

第7章定时器计数器.docx

第7章定时器计数器

第7章定时器/计数器

MCS-51单片机内部有两个16位可编程的定时器/计数器,即定时器T0和定时器T1(8052提供3个,这第三个称定时器T2)。

它们既可用作定时器方式,又可用作计数器方式。

7.1定时器/计数器结构

定时器/计数器的基本部件是两个8位的计数器(其中TH1,TL1是T1的计数器,TH0,TL0是T0的计数器)拼装而成。

在作定时器使用时,输入的时钟脉冲是由晶体振荡器的输出经12分频后得到的,所以定时器也可看作是对计算机机器周期的计数器(因为每个机器周期包含12个振荡周期,故每一个机器周期定时器加1,可以把输入的时钟脉冲看成机器周期信号)。

故其频率为晶振频率的1/12。

如果晶振频率为12MHZ,则定时器每接收一个输入脉冲的时间为1us。

当它用作对外部事件计数时,接相应的外部输入引脚T0(P3.4)或T1(P3.5)。

在这种情况下,当检测到输入引脚上的电平由高跳变到低时,计数器就加1(它在每个机器周期的S5P2时采样外部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,则计数器加1)。

加1操作发生在检测到这种跳变后的一个机器周期中的S3P1,因此需要两个机器周期来识别一个从“1”到“0”的跳变,故最高计数频率为晶振频率的1/24。

这就要求输入信号的电平要在跳变后至少应在一个机器周期内保持不变,以保证在给定的电平再次变化前至少被采样一次。

定时器/计数器有四种工作方式,其工作方式的选择及控制都由两个特殊功能寄存器(TMOD和TCON)的内容来决定。

用指令改变TMOD或TCON的内容后,则在下一条指令的第一个机器周期的S1P1时起作用。

1、定时器的方式寄存器TMOD

D7D6D5D4D3D2D1D0

GATE

C/

M1

M0

GATE

C/

M1

M0

T1方式控制字T1方式控制字

图7-1TMOD寄存器各位定义

特殊功能寄存器TMOD为定时器的方式控制寄存器,寄存器中每位的定义如图7-1所示。

高4位用于定时器1,低4位用于定时器0。

其中M1,M0用来确定所选的工作方式,如表7-1所示。

①M1M0定时器/计数器四种工作方式选择,见表7-1所示。

表7-1工作方式选择表

M1M0

方式

说明

00

0

13位定时器/计数器

01

1

16位定时器/计数器

10

2

自动装入时间常数的8位定时器/计数器

11

3

对T0分为两个8位独立计数器;对T1置方式3时停止工作(无中断重装8位计数器)

②C/

定时器方式或计数器方式选择位。

C/

=1时,为计数器方式;C/

=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位与外部中断有关,已在中断系统一节中介绍。

D7D6D5D4D3D2D1D0

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×1µs=65.536ms

方式2和3时TMmax=28×1µ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×2µs=131.072ms

我们就用定时器获得100ms的定时时间再加10次循环得到1秒的延时,可算得100ms定时的定时初值:

(216-TC)×2µ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;右移一位

MOVP1,A;输出至P1

MOVR3,#100;0.2秒

ACALLDELAY;2000微妙

DJNZR2,LOOP1;右移7次

JMPSTART

DELAY:

SETBTR0;启动TIMER0开始计时

AGAIN:

MOVTL0,#10H;设定TL0的值

MOVTH0,#0C1H;设定TH0的值

LOOP1:

JBCTF0,LOOP3;TF0是否为1,是则跳至LOOP3,并清TF0

JMPLOOP1;不是则跳到LOOP1

LOOP3:

DJNZR3,AGAIN;R3是否为0?

不是则跳到AGAIN

CLRTR0;是则停止TIMR0计数

RET

END

方法2:

延时时间0.2秒,使用TIMER0在MODE1下工作。

程序如下:

ORG00H;起始地址

MOVTMOD,#01H;设定TIMER0工作在MODE1

START:

CLRC;C=0

MOVA,#0FFH;ACC=FFH,左移初值

MOVR2,#08;R2=08,设左移8次

LOOP:

RLCA;左移一位

MOVP1,A;输出至P1

MOVR3,#20;0.2秒

ACALLDELAY;10000微妙

DJNZR2,LOOP;左移8次

MOVR2,#07;R2=07,设右移7次

LOOP1:

RRCA;右移一位

MOVP1,A;输出至P1

MOVR3,#20;0.2秒

ACALLDELAY;10000微妙

DJNZR2,LOOP1;右移7次

JMPSTART

DELAY:

SETBTR0;启动TIMER0开始计时

AGAIN:

MOVTL0,#0F0H;设定TL0的值

MOVTH0,#0D8H;设定TH0的值

LOOP1:

JBCTF0,LOOP3;TF0是否为1,是则

;跳至LOOP3,并清楚TF0

JMPLOOP1;不是则跳到LOOP1

LOOP3:

DJNZR3,AGAIN;R3是否为0?

不是

;则跳到AGAIN

CLRTR0;是则停止TIMR0计数

RET

END

方法3:

延时时间0.2秒,使用TIMER0在MODE2下工作。

程序如下:

ORG00H;起始地址

MOVTMOD,#02H;设定TIMER0工作在MODE2

START:

CLRC;C=0

MOVA,#0FFH;ACC=FFH,左移初值

MOVR2,#08;R2=08,设左移8次

LOOP:

RLCA;左移一位

MOVP1,A;输出至P1

MOVR4,#04;200毫秒

A1:

MOVR3,#200;50毫秒

ACALLDELAY;250微妙

DJNZR4,A1

DJNZR2,LOOP;左移8次

MOVR2,#07;R2=07,设右移7次

LOOP1:

RRCA;右移一位

MOVP1,A;输出至P1

MOVR4,#04;200毫秒

A2:

MOVR3,#200;50毫秒

ACALLDELAY;250微妙

DJNZR4,A2

DJNZR2,LOOP1;右移7次

JMPSTART

DELAY:

SETBTR0;启动TIMER0开始计时

AGAIN:

MOVTL0,#6;设定TL0的值

MOVTH0,#6;设定TH0的值

LOOP1:

JBCTF0,LOOP;TF0是否为1,是则

;跳至LOOP3,并清TF0

JMPLOOP1;不是则跳到LOOP1

LOOP3:

DJNZR3,AGAIN;R3是否为0?

不是则跳到AGAIN

CLRTR0;是则停止TIMR0计数

RET

END

方法4:

延时时间0.2秒,使用TIMER0在MODE3下工作。

程序如下:

ORG00H;起始地址

MOVTMOD,#03H;设定TIMER0工作在MODE3

START:

CLRC;C=0

MOVA,#0FFH;A=FFH

MOVR2,#08;R2=08,设左移8次

LOOP:

RLCA;左移一位

MOVP1,A;输出至P1

MOVR4,#04;200毫秒

A1:

MOVR3,#200;50毫秒

ACALLDELAY;250微妙

DJNZR4,A1

DJNZR2,LOOP;左移8次

MOVR2,#07;R2=07,设右移7次

LOOP1:

RRCA;右移一位

MOVP1,A;输出至P1

MOVR4,#04;200毫秒

A2:

MOVR3,#200;50毫秒

ACALLDELAY;250微妙

DJNZR4,A2

DJNZR2,LOOP1;右移7次

JMPSTART

DELAY:

SETBTR0;启动TIMER0开始计时

AGAIN:

MOVTL0,#6;设定TL0的值

LOOP1:

JBCTF0,LOOP3;TF0是否为1,是则跳至LOOP3,并清楚TF0

JMPLOOP1;不是则跳到LOOP1

LOOP3:

DJNZR3,AGAIN;R3是否为0?

不是则跳到AGAIN

CLRTR0;是则停止TIMR0计数

RET

END

例2、计数器(TIMER0)

1、功能说明

①T0每输入脉冲3次则P1的LED会做BCD码加1的变化,P1.3∽P1.0为个位(8421码),P1.7∽P1.4为十位(8421码)。

②方法1:

TIMER0工作在MODE0计数模式下。

2、硬件:

见第二章图2-16,只是在8031的14脚(T0)接一个由555组成的方波振荡器,提供计数脉冲。

3、程序如下:

ORG0000H

START:

MOVR2,#00H;计数指针

MOVTMOD,#00000100B;设定计数工作方式

LOOP1:

MOVTH0,#0FFH;设定计数3次

MOVTL0,#1DH

SETBTR0;启动计数器

LOOP1:

JBCTF0,LOOP3;溢出吗?

是则跳LOOP3

JMPLOOP1;不是则往LOOP1

LOOP3:

MOVA,R2;计数指针加1

ADDA,#01H

DAA;作BCD码调整

MOVR2,A;存入R2

CPLA;反相以作LO输出

MOVP1,A;输出至P1

JMPLOOP1

END

方法2:

TIMER0在MODE1的计数工作方式下。

程序如下:

ORG00H

START:

MOVR2,#00H;计数指针

MOVTMOD,#00000101B;设定计数工作方式

LOOP1:

MOVTH0,#0FDH;设定计数3次

MOVTL0,#0FFH

SETBTR0;启动计数器

LOOP1:

JBCTF0,LOOP3;溢出吗?

是则跳LOOP3

JMPLOOP1;不是则往LOOP1

LOOP3:

MOVA,R2;计数指针加1

ADDA,#01H

DAA;作BCD码调整

MOVR2,A;存入R2

CPLA;反相以作LO输出

MOVP1,A;输出至P1

JMPLOOP1

END

方法3:

TIMER0在MODE2的计数工作方式下。

程序如下:

ORG00H

START:

MOVR2,#00H;计数指针

MOVTMOD,#00000110B;设定计数工作方式

LOOP1:

MOVTH0,#0FDH;设定计数3次

MOVTL0,#0FDH

SETBTR0;启动计数器

LOOP1:

JBCTF0,LOOP3;溢出吗?

是则跳LOOP3

JMPLOOP1;不是则往LOOP1

LOOP3:

MOVA,R2;计数指针加1

ADDA,#01H

DAA;作BCD码调整

MOVR2,A;存入R2

CPLA;反相以作LO输出

MOVP1,A;输出至P1

JMPLOOP1

END

方法4:

TIMER0在MODE3的计数工作方式下。

程序如下:

ORG00H

START:

MOVR2,#00H;计数指针

MOVTMOD,#00000111B;设定计数工作方式

LOOP1:

MOVTH0,#0FDH;设定计数3次

SETBTR0;启动计数器

LOOP1:

JBCTF0,LOOP3;溢出吗?

是则跳LOOP3

JMPLOOP1;不是则往LOOP1

LOOP3:

MOVA,R2;计数指针加1

ADDA,#01H

DAA;作BCD码调整

MOVR2,A;存入R2

CPLA;反相以作LO输出

MOVP1,A;输出至P1

JMPLOOP1

END

应用定时器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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1