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

📄 timer.c

📁 这是一个用C51分割定时器的好例子
💻 C
字号:
#include  "TypeDef.h"
#include  "System.h"
#include  "AT78E58BP.H"
#include  "Timer.h"
#include  <stdlib.h>
#include   <intrins.h>


//------------------------------------------------------------------------------
  //Comm Public:公有通用函数与成员
//------------------------------------------------------------------------------
uchar Reload_TH0;
uchar Reload_TL0;
//------------------------------------------------------------------------------
  //Comm Private:私有函数和成员
//------------------------------------------------------------------------------
st_TimerHandle *TimerListHeader;
Uchar CreatedUserTimer;
idata TProcess TimerEventBuf[MaxTimerEvent];
idata uchar TEvent_Head;
idata uchar TEvent_Trail;

//------------------------------------------------------------------------------
  //函数实现部分
//------------------------------------------------------------------------------
  //功  能:定时器0中断入口函数
  //返回值:
  //参  数:
//------------------------------------------------------------------------------
void Timer0_Event(void) interrupt 1 //using 3
{
register st_TimerHandle *Point;
TF0=0;
Point=TimerListHeader;
while(Point!=NULL)
	 {
	   if(Point->Opened)
	     {
	       if(Point->EventCount==0)
             {
               TimerEventBuf[TEvent_Head]=Point->ProcAddr;
			   if((TEvent_Head+1)%MaxTimerEvent!=TEvent_Trail)
                  TEvent_Head=(TEvent_Head+1)%MaxTimerEvent;
	           Point->EventCount=Point->InitCount;
              }else Point->EventCount--;
	      };//end if
	   Point=Point->NextTimer;
     };//end while
TH0=Reload_TH0;
TL0=Reload_TL0;
}
//------------------------------------------------------
void InitSysTimer0(Uchar IntTimer)
{
register Uchar i;

TimerListHeader=0x00;
CreatedUserTimer=0x00;
for(i=0;i<MaxTimerEvent;i++) TimerEventBuf[i]=NULL;

TMOD_Map=(TMOD_Map&Time1_MOD)|Time0_InitMOD;
SetTMOD(TMOD_Map);

ET0=false;
TR0=false;
/*if(IntTimer==TimeInt_5ms)
  {
   TH0=TM16_5ms_H;
   TL0=TM16_5ms_L;
   Reload_TH0=TM16_5ms_H;
   Reload_TL0=TM16_5ms_L;
  };//end if
if(IntTimer==TimeInt_10ms)
  {
   TH0=TM16_10ms_H;
   TL0=TM16_10ms_L;
   Reload_TH0=TM16_10ms_H;
   Reload_TL0=TM16_10ms_L;
  };//end if*/
if(IntTimer==TimeInt_10ms)
  {
   TH0=TM16_10ms_H;
   TL0=TM16_10ms_L;
   Reload_TH0=TM16_10ms_H;
   Reload_TL0=TM16_10ms_L;
  };//end if
}
//------------------------------------------------------
bool OpenSysTimer0(void)
{
ET0=true;
TR0=true;
return ET0&&TR0;
}
//------------------------------------------------------
/*bool CloseSysTimer0(void)
{
ET0=false;
TR0=false;
return ET0||TR0;
}*/
//------------------------------------------------------
bool OpenUserTimer(st_TimerHandle *HandleID)
{
HandleID->Opened=true;
HandleID->EventCount=HandleID->InitCount;
return (bool)HandleID->Opened;
}
//------------------------------------------------------
/*bool CloseUserTimer(st_TimerHandle *HandleID)
{
HandleID->Opened=false;
HandleID->EventCount=0;
return (bool)HandleID->Opened;
}*/
//------------------------------------------------------
bool InstallUserTimer(st_TimerHandle * HandleID,Uint Interval)
{
register st_TimerHandle *Point;

if(CreatedUserTimer>=MaxUserTimerCount) return false;

if(TimerListHeader!=NULL)
  {
    Point=TimerListHeader;
    while(Point->NextTimer!=NULL) Point=Point->NextTimer;
    Point->NextTimer=HandleID;
  }else TimerListHeader=HandleID; //end if

HandleID->Opened=false;
HandleID->InitCount=Interval;
HandleID->EventCount=0;
HandleID->NextTimer=NULL;
HandleID->ProcAddr=NULL;

CreatedUserTimer++;
return true;
}
//------------------------------------------------------
/*bool UnInstallUserTimer(st_TimerHandle * HandleID)
{
st_TimerHandle *PrecPoint;
st_TimerHandle *FindPoint;
bool Result=false;

PrecPoint=NULL;
FindPoint=TimerListHeader;	

while(FindPoint!=NULL)
     {
       if(FindPoint==HandleID) break;
	   PrecPoint=FindPoint;
   	   FindPoint=FindPoint->NextTimer;
     };//end if
if(FindPoint!=NULL)
  {
    if(PrecPoint!=NULL)
      {
	    PrecPoint->NextTimer=FindPoint->NextTimer;
        FindPoint->NextTimer=NULL;
	  }else TimerListHeader=FindPoint->NextTimer;
    Result=true;
    CreatedUserTimer--;
  };//end if
return Result;
}*/
//------------------------------------------------------
void SetTimerProc(st_TimerHandle * HandleID,TProcess Addr)
{
HandleID->ProcAddr=Addr;
}
//------------------------------------------------------------
void TimerWork(void)
{
register TProcess Process=NULL;
if(TEvent_Trail!=TEvent_Head)
	{
	  Process=TimerEventBuf[TEvent_Trail];
	  TEvent_Trail=(TEvent_Trail+1)%MaxTimerEvent;
	};//end if
if(Process!=NULL) Process();
}
//-------------------------------------------------------------
/*bool GetTimerOpened(st_TimerHandle * HandleID)
{
return (bool)HandleID->Opened;
}
//-------------------------------------------------------------*/
/*void SetTimerInterval(st_TimerHandle * HandleID,uint Interval)
{
HandleID->EventCount=Interval;
HandleID->InitCount=Interval;
}
//------------------------------------------------------------------------------
void  Delay_10_uS(void)
{
//char i=;
//char i=20;
// while(i--);
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}*/
//------------------------------------------------------------------------------
void ms_delay( uint n_milisecond)  
{
uchar i;
while(n_milisecond--)
     {
       //i=37;
       i=74;
       while(i--);
     };//end if
}
//------------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -