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