【STC15】定时器/计数器的相关寄存器解读
- 说明:资料来源于STC官方STC15手册。
STC15定时器相关寄存器
- 定时器/计数器0/1控制寄存器:TCON
TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求中断源等,TCON格式如下:
-
TF1
:T1溢出中断标志。T1被允许计数以后,从初值开始加1计数。当产生溢出时由硬件置“1”TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”(也可由查询软件清“0”)。 -
TR1
:定时器T1的运行控制位。该位由软件置位和清零。当GATE(TMOD.7)=0,TR1=1时就允许T1开始计数,TR1=0时禁止T1计数。当GATE(TMOD.7)=1,TR1=1且INT1输入高电平时,才允许T1计数。 -
TF0
:T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置“1”TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清0(也可由查询软件清0)。 -
TR0
:定时器T0的运行控制位。该位由软件置位和清零。当GATE(TMOD.3)=0,TR0=1时就允许T0开始计数,TR0=0时禁止T0计数。当GATE(TMOD.3)=1,TR0=1且INT0输入高电平时,才允许T0计数,TRO=0时禁止T0计数。 -
IE1
:外部中断1请求源(INT1/P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该中断时由硬件清“0”IE1。 -
IT1
:外部中断源1触发控制位。IT1=0,上升沿或下降沿均可触发外部中断1。IT1=1,外部中断1程控为下降沿触发方式。 -
IE0
:外部中断0请求源(INT0/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清“0”IE0(边沿触发方式)。 -
IT0
:外部中断源0触发控制位。IT0=0,上升沿或下降沿均可触发外部中断0。IT0=1,外部中断0程控为下降沿触发方式。
定时器/计数器工作模式寄存器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
-
EA
:CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。
EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。 -
ET1
:定时/计数器T1的溢出中断允许位,ET1=1,允许T1中断,ET1=0,禁止T1中断。 -
ET0
:T0的溢出中断允许位,ET0=1允许T0中断,ET0=0禁止T0中断。 -
IP
:中断优先级控制寄存器(可位寻址)
注意:当定时器/计数器0工作在模式3(不可屏蔽中断的16位自动重装载模式)时,不需要允许EA/IE.7(总中断使能位)只需允许ETO/IE.1(定时器/计数器0中断允许位)就能打开定时器/计数器0的中断,此模式下的定时器/计数器0中断与总中断使能位EA无关。一旦此模式下的定时器/计数器0中断被打开后,该定时器/计数器0中断优先级就是最高的,它不能被其它任何中断所打断(不管是比定时器/计数器0中断优先级低的中断还是比其优先级高的中断,都不能打断此时的定时器/计数器0中断),而且该中断打开后既不受EA/IE.7控制也不再受ETO控制了,清零EA或ETO都不能关闭此中断。
定时器T4和T3的控制寄存器:T4T3M(地址:0xD1)
定时器T2、T3和T4的中断控制寄存器:IE2
定时器/计数器0工作模式
通过对寄存器TMOD中的M1(TMOD.1)、M0(TMOD.0)的设置,定时器/计数器0有4种不同的工作模式
- 模式0(16位自动重装载模式),STC官方建议只学习此模式足矣
此模式下定时器/计数器0作为可自动重装载的16位计数器,如下图所示:
当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种不同的工作模式。
- 模式0(16位自动重装载模式)STC官方推荐建议:只学习此模式足矣
当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]。
- 定时器1的16位自动重装载模式的测试程序
∥假定测试芯片的工作频率为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可以当定时器/计数器用,也可以当可编程时钟输出和串口的波特率发生器。
- 定时器/计数器2的相关特殊功能寄存器:
- 定时器2的控制寄存器:辅助寄存器AUXR
STC15系列单片机是1T的8051单片机,为兼容传统8051,定时器0、定时器1,和定时器2复位后是传统8051的速度,即12分频,这是为了兼容传统8051。但也可不进行12分频,通过设置新增加的特殊功能寄存器AUXR,将T0,T1,T2设置为1T。普通111条机器指令执行速度是固定的,快3到24倍,无法改变。
- T2的时钟输出允许控制位T2CLKO
T2CLKO/P3.0的时钟输出控制由INT_CLKO(AUXR2)寄存器中的T2CLKO位控制。T2CLKO的输出时钟频率由定时器2控制,不要允许相应的定时器中断,免得CPU反复进中断。定时器2的工作模式固定为模式0(16位自动重装载模式),在此模式下定时器2可用作时钟输出。
- T2的中断允许控制位ET2
定时器/计数器2作定时器
- T2R/AUXR.4为AUXR寄存器内的控制位,AUXR寄存器各位的具体功能描述见上节AUXR寄存器的介绍。
- 当T2CT-0时,多路开关连接到系统时钟输出,T2对内部系统时钟计数,T2工作在定时方式。当T2CT=1时,多路开关连接到外部脉冲输入P3.1/T2,即T2工作在计数方式。
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]。
-
定时器2的16位自动重载模式的测试程序
# 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反复进中断。
- 定时器2对内部系统时钟或外部引脚T2/P3.1的时钟输入进行可编程时钟分频输
出的程序举例:
#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产生。此时:
-
串行口1的波特率=(定时器T2的溢出率)/4,注意:此时波特率也与SMOD无关。
-
当T2工作在1T模式(AUXR.2/T2x12=1)时,定时器T2的溢出率=SYSclk/(65536-[RL_TH2,RL_TL2]);即此时,串行口1的波特率=SYSclk/(65536-[[RL TH2,RL TL2])/4
-
当T2工作在12T模式(AUXR.2/T2x12=0)时,定时器2的溢出率=SYSclk/12/(65536-[RL_TH2,RL_TL2]);
-
即此时,串行口1的波特率=SYSclk/12/(65536-[RL_TH2,RL_TL2])/4
-
串行口2的工作模式只有两种:模式0(8位UART,波特率可变)和模式1(9位UART,波特率可变)。串行口2只能选择定时器T2作其波特率发生器。串行口2的波特率按如下公式计算:
串行口2的波特率=(定时器T2的溢出率)/4
当T2工作在1T模式(AUXR.2/T2x12=1)时,定时器2的溢出率=SYSclk/(65536-[RL_TH2,RL_TL2]); -
当T2工作在12T模式(AUXR.2/T2x12=0)时,定时器2的溢出率=SYSclk/12/(65536-[RL_TH2,RL_TL2]);即此时,串行口2的波特率=SYSclk/12/(65536-[RL TH2,RL TL2])/4
串行口3的工作模式只有两种:模式0(8位UART,波特率可变)和模式1(9位UART,波特率可变)。串行口3可以选择定时器T3作为其波特率发生器,也可以选择定时器T2作其波特率发生器。当选择定时器2作为其波特率发生器时,串行口3的波特率按如下公式计算:
串行口3的波特率=(定时器T2的溢出率)/4
- 当T2工作在1T模式(AUXR.2/T2x12=1)时,定时器2的溢出率=SYSclk/(65536-[RL_TH2,RL_TL2]);
即此时,串行口3的波特率=SYSclk/(65536-[RL _TH2,RL _TL21)/4 - 当T2工作在12T模式(AUXR.2/T2x12=0)时,定时器2的溢出率=SYSclk/12/(65536-[[RL_TH2,RL_TL2]);
即此时,串行口3的波特率=SYSclk/12/(65536-[RL_TH2,RL_TL2])/4
串行口4的工作模式只有两种:模式0(8位UART,波特率可变)和模式1(9位UART,波特率可变)。串行口4可以选择定时器T4作为其波特率发生器,也可以选择定时器T2作其波特率发生器。
- 当选择定时器2作为其波特率发生器时,串行口4的波特率按如下公式计算:
串行口4的波特率=(定时器T2的溢出率)/4
- 当T2工作在1T模式(AUXR.2/T2x12=1)时,定时器2的溢出率=SYSclk/(65536-[RL_TH2,RL_TL2]);
- 即此时,串行口4的波特率=SYSclk/(65536-[RL_TH2,RL_TL2])/4
- -当T2工作在12T模式(AUXR.2/T2x12=0)时,定时器2的溢出率=SYSclk/12/(65536-[RL_TH2,RL_TL2]);
- 即此时,串行口4的波特率=SYSclk/12/(65536-[RL TH2,RL_TL2])/4
上面所有的式子中RL_TH2是T2H的重装载寄存器,RL_TL2是T2L的重装载寄存器。
- 定时器/计数器2作串行口1波特率发生器的测试程序
//假定测试芯片的工作频率为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倍
- 定时器T0/T1/T2的速度控制寄存器位:速度控制寄存器位:T0x12/T1x12/T2x12
== 注意:有串口2的单片机,串口2永远是使用定时器2作为波特率发生器,串口2不能够选择定时器1做波特率发生器,串口1可以选择定时器1做波特率发生器,也可以选择定时器2作为波特率发生器.== - 定时器T4和T3的速度控制寄存器位:T4x12/T3x12