测试环境
单片机型号: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=1IPH &= 0xFD;//PT0H=0TF0 = 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函数初始化时执行;