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的中断标志位需要软件清零