其他分享
首页 > 其他分享> > 【STC15】定时器/计数器的相关寄存器解读

【STC15】定时器/计数器的相关寄存器解读

作者:互联网

【STC15】定时器/计数器的相关寄存器解读


STC15定时器相关寄存器

在这里插入图片描述

TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求中断源等,TCON格式如下:

在这里插入图片描述

定时器/计数器工作模式寄存器TMOD

定时和计数功能由特殊功能寄存器TMOD的控制位CT进行选择,TMOD寄存器的各位信息如下表所列。可以看出,2个定时/计数器有4种操作模式,通过TMOD的M1和M0选择。2个定时/计数器的模式0、1和2都相同,模式3不同,各模式下的功能如下所述。

在这里插入图片描述

辅助寄存器AUXR

STC15系列单片机是1T的8051单片机,为兼容传统8051,定时器0、定时器1,和定时器2复位后是传统8051的速度,即12分频,这是为了兼容传统8051。但也可不进行12分频,通过设置新增加的特殊功能寄存器AUXR,将T0,T1,T2设置为1T。普通111条机器指令执行速度是固定的,快4到24倍,无法改变。

在这里插入图片描述

TO,T1和T2的时钟输出寄存器和外部中断允许INT_CLKO(AUXR2)

TOCLKO/P3.5、TICLKO/P3.4和T2CLKO/P3.0的时钟输出控制由INT_CLKO(AUXR2)寄存器的TOCLKO位、T1CLKO位和T2CLKO位控制。TOCLKO的输出时钟频率由定时器0控制,T1CLKO的输出时钟频率由定时器1控制,相应的定时器需要工作在定时器的模式0(16位自动重装载模式)或模式2(8位自动重装载模式),不要允许相应的定时器中断,免得CPU反复进中断。T2CLKO的输出时钟频率由定时器2控制,同样不要允许相应的定时器中断,免得CPU反复进中断。定时器2的工作模式固定为模式0(16位自动重装载模式),在此模式下定时器2可用作可编程时钟输出。

在这里插入图片描述
在这里插入图片描述

定时器T0和T1的中断控制寄存器:IE和IP

在这里插入图片描述

定时器T4和T3的控制寄存器:T4T3M(地址:0xD1)

在这里插入图片描述
在这里插入图片描述

定时器T2、T3和T4的中断控制寄存器:IE2

在这里插入图片描述
在这里插入图片描述

定时器/计数器0工作模式

通过对寄存器TMOD中的M1(TMOD.1)、M0(TMOD.0)的设置,定时器/计数器0有4种不同的工作模式

当GATE=0(TMOD.3)时,如TRO=1,则定时器计数。GATE=1时,允许由外部输入INTO控制定时器0,这样可实现脉宽测量。TR0为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述见上节TCON寄存器的介绍。

当CT=0时,多路开关连接到系统时钟的分频输出,TO对内部系统时钟计数,T0工作在定时方式。当cT=1时,多路开关连接到外部脉冲输入P3.4/T0,即TO工作在计数方式。

STC15系列单片机的定时器有两种计数速率:一种是12T模式,每12个时钟加1,与传统8051单片机相同;另外一种是1T模式,每个时钟加1,速度是传统8051单片机的12倍。TO的速率由特殊功能寄存器AUXR中的TOx12决定,如果TOx12=0,T0则工作在12T模式;如果TOx12=1,T0则工作在1T模式。

定时器0有2个隐藏的寄存器RL TH0和RLTLO。RL TH0与TH0共有同一个地址,RLTLO与TL0共有同一个地址。当TR0=0即定时器/计数器0被禁止工作时,对TL0写入的内容会同时写入RL_TLO,对TH0写入的内容也会同时写入RL_THO。当TR0=1即定时器/计数器0被允许工作时,对TL0写入内容,实际上不是写入当前寄存器TL0中,而是写入隐藏的寄存器RL_TLO中;对TH0写入内容,实际上也不是写入当前寄存器TH0中,而是写入隐藏的寄存器RL_THO。这样可以巧妙地实现16位重装载定时器。当读THO和TLO的内容时,所读的内容就是THO和TL0的内容,而不是RLTHO和RLTLO的内容。

当定时器0工作在模式0(TMOD[1:0]/[M1,M0]=00B)时,[TL0,TH0]的溢出不仅置位TF0,而且会自动将[RL_TL0,RL_TH0]的内容重新装入[TL0,TH0]。

当T0CLKO/INT_CLKO.0=1时,P3.5/T1管脚配置为定时器0的时钟输出T0CLKO。
输出时钟频率=T0溢出率/2如果CT=0,定时器/计数器T0对内部系统时钟计数,则:

T0工作在1T模式(AUXR.7/T0x12=1)时的输出时钟频率=(SYSclk)/(65536-[RL TH0,RL TL0])/2
T0工作在12T模式(AUXR.7/T0x12=0)时的输出时钟频率=(SYSclk)/12/(65536-[RL_TH0,RL _TL0])/2如果C/T=1,定时器/计数器T0是对外部脉冲输入(P3.4/T0)计数,则:
输出时钟频率=(T0_Pin_CLK)/(65536-[RL_TH0,RL_TL0])/2

程序示例

∥假定测试芯片的工作频率为18.432MHz
#include"reg5l.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define FOSC	18432000L
#define TlMS	(65536-FOSC/1000) //1T模式,18.432MHz
//#define TlMS(65536-FOSC/12/1000) //12T模式,18.432MHz 
sfr	AUXR=0x8e;//Auxiliary register 
sbit P10=P1^0;
/*Timer0 interrupt routine*/
void tm0_isr() interrupt 1 using 1
Pl0 =!P10;//将测试口取反
/*main program*/
void main()
{
AUXR |=0x80;//定时器0为1T模式
/AUXR&=0x7f;//定时器0为12T模式
TMOD=0×00;//设置定时器为模式0(16位自动重装载)
TLO=TlMS;//初始化计时值
THO=TlMS>>8;
TRO=1;//定时器0开始计时
ETO =1;//使能定时器0中断
while(1);
}

定时器/计数器1工作模式

通过对寄存器TMOD中的M1(TMOD.5)、MO(TMOD.4)的设置,定时器/计数器1有3种不同的工作模式。

当GATE=0(TMOD.7)时,如TR1=1,则定时器计数。GATE=1时,允许由外部输入INT1控制定时器1,这样可实现脉宽测量。TR1为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述见上节TCON寄存器的介绍。

当cT=0时,多路开关连接到系统时钟的分频输出,T1对内部系统时钟计数,T1工作在定时方式。当cT=1时,多路开关连接到外部脉冲输入P3.5/T1,即T1工作在计数方式。

STC15系列单片机的定时器有两种计数速率:一种是12T模式,每12个时钟加1,与传统8051单片机相同;另外一种是1T模式,每个时钟加1,速度是传统8051单片机的12倍。T1的速率由特殊功能寄存器AUXR中的T1x12决定,如果T1x12=0,T1则工作在12T模式;如果T1x12=1,T1则工作在1T模式。

定时器1有2个隐藏的寄存器RLTH1和RLTL1。RLTH1与TH1共有同一个地址,RLTL1与TL1共有同一个地址。当TR1=0即定时器/计数器1被禁止工作时,对TL1写入的内容会同时写入RLTL1,对TH1写入的内容也会同时写入RLTH1。当TR1=1即定时器/计数器1被允许工作时,对TL1写入内容,实际上不是写入当前寄存器TL1中,而是写入隐藏的寄存器RL_TL1中;对TH1写入内容,实际上也不是写入当前寄存器TH1中,而是写入隐藏的寄存器RLTH1中。这样可以巧妙地实现16位重装载定时器。当读TH1和TL1的内容时,所读的内容就是TH1和TL1的内容,而不是RL_THO和RL_TL1的内容。

当定时器1工作在模式0(TMOD[5:4]/[M1,M0]=00B)时,[TL1,TH1]的溢出不仅置位TF1,而且会自动将[RL_TL1,RL_TH1]的内容重新装入[TL1,TH1]。

在这里插入图片描述

∥假定测试芯片的工作频率为18.432MHz
#include"reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define FOSC	18432000L
#define TlMS	(65536-FOSC/1000)	//1T模式,18.432MHz
#define TlMS(65536-FOSC/12/1000)//12T模式,18.432MHz 
sfr	AUXR = 0x8e;	//Auxiliary register 
sbit Pl0 = P1^0;
/*Timerl interrupt routine*/
void tm1_isr()	interrupt 3 using1
Pl0	= !P10;	//将测试口取反

/*main program*/
void main()
{
AUXR	=	0x40;	//定时器1为1T模式
AUXR	&=	0xdf;	//定时器1为12T模式
TMOD=0x00;	//设置定时器为模式0(16位自动重装载)
TL1 = TlMS;	//初始化计时值
TH1 = TlMS >>8;
TR1 = 1;//启动定时器1
定时器1开始计时
ET1 = 1;//使能定时器1中断
EA = 1;
while(1);
}

定时器/计数器2

T2的工作模式固定为16位自动重装载模式,T2可以当定时器/计数器用,也可以当可编程时钟输出和串口的波特率发生器。

在这里插入图片描述

STC15系列单片机是1T的8051单片机,为兼容传统8051,定时器0、定时器1,和定时器2复位后是传统8051的速度,即12分频,这是为了兼容传统8051。但也可不进行12分频,通过设置新增加的特殊功能寄存器AUXR,将T0,T1,T2设置为1T。普通111条机器指令执行速度是固定的,快3到24倍,无法改变。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

T2CLKO/P3.0的时钟输出控制由INT_CLKO(AUXR2)寄存器中的T2CLKO位控制。T2CLKO的输出时钟频率由定时器2控制,不要允许相应的定时器中断,免得CPU反复进中断。定时器2的工作模式固定为模式0(16位自动重装载模式),在此模式下定时器2可用作时钟输出。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

定时器/计数器2作定时器

在这里插入图片描述

STC15系列单片机的定时器2有两种计数速率:一种是12T模式,每12个时钟加1,与传统8051单片机相同;另外一种是1T模式,每个时钟加1,速度是传统8051单片机的12倍。T2的速率由特殊功能寄存器AUXR中的T2x12决定,如果T2x12=0,T2则工作在12T模式;如果T2x12=1,T2则工作在1T模式。

定时器2有2个隐藏的寄存器RL_TH2和RL_TL2。RL_TH2与T2H共有同一个地址,RL_TL2与T2L共有同一个地址。当T2R=0即定时器/计数器2被禁止工作时,对T2L写入的内容会同时写入RL_TL2,对T2H写入的内容也会同时写入RLTH2。当T2R=1即定时器/计数器2被允许工作时,对T2L写入内容,实际上不是写入当前寄存器T2L中,而是写入隐藏的寄存器RL_TL2中;对T2H写入内容,实际上也不是写入当前寄存器T2H中,而是写入隐藏的寄存器RL_TH2。当读T2H和T2L的内容时,所读的内容就是T2H和T2L的内容,而不是RL_TH2和RL_TL2的内容。

这样可以巧妙地实现16位重装载定时器。[T2L,T2H]的溢出不仅置位被隐藏的中断请求标志位(定时器2的中断请求标志位对用户不可见),使CPU转去执行定时器2的中断程序,而且会自动将[RL_TL2,RL_TH2]的内容重新装入[T2L,T2H]。

# include "reg51.h"
Mcu typedef unsigned char BYTE; typedef unsigned int WORD;
/* define constants*/
# define FOSC 18432000L
# define T38_4KHz(256-18432000/12/38400/2)/38.4KHz
/* define SFR*/
sfr	IE2 =0XAF;/(IE2.2) timer2 interrupt control bit 
sfr AUXR =0x8E;
 sfr T2H =0xD6; 
 sfr	T2L=0xD7; 
 sbit TEST_PIN = PO^0;//test pin
 /* Timer2 interrupt routine*/
void t2_isr() interrupt 12 	using1
TEST_PIN =! TEST_PIN;
/* main program*/
void main()
{
 T2L = T38_4KHz;//set timer2 reload value
 T2H = T384KH>>8; 
 AUXR |= 0x10;//timer2 start run 
 IE2 |= 0x04;//enable timer2 interrupt
 EA =1;//open global interrupt switch
  while(1);//loop
  }

定时器2对系统时钟或外部引脚T2的时钟输入进行可编程分频输出

在这里插入图片描述

定时器/计数器2除可当定时器/计数器使用外,还可作可编程时钟输出。当定时器/计数器2用
作可编程时钟输出时,不要允许相应的定时器中断,免得CPU反复进中断。

在这里插入图片描述

#include "reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define FOSC 18432000ul
sfr AUXR = 0x8e; //辅助特殊功能�存器
sfr INT_CLKO = 0x8f; //唤醒和时钟输出功能�存器
sfr T2H = 0xD6; //定时器2高8位
sfr T2L = 0xD7; //定时器2低8位
sbit T2CLKO = P3^0; //定时器2的时钟输出脚
#define F38_4KHz (65536-FOSC/2/38400) //1T模式
//#define F38_4KHz (65536-FOSC/2/12/38400) //12T模式

void main()
{
 AUXR |= 0x04; //定时器2为1T模式
// AUXR &= ~0x04; //定时器2为12T模式
AUXR &= ~0x08; //T2_C/T=0, 对内部时钟进行时钟输出
// AUXR |= 0x08; //T2_C/T=1, 对T2(P3.1)引脚的外部时钟进行时钟输出
 
 T2L = F38_4KHz; /初始化计时值
 T2H = F38_4KHz >> 8;
 
 AUXR |= 0x10; //定时器2开始计时
 INT_CLKO = 0x04; //使能定时器2的时钟输出功能
 while (1); //程序终止
}

定时器/计数器2作串行口波特率发生器

定时器/计数器2除可当定时器/计数器和可编程时钟输出使用外,还可作串行口波特率发生器。串行口1优先选择定时器2作为其波特率发生器,串行口2只能选择定时器2作为其波特率发生器,串行口3/串口4默认选择定时器2作为其波特率发生器。

串行口1如果工作在模式1(8位UART,波特率可变)和模式3(9位UART,波特率可变)时,其可变的波特率可以由定时器T2产生。此时:

串行口3的工作模式只有两种:模式0(8位UART,波特率可变)和模式1(9位UART,波特率可变)。串行口3可以选择定时器T3作为其波特率发生器,也可以选择定时器T2作其波特率发生器。当选择定时器2作为其波特率发生器时,串行口3的波特率按如下公式计算:
串行口3的波特率=(定时器T2的溢出率)/4

串行口4的工作模式只有两种:模式0(8位UART,波特率可变)和模式1(9位UART,波特率可变)。串行口4可以选择定时器T4作为其波特率发生器,也可以选择定时器T2作其波特率发生器。

串行口4的波特率=(定时器T2的溢出率)/4

上面所有的式子中RL_TH2是T2H的重装载寄存器,RL_TL2是T2L的重装载寄存器。

//假定测试芯片的工作频率为18.432M��
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 18432000L //系统频率
#define BAUD 115200 //系统波特率
#define NONE_PARITY 0 //无校验
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define MARK_PARITY 3 //标记校验
#define SPACE_PARITY 4 //空白校验
#define PARITYBIT EVEN_PARITY //定义校验位
sfr AUXR = 0x8e; //辅助寄存器
sfr T2H = 0xd6; //定时器2高8位
sfr T2L = 0xd7; //定时器2低8位
sbit P22 = P2^2;
bit busy;
void SendData(BYTE dat);
void SendString(char *s);
void main()
{
#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
 SCON = 0xda; //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
 SCON = 0xd2; //9位可变波特率,校验位初始为0
#endif
 T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
 T2H = (65536 - (FOSC/4/BAUD))>>8;
 AUXR = 0x14; //T2为1T模式, 并启动定时器2
 AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
 ES = 1; //使能串口1中断
 EA = 1;
 SendString("STC15F2K60S2\r\nUart Test !\r\n");
 while(1);
}
/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
 if (RI)
 {
 RI = 0; //清除RI位
 P0 = SBUF; //P0显示串口数据
 P22 = RB8; //P2.2显示校验位
 }
 if (TI)
 {
 TI = 0; //清除TI位
 busy = 0; //清忙标志
 }
}
/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
 while (busy); //等待前面的数据发送完成
 ACC = dat; //获取校验位P (PSW.0)
 if (P) //根据P来设置校验位
 {
 #if (PARITYBIT == ODD_PARITY)
 TB8 = 0; //设置校验位为0
 #elif (PARITYBIT == EVEN_PARITY)
 TB8 = 1; //设置校验位为1
 #endif
 }
 else
 {
 #if (PARITYBIT == ODD_PARITY)
 TB8 = 1; //设置校验位为1
 #elif (PARITYBIT == EVEN_PARITY)
 TB8 = 0; //设置校验位为0
 #endif 
 }
 busy = 1;
 SBUF = ACC; //写数据到UART数据寄存器
}
/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
 while (*s) //检测字符串结束标志
 { 
 SendData(*s++); //发送当前字符
 }
}

定时器/计数器3及定时器/计数器4

STC15W4K60S4还新增了两个16位定时/计数器:T3和T4。T3、T4和T2一样,它们的工作模还新增了两个16位定时/计数器:T3和T4。T3、T4和T2一样,它们的工作模两个16位定时/计数器:T3和T4。T3、T4和T2一样,它们的工作模:T3和T4。T3、T4和T2一样,它们的工作模T3和T4。T3、T4和T2一样,它们的工作模和T4。T3、T4和T2一样,它们的工作模。T3、T4和T2一样,它们的工作模、T4和T2一样,它们的工作模式固定为16位自动重装载模式。T3和T4既可以当定时器/计数器用,也可以当可编程时钟输出和T4既可以当定时器/计数器用,也可以当可编程时钟输出可以当定时器/计数器用,也可以当可编程时钟输出计数器用,也可以当可编程时钟输出用,也可以当可编程时钟输出和串口的波特率发生器。

STC15F2K60S2的6个定时器/计数器(注意没有T3和T4),3个16位可重装载定时器/计数器(T0/T1/T2,其中T0/T1兼容普通8051的定时器/计数器),并均可独立实现对外可编程时钟输出(3通道),另外管脚
MCLKO可将内部主时钟对外分频输出(÷1或÷2或÷4),3路CCP/PWM/PCA还可再
实现3个定时器。

如何将定时器T0/T1/T2/T3/T4的速度提高12倍

标签:定时器,STC15,T2,模式,寄存器,RL,波特率
来源: https://blog.csdn.net/weixin_42880082/article/details/122796262