最近在学习VC 的时候使用到了UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT*lpfnTimer)(HWND, UINT, UINT, DWORD) );函数。nIDEvent定时器非零标识,nElapse定时器的溢出时间。于是就想把这个思想用到单片机上。
void SetTime(UINT uiTime,UCHAR ucIntFun)
{
uiMaxCount = uiTime;
ucIntFunFlag = ucIntFun;
uiTimeCount = 0;
TM00_Start(); //启动定时器
}
其中uiTime为定时时长的设置值、ucIntFun为功能标志位。通过这个方式可以方便的实现同一个定时器,实现不同的定时功能。
__interrupt void MD_INTTM000(void) //定时器中断
{
if(uiTimeCount < uiMaxCount)
{
uiTimeCount ;
if(uiTimeCount == uiMaxCount)
{
uiTimeCount = 0;
switch(ucIntFunFlag)
{
case 0:
break;
case 1:
break:
case 2:
break;
default:
break;
}
}
}
}
通过定时器设定初值是计时的最小单位。通过这种方式的好处就是简单方便在定时器不复用的情况下实现不同的定时功能。但是这样做的缺点也很明显。将时间切割为小的时间片之后每个小的时间片会有一定的误差。如果计时时间比较长误差就会比较大。所以应该只试用于对计时要求不严格的场合。