测试环境
单片机型号:STC8G1K08-38I-TSSOP20,其他型号请自行测试;
IDE:Keil C51;
定时器配置及主要代码
以定时器T0为例,查看手册,有4种工作模式:模式0(16位自动重装载模式),模式1(16位不可自动重装载模式),模式2(8位自动重装载模式),模式3(不可屏蔽中断的16位自动重装载模式);
与定时器T0相关的寄存器如下图:
我们使用定时器T0的模式0,因此要将TMOD寄存器的低4位全部设置为0,另外,还需要配置辅助寄存器AUXR,如下图:
使用1T模式,将AUXR的最高位T0x12位设置为1;
上图中红框中的公式为模式0定时器重载值的计算方法,
假设时钟频率为fOSC,重载值[TH0,TL0]为Reload,定时器T0为16位,1T模式,向上计数,到溢出的时候,共计数65536-Reload次,每次耗时1/fOSC,单位为秒,如果我们需要中断的时间为1ms,即定时器周期为1/1000ms,则:
65536
−
R
e
l
o
a
d
f
O
S
C
=
1
1000
\frac{65536-Reload}{f_{OSC}}=\frac{1}{1000}
fOSC65536−Reload=10001
即:
R
e
l
o
a
d
=
65536
−
f
O
S
C
1000
Reload = 65536 -\frac{ f_{OSC}}{1000}
Reload=65536−1000fOSC
综上,T0定时器的初始化,代码如下,其中系统时钟频率为宏定义方式,可按实际情况修改:
#define FOSC 22118400L//时钟主频22.1184Mhz
/*******************************************************************************
* 函数名:T0_Init
* 功 能:定时器T0初始化
* 参 数:无
* 返回值:无
* 说 明:模式0,16位自动重载模式,1ms中断
*******************************************************************************/
void T0_Init(void)
{
uint16_t u16Reload = 0;
AUXR |= 0x80;//T0为1T模式
TMOD &= 0xF0;//T0为16位自动重载
u16Reload = (uint16_t)((uint32_t)65536 - ((uint32_t)FOSC / 1000));
TL0 = (uint8_t)(u16Reload >> 0); //设置定时初始值
TH0 = (uint8_t)(u16Reload >> 8); //设置定时初始值
//中断优先级1,较低级
IP |= 0x02;//PT0=1
IPH &= 0xFD;//PT0H=0
TF0 = 0;//清除T0溢出中断标志
TR0 = 1;//定时器T0开始计时
ET0 = 1;//使能定时器中断
}
在定时器中断中,可以根据需要添加代码或函数:
/*******************************************************************************
* 函数名:T0_ISR
* 功 能:定时器T0中断
* 参 数:无
* 返回值:无
* 说 明:定时器T0,1ms中断
*******************************************************************************/
void T0_ISR(void) interrupt 1
{
TF0 = 0;//清除中断标志位
//do something(添加需要的代码)
}
另外,还要开启总中断,即EA = 1,可以放到main函数初始化时执行;