★5.4.4 定时/计数器T2的应用
例5-14:自动重装方式
设单片机系统时钟频率fOSC为12MHz,使用定时器/计数器T2工作方式于自动重装方式,请编写程序使得在P1.6引脚上输出周期为2ms,占空比为50%的方波信号。
解:设计步骤如下。
(1)求定时初值
设置定时/计数器T2为16位自动重装载方式,工作模式为定时,选择向上计数,即DCEN=0,取EXEN2=0,定时器T2为向上计数至0FFFFH溢出,置位TF2激活中断,TF2需软件清0。
(x)补=216-1ms/1μs=65536-1000=64536=FC18H
(2)确定特殊功能寄存器T2CON、T2MOD值
T2CON=04H(自动重新装入CP/RL2=0、定时C/T2=0,启动T2工作TR2=1),T2MOD=00H(向上计数DCEN=0,T2时钟输出不使能,即T2OE=0)。
(3)确定定时/计数器T2中断服务子程序入口地址
确定定时/计数器T2中断服务子程序入口地址为002BH。
(4)编写主程序和中断服务子程序
T2CON EQU 0C8H;定义T2CON寄存器字节地址为C8H
T2MOD EQU 0C9H;定义T2MOD寄存器地址为C9H
TF2 EQU T2CON.7;定义定时/计数器2计数溢出标志位
ET2 EQU IE.5;定义定时/计数器2中断允许标志位
RCAP2L EQU 0CAH;定义RCAP2L寄存器字节地址为CAH
RCAP2H EQU 0CBH;定义RCAP2H寄存器字节地址为CBH
TL2 EQU 0CCH;定义TL2寄存器字节地址为CCH
TH2 EQU 0CDH;定义TH2寄存器字节地址为CDH
IPH EQU 0B7H;定义IPH寄存器字节地址为B7H
ORG 0000H
AJMP MAIN
ORG 002BH;定时/计数器2中断入口地址
LJMP PT2INT
ORG 0100H
MAIN:MOV SP,#60H;设置堆栈区
MOV T2MOD,#00H;置T2向上计数且时钟输出不使能
MOV T2CON,#04H;置T2自动重装载定时且启动T2
MOV TH2,#0FCH;装载定时器2的定时初值
MOV TL2,#18H
MOV RCAP2L,#18H
MOV RCAP2H,#0FCH
MOV IE,#0A0H;允许T2中断,EA允许
MOV IP,#20H;置T2为第4级中断优先级
MOV IPH,#20H
SETB P1.6;预置P1.6=1
HERE:SJMP HERE;踏步等待中断
PT2INT:CLR TF2;清计数溢出标志
CPL P1.6;P1.6输出求反
RETI
END
例5-15:捕获方式
设单片机系统时钟频率为12MHz,T2工作方式为捕获方式,将捕获的计数值低8位送P3口,高8位送P2口,用频率仪和示波器观察P1.1引脚捕获脉冲频率值和波形。
设计步骤:据题意知T2工作方式为捕获方式,T2CON中EXEN2选择两种选项,此处选择EXEN2=1,即外部捕获,选定时模式,选择向上计数,即DCEN=0。
捕获脉冲:利用T0定时工作方式1,使P1.5输出周期为2ms的方波,该方波接入到P1.1引脚作为捕获脉冲。
解:(1)求定时初值
为了捕获P1.1引脚脉冲频率值,利用P1.1引脚负跳变触发定时器T2外部中断,第一次中断时,启动定时器T2开始计数。此时定时器T2的最初计数值为0,即TH2=00H,TL2=00H,而此时捕获值RCAP2L=00H,RCAP2H=00H、到第二次中断时,禁止定时器T2计数,此时捕获寄存器内容就是记录机器周期个数,可求出输出脉冲频率值。
T0选择定时工作方式1,输出周期为2ms方波,则定时器0的初值为TH0=0FCH,TL0=18H。

T2采用外部捕获,则T2CON=09H,T2选择的是向上计数,则T2MOD=00H。允许T2中断请求,允许总中断,则IE=A0H;T0工作方式1、定时、门控GATE0=0,则TMOD=01H。
(2)程序清单
程序由4部分组成:主程序、显示子程序、定时器0中断服务子程序和定时器2中断服务子程序。具体如下:
T2CON EQU 0C8H
T2MOD EQU 0C9H
CP EQU T2CON.0
TR2 EQU T2CON.2
EXEN2 EQU T2CON.3
EXF2 EQU T2CON.6
TF2 EQU T2CON.7
ET2 EQU IE.5
RCAP2L EQU 0CAH(https://www.daowen.com)
RCAP2H EQU 0CBH
TL2 EQU 0CCH
TH2 EQU 0CDH
IPH EQU 0B7H
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP PT0INT
ORG 002BH
LJMP PT2INT
ORG 0100H
MAIN:MOV SP,#60H
MOV TMOD,#01H;T0定时,工作方式1
MOV TH0,#0FCH;T0定时初值
MOV TL0,#18H
SETB TR0;启动定时器0
MOV T2MOD,#00H;定时/计数器2加法计数
MOV T2CON,#09H;T2捕获方式定时允许外部信号触发
MOV TH2,#00H;定时器2计数寄存器初值
MOV TL2,#00H
MOV RCAP2L,#00H;设置捕获寄存器计数初值
MOV RCAP2H,#00H
MOV IE,#0A2H;T0、T2中断允许,总允许
CLR 20H.0;设置中断次数标志
CLR 20H.1;设置捕获值大于量程标志
LOOP:ACALL DISP
AJMP LOOP
/**********显示子程序**********/
DISP:MOV C,20H.1
JC NEQUT;查询捕获值是否大于量程?
MOV P2,RCAP2H;捕获值小于量程,显示捕获值
MOV P3,RCAP2L
RET
NEQUT:MOV P2,#0FFH;捕获值大于量程,则显示FFFFH
MOV P0,#0FFH
RET
/**********定时器0中断服务子程序**********/
PT0INT:MOV TH0,#0FCH;定时器0重装计数初值
MOV TL0,#18H
CPL P1.5;P1.5求反,使P1.5输出方波
RETI
/**********定时器2中断服务子程序**********/
PT2INT:CLR P1.7;点亮P1.7,表明进入T2中断服务程序
JBC TF2,PTF2;定时溢出引起中断?
JBC EXF2,PEXF2;P1.1负跳变引发中断吗?
RETI
PEXF2:MOV C,20H.0;P1.1引脚负跳变引起中断,中断标志位送C
JC TT2;判断第一中断吗?Cy=0?
SETB TR2;第一次中断,启动定时器2计数
SETB 20H.0;中断次数标志置1
RETI
TT2:CLR TR2;第二次中断,定时器2停止计数
CLR 20H.0;中断次数标志清0
CLR EXEN2;T2的外部使能位清0
ESC:RETI
PTF2:MOV TH2,RCAP2H;溢出中断,重装计数初值
MOV TL2,RCAP2L
SETB 20H.1;置捕获脉冲宽度大于量程标志位
RETI