⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 softtimer.h

📁 SoftTimer.h 利用定时器T2模拟多个软件定时器 特点: 只占用一个硬件定时器T2
💻 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 + -