MCS-51 单片机的定时器/计数器

2022-12-09  

MCS-51 单片机的定时器/计数器

主要内容:定时器/计数器的结构、定时器/计数器的4 种工作方式、对外部输入的计数信号的要求、定时器/计数器的编程和应用。


概述:两个可编程的定时器/计数器T1、T0。


两种工作模式:

(1)计数器工作模式

(2)定时器工作模式

4种工作方式(方式0-方式3)。

6.1 定时器/计数器的结构

TMOD:选择定时器/计数器T0、T1的工作模式和工作方式。

TCON:控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。

单片机复位时,两个寄存器的所有位都被清0。

6.1.1 工作方式控制寄存器TMOD

8位分为两组,高4位控制T1,低4位控制T0。

(1)GATE——门控位

0:以TRX(X=0,1)来启动定时器/计数器运行。

1:用外中断引脚(INT0*或INT1*)上的高电平和TRX来启动定时器/计数器运行。

(2)M1、M0——工作方式选择位

M1 M0 工 作 方 式

0 0 方式0,13位定时器/计数器。

0 1 方式1,16位定时器/计数器。

1 0 方式2,8位常数自动重新装载

1 1 方式3,仅适用于T0,T0分成两个8位计数器,T1停止计数。

(3) C/T*——计数器模式和定时器模式选择位

0:定时器模式。

1:计数器模式。

6.1.2 定时器/计数器控制寄存器TCON

低4位与外部中断有关,已介绍。高4位的功能如下:

(1) TF1、TF0——计数溢出标志位

(2) TR1、TR0——计数运行控制位

1:启动定时器/计数器工作

0:停止定时器/计数器工作

6.2 定时器/计数器的4种工作方式

6.2.1 方式0

M1、M0为00 ,定时器/计数器的框图:

为13位的计数器 ,C/T* 位决定工作模式:

0:开关打在上面,为定时器工作模式;

1:开关打在下面,为计数器工作模式,计数脉冲为P3.4、P3.5引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加1。

GATE位:决定定时器/计数器的运行取决于TRX一个条件还是TRX和INTX*引脚两个条件。

(1)0:A点(见图6-2)是否计数,仅取决于TRX的状态。

(2)1:B点电位由INTX*的输入电平和TRX的状态这两个条件来确定。是否计数是由TRX和INTX*二个条件来控制的。

6.2.2 方式1


M1、M0=01,16位的计数器。

6.2.3 方式2

计数满后自动装入计数初值。

M1、M0=10 ,等效框图如下:

TLX作为常数缓冲器,当TLX计数溢出时,在置“1”溢出标志TFX的同时,还自动的将THX中的初值送至TLX,使TLX从初值开始重新计数。定时器/计数器的方式2工作过程如图6-5(X=0,1)。

省去用户软件中重装初值的程序,精确的定时。

6.2.4 方式3

增加一个附加的8位定时器/计数器,从而具有3个定时器/计数器。只适用于定时器/计数器T0。T1不能工作在方式3,T1方式3时相当于TR1=0,停止计数(此时T1可用来作串行口波特率产生器)。

1.工作方式3下的T0

T0分为两个独立的8位计数器:TL0和TH0 。TL0使用T0的状态控制位C/T*、GATE、TR0、,而TH0被固定为一个8位定时器(不能作外部计数模式),并使用定时器T1的状态控制位TR1和TF1,同时占用定时器T1的中断请求源TF1。 各引脚与T0的逻辑关系如图所示:

2.T0工作在方式3下T1的各种工作方式

当T1用作串行口的波特率发生器时, T0才工作在方式3。T0处于方式3时, T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合。

(1)T1工作在方式0

(2) T1工作在方式1

(3) T1工作在方式2

6.3 定时器/计数器对输入信号的要求

计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生负跳变时,计数值增1。每个机器周期S5P2期间,都对外部输入引脚T0或T1进行采样。如在第1个机器周期中采得值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。由于确认一次负跳变要花2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率1/24。

外部计数脉冲的最高频率为系统振荡器频率的1/24,例如选用12MHz频率的晶体,则可输入500KHz的外部脉冲。

输入信号的高、低电平至少要保持一个机器周期。如图6-10所示,图中Tcy为机器周期。

6.4 定时器/计数器的编程和应用

4种工作方式中,方式0与方式1基本相同,由于方式0是为兼容MCS-48而设,初值计算复杂,在实际应用中,一般不用方式0,而采用方式1。

6.4.1 方式1应用

例6-1 假设系统时钟频率采用6MHz,要在P1.0上输出一个周期为2ms的方波,如图所示。


方波的周期用T0来确定,让T0每隔1ms计数溢出1次,既T0每隔1ms产生一次中断,CPU相应中断后,在中断服务程序中对P1.0取反。

(1)计算初值X

定时时间=(216−X)×12/晶振频率

设初值为X,则有:(2^16-X)×2×10^(-6)=1×10-3216-X=500

因为单个系统时钟周期为:(1/6m*12)

备注:12分频

所以:X=65036

X化为16进制,即X=FE0CH=1111111000001100B。

所以,T0的初值为:TH0=0FEH TL0=0CH

(2)初始化程序设计:

主要是对寄存器IP、IE、TCON、TMOD的相应位进行正确设置,将计数初值送入定时器中。

(3)程序设计

中断服务程序除了完成要求的产生方波这一工作之外,还要注意将计数初值重新装入定时器中,为下一次产生中断作准备。

ORG 0000H

RESET: AJMP MAIN ;转主程序

ORG 000BH;T0的中断入口

AJMP IT0P;转T0中断处理程序IT0P

ORG 0100H

MAIN: MOV SP,#60H ;设堆栈指针

MOV TMOD,#01H;设置T0味方式一

ACALL PT0M0;调用子程序PT0M0

HERE: AJMP HERE ;自身跳转

PT0M0:MOV TL0,#0CH;T0中断服务程序,T0重新置初值

MOV TH0,#0FEH

SETB TR0;启动T0

SETB ET0;允许T0中断

SETB EA;CPU开中断

RET

IT0P: MOV TL0,#0CH;T0中断服务子程序,T0置初值

MOV TH0,#0FEH

CPL P1.0 ;P1.0的状态取反

RETI

END


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。