📄 softtimer.h
字号:
/*
SoftTimer.h
利用定时器T2模拟多个软件定时器
特点:
只占用一个硬件定时器T2,就可以扩展出多达数十个以上的软件定时器
软件定时器基本定时单位是10ms,定时范围很宽:0.01~163.84s
软件定时器数量可以按需要设定,每增加一个,只多消耗2个字节的RAM空间
利用定时器T2的自动重装特性,能够实现所有软件定时器的精确定时
所有软件定时器都工作在14位倒计时方式,用TR和TF位控制,使用极为方便
第0号定时器专门用于Delay()函数,其它定时器可供用户程序自由使用
*/
#ifndef _SOFT_TIMER_H_
#define _SOFT_TIMER_H_
//#include <REG52.H>
//定义软件定时器数量(至少1个)
#define TIMER_N 16
//定义时钟频率(单位:Hz)
#define MCLK 11059200L
//定义软件定时器结构
//每个定时器只占用2个字节
struct
{
volatile unsigned TR:1; //起停标志,0-停止运行,1-开始运行
volatile unsigned TF:1; //溢出标志,0-未溢出,1-溢出
volatile unsigned TV:14; //14位定时值
}idata Timer[TIMER_N];
//软件定时器初始化
void TimerInit()
{
unsigned int x;
unsigned char i;
EA = 0;
for ( i=0; i<TIMER_N; i++ )
{
Timer[i].TR = 0;
Timer[i].TF = 0;
Timer[i].TV = 0;
}
T2CON = 0x00;
x = (unsigned int)(MCLK / 1200L);
#if ( (MCLK % 1200L) >= 600L )
x++;
#endif
x = 0 - x; //10ms定时
RCAP2L = (unsigned char)x;
RCAP2H = (unsigned char)(x >> 8);
TL2 = RCAP2L;
TH2 = RCAP2H;
ET2 = 1;
TR2 = 1;
EA = 1;
}
/*
函数:TimerOn()
功能:启动定时器
参数:
n:定时器序号
t:定时器初值,取值0~16383
t>0时,定时(0.01*t)s
t=0时,定时163.84s
*/
void TimerOn(unsigned char n,unsigned int t) reentrant
{
Timer[n].TR = 0;
Timer[n].TF = 0;
Timer[n].TV = t;
Timer[n].TR = 1;
}
/*
函数:TimerOff()
功能:关闭定时器
参数:
n:定时器序号
*/
void TimerOff(unsigned char n)
{
Timer[n].TR = 0;
Timer[n].TF = 0;
}
/*
函数:T2_INTR_SVC()
功能:定时器T2中断服务函数,每10ms中断1次,
*/
void T2_INTR_SVC() interrupt 5
{ unsigned char i;
TF2 = 0;
for ( i=0; i<TIMER_N; i++ )
{
if (Timer[i].TR)
{
if ( --Timer[i].TV == 0 )
{
Timer[i].TF = 1;
}
}
}
}
/*
函数:Delay()
功能:延时0.01~163.84s
参数:
t:延时参数,取值0~16383
t>0时,延时(0.01*t)s
t=0时,延时163.84s
*/
void Delay(unsigned int t)
{
TimerOn(0,t);
for (;;)
{
PCON |= 0x01;
if (Timer[0].TF)
{
TimerOff(0);
break;
}
}
}
#undef TIMER_N
#undef MCLK
#endif //_SOFT_TIMER_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -