Timer2 简述

定时器2是一个16位定时器/计数器。
其涉及的特殊寄存器如图

寄存器介绍

T2CON

T2CON.7    TF2   
定时器溢出标志。定时时间到将会由硬件置1,必须由软件清除。当RCLK(串口接收时钟)或TCLK(串口发送时钟)=1时,TF将不会置位(作为串口的时候不需要去清空)。

T2CON.6    EXF2
定时器外部标志。
当EXEN2 = 1且T2EX的负跳变产生捕获或重装时。EXF2置位。定时器2中断使能时,EXF2 = 1将使CPU从中断向量处执行定时器2中断子程序。
EXF2位必须用软件清零。
在递增/递减计数器模式(DCEN=1)中,EXF2不会引起中断。

T2CON.5    RCLK 
接受时钟标志。
RCLK置位时,定时器2溢出脉冲作为串口模式1和模式3的接收时钟。RCLK=0时,将定时器1的溢出脉冲作为串行口模式一和模式三的接收时钟。

T2CON.4    TCLK 
发送时钟标志。
TCLK置位时,定时器2溢出脉冲作为串口模式1和模式3的发送时钟。TCLK=0时,将定时器1的溢出脉冲作为串行口模式一和模式三的发送时钟。

T2CON.3    EXEN2 
定时器2外部使能标志,当定时器未作串口时钟时,允许T2EX的负跳变产生捕获或重装。EXEN2=0时,T2EN跳变对定时器无效。

T2CON.2    TR2 
定时器2 启动/停止控制位。置1时 启动定时器。

T2CON.1    C/_T2 
定时器/计数器选择 (定时器2)
0 内部定时器(SYSclk/12 或者 SYSclk/6)
1 外部事件计数器(下降沿触发)

T2CON.0    CP/_RL2
捕获/重装标志。
置位 EXEN2 = 1时,T2EX的负跳变产生捕获。
清零 EXEN2 = 0时候,定时器2溢出或T2EX的负跳变都可以时定时器自动重装。当RCLK=1或者TCLK=1时,该位无效且定时器强制为溢出重装。

T2MOD

总结:不要管

RCAP2L/RCAP2H

8位 存储重装值

TL2/TH2

8位 实际计数量

一般格式:TL = RCAP2L = 溢出值
        TH = RCAP2H = 溢出值>>8

配置方式

定时器配置方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

此处定时时间为1s

#define TIMS (65536 - 1843) // 1/11059200*1000000*6*(1843)= 1000

void timer2_Init()
{
T2CON = 0x00; //除了波特率发生模式 TR2(定时器2启动)必须要单独启动
TR2 =1 ;

TH2 = RCAP2H = TIMS>>8;
TL2 = RCAP2L = TIMS;

ET2 =1;
}


void Timer_2 () interrupt 5 using 3
{
TF2 = 0; // 需要软件清除中断标志位
Count3++;
if(Count3>=1000)
{
Count3 =0;
sec2++;
}
}

串口配置方法

溢出值计算方法

举例: 比如我要配置9600 使用的时11.0592MHZ 6t 的51单片机
那么RCAP2H=RCAP2L = 65536 - [11059200/(16*96000)]=65536-72

实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
        11.0592Mhz   6t

void UART_Init()
{

// TMOD |= 0x20; //T1工作模式2 8位自动重装
// TH1 = 0xfd;
// TL1 = 0xfd; //比特率9600
// TR1 = 1; //启动T1 定时器
// SM0 = 0;
// SM1 = 1; //串口方式1 8位异步
// REN = 1; //串口允许接收

// 定时器1 11.0592 6t 9600

SCON |= 0x50; // 串口配置

TL2 = RCAP2L = (65536 - 72); //9600
TH2 = RCAP2H = (65536 - 72)>>8;

// TL2 = RCAP2L = (65536 - 6); //115200
// TH2 = RCAP2H = (65536 - 6)>>8;


T2CON = 0x34; //定时器2配置

EA = 1; //总中断
ES = 1; //打开串口中断
}

void UART() interrupt 4
{
if(RI) //是否接收完成
{
num= SBUF; //读入缓存
RI = 0;
SBUF = num;
while(!TI); //是否发送完成
TI = 0;

}
}

总结

定时器二可以用做串口也可用作定时器,不同于T0,T1,定时器2的中断标志位需要软件清零