📄 otimer.c
字号:
extern void Phone_ToneCheck() ;
extern void Check_DXC_Conter() ;
#define OTimer_Macro_MaxLogicTimerNum 8 /*最大逻辑定时器数量*/
#define OTimer_Macro_10msTH /*0x9E*/ 0xDC /*4M晶振,10ms定时器中断定时值*/
#define OTimer_Macro_10msTL /*0x57*/ 0x17 /*10ms定时器中断定时值*/
#define OTimerID0 0
#define OTimerID1 1
#define OTimerID2 2
#define OTimerID3 3
#define OTimerID4 4
#define OTimerID5 5
#define OTimerID6 6
#define OTimerID7 7
static uchar OTimer_RD_10msCounter ; //10ms计数器
//static uchar OTimer_RD_100msCounter ; //100ms级计数器
//static uint OTimer_RD_Counter; //秒级系统计数器
static uint OTimer_RD_DelayCounters ; //延时计数器
static uchar OTimer_RD_Status; //逻辑定时器状态 1:发生了 0:未发生
static uchar OTimer_RD_Enable; //逻辑定时器允许位 1:启动 0:为启动
static uchar OTimer_RD_Mode; //逻辑定时器模式 1:重载 0:单次
static uchar OTimer_RD_Interval[OTimer_Macro_MaxLogicTimerNum];//逻辑定时器定时值
static uchar OTimer_RD_DecCounter[OTimer_Macro_MaxLogicTimerNum];
extern void OTel_Rece_DTMF() ;
/************************************************
Name : 定时器初始化.
Date : 10:29PM 03/05/02
*************************************************/
void Sys_TimerInit()
{
ET0 = 0; /* Forbid T0 INT */
TMOD = (TMOD & 0xf0) | 0x01; /*方式1*/
TF0 = 0; /* Reset */
TH0 = OTimer_Macro_10msTH; /* VER 99 */
TL0 = OTimer_Macro_10msTL;
/*重载定时器*/
OTimer_RD_10msCounter = 0;
// OTimer_RD_100msCounter = 0;
OTimer_RD_Status = 0;
OTimer_RD_Enable = 0;
EA = 1 ; /* CPU Open INT */
ET0 = 1; /* Permit T0 INT */
PT0 = 0; /* Lower Priority */
TR0 = 1; /* Start T0 */
// OTimer_RD_Counter = 0xffff ;
return ;
}
/************************************************
Name : Sys_TimerReqire
Describ : 逻辑定时器申请. 定时误差为1个TICK.
*************************************************/
uchar Sys_TimerReqire(uchar OTimerID, uchar Interval, uchar Mode)
{
uchar temp_ret;
ET0 = 0; /* Forbid */
temp_ret = 0x01;
/*申请空余定时器*/
if(OTimerID > OTimerID7)
{
ET0 = 1;
return (ERROR);
}
if (Interval == 0) /* 立即执行 */
{
OTimer_RD_Status |= (temp_ret << OTimerID);
ET0 = 1;
return (OK);
}
OTimer_RD_Interval[OTimerID] = Interval;
OTimer_RD_DecCounter[OTimerID] = Interval;
OTimer_RD_Enable |= (temp_ret << OTimerID);
OTimer_RD_Status &= ((temp_ret << OTimerID) ^ 0xFF);
if(Mode == 0)
OTimer_RD_Mode &= ((temp_ret << OTimerID) ^ 0xFF);
else
OTimer_RD_Mode |= (temp_ret << OTimerID);
ET0 = 1;
return (OK);
}
void OTimer_RP_Interrupt() interrupt 1 using 2
{
uchar i,temp_ret;
TH0 = OTimer_Macro_10msTH;//10ms定时
TL0 = OTimer_Macro_10msTL;
OTimer_RD_10msCounter ++;
OTimer_RD_DelayCounters ++;
Phone_ToneCheck() ;
Check_DXC_Conter() ;
OTel_Rece_DTMF() ;
display_Line() ;
if (OTimer_RD_10msCounter != 10) return;
OTimer_RD_10msCounter = 0;
// OTimer_RD_100msCounter ++ ;
// if (OTimer_RD_100msCounter == 10)
// {
// OTimer_RD_100msCounter = 0;
// OTimer_RD_Counter ++ ; /*秒级系统计数器*/
// }
/*每100ms做以下工作*/
temp_ret = 1;
for(i = 0; i < 8; i++)
{
if(((OTimer_RD_Enable >> i) & 1) == 1)
{
OTimer_RD_DecCounter[i] --;
if(OTimer_RD_DecCounter[i] == 0) //定时到
{
OTimer_RD_Status |= (temp_ret << i);
if(((OTimer_RD_Mode >> i) & 1) == 1) //重载定时器
{
OTimer_RD_DecCounter[i] = OTimer_RD_Interval[i];
}
else //释放定时器
{
OTimer_RD_Enable &= ((temp_ret << i) ^ 0xFF);
}
}
}
}
}
/************************************************
Name : 释放定时器.
Describ : 释放指定逻辑定时器.
*************************************************/
void Sys_TimerRelease(uchar OTimerID)
{
uchar temp_ret ;
ET0 = 0 ;
temp_ret = 0x01;
if(OTimerID > OTimerID7)
{
ET0 = 1;
return;
}
OTimer_RD_Enable &= ((temp_ret << OTimerID) ^ 0xFF);
OTimer_RD_Status &= ((temp_ret << OTimerID) ^ 0xFF);
ET0 = 1 ;
return ;
}
/**********************************
逻辑定时器查询
输入:无
输出:逻辑定时器号
**********************************/
uchar Analyse_OTimerID()
{
uchar i,temp_buffer;
uchar temp_ret;
temp_ret = 1;
temp_buffer = OTimer_RD_Status;
for(i = 0; i < 8; i++)
{
if((temp_buffer & 1) == 1)
break;
temp_buffer >>= 1;
}
if(i < 8)
OTimer_RD_Status &= ((temp_ret << i) ^ 0xFF);
return(i);
}
/*************************************************
Name :延时程序。
Describ :最长延时65s
Input :无
Output :无
*************************************************/
void delay(uint DelayTime)
{
ET0 = 0;
DelayTime /= 10; /* VER 99 */
OTimer_RD_DelayCounters = 0;
ET0 = 1;
while (OTimer_RD_DelayCounters < DelayTime)
{
IDLE;
}
}
/************************************************
Name : 清除定时器.
Describ : 清除所有逻辑定时器. (不建议使用)
Input : 无
Output : 无
*************************************************//*
void Sys_TimerClear()
{
OTimer_RD_Enable = 0;
OTimer_RD_Status = 0;
}
*/
void time(uint delaytime)
{
while(--delaytime);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -