上次博主转发了一篇比较不错的文章关于STC51的第三个定时器T2详解。今天写了个小测试程序,发现它作为定时器使用时。是16位自动重装载的,值得注意的是在我STC89C52RC上测试发现它不是硬件置位,也就是说在定时/计数溢出需要手动清除标志位。
以下是测试代码:
#include "timer.h"
// 主函数
void main()
{
P30=1; //初始化 板载P30口的指示灯为灭
P31=1;
Timer0_Init(100); //定时器0初始化,范围 1-256 此处100us
Timer2_Init(1000); //定时器2初始化,范围 1-65536 此处1ms
while(1)
{
;
}
}
由于我为了对比传统T0,于是在这里把T0和T2都写了进来,除此之外,T1的配置方式同T0,还有一点就是,因为T0和T1在STC89系列上面好像不能配置16位自动重载模式,尽管我在 STC89C52RC的官方文档有所见到描述,但需要注意,若要配置16位定时/计数 模式,需要软件重装。而我在这选择8位自动重载模式。
#include "timer.h"
// 平台MCU:STC89C52RC
/**********************************************************
* 函数名:Timer0_Init()
* 功 能:定时器0 初始化函数 @11.0592MHz 12T模式
* 入参数:time_0 定时时间,单位 微秒0-256 值越小误差越大
* 1us 误差8.51%, 100us 误差0.17%
* 模 式:8位自动重装载(16位需要软件重载)
* 返回值:无
*********************************************************/
void Timer0_Init(uint8 time_0) //1微秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //使用模式2,
TMOD |= 0x02; //使用"|"或 可以在使用多个定时器时不受影响
// TMOD为定时计数器的模式设置,00,01(常用),10(一般给串口),11 四种
TL0=(256-time_0); //给定初值,这里使用定时器最大值从0开始计数一直到256溢出
TH0=(256-time_0); //自动重载值
EA=1; //总中断打开
ET0=1; //定时器0中断使能
TR0=1; //定时器0开关打开,开始计时
}
/**********************************************************
* 函数名:Timer2Init()
* 功 能:定时器2 初始化函数 @11.0592MHz 12T模式
* 入参数:u16 time_2 定时时间,单位毫秒 范围:1000-65535
* 0-999 则为微秒
* 模 式:16位 无自动重装载
* 返回值:无
*********************************************************/
void Timer2_Init(uint16 time_2) //1毫秒@11.0592MHz
{
T2MOD = 0; //初始化模式寄存器
T2CON = 0; //初始化控制寄存器
TL2 = (65536-time_2)%256; //设置定时初始值
TH2 = (65536-time_2)/256; //设置定时初始值
RCAP2L = TL2; //设置定时重载值
RCAP2H = TH2; //设置定时重载值
TR2 = 1; //定时器2开始计时
EA=1; //开总中断
ET2=1; //定时器2中断使能
TR2=1; //定时器2开关打开
}
/* 定时器0中断程序 100us 中断*/
uint16 m;
void Timer0_ISR() interrupt 1 using 1
{
// TF0 = 0; //清除TF0标志, 硬件置位,故在此注释掉
/* 用户中断服务程序 */
if(m==1000*10) // 1000 ms
{
m = 0;
P31=!P31; //板载LED
}
m++;
}
/* Timer2中断服务子函数 1ms 中断*/
uint16 n;
void Timer2_ISR() interrupt 5 using 1
{
TF2 = 0; //软件置位**需手动清中断标志
if(n==500) // 500ms
{
n = 0;
P30=!P30; //LED 状态取反
}
n++;
}
每天学习一点点,好的习惯从认真做笔记开始。