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

📄 smart_timer.c

📁 单片机实现消息队列的例子
💻 C
字号:
/*************************************************/

/**************虚拟定时器*******************/

/*************2003年2月9日*********************/

/************WROTE BY WANGSW********************/
#include "reg52x2.h"
#include "define.h"

byte data SmartTimerNumber = 0;	
MSGTYPE idata SmartTimerMsgPool[4][2];
word data wSmartTimerCounterPool[4];
word idata wSmartTimerCounterRestorePool[4];
byte idata SmartTimerSeveralPool[4];
/***************************************/

/******************************************************************************************
*函数名:		smart_timer_server
*参数:			无
*返回值:		无
*描述:			智能定时器服务程序,		依次对智能定时器			中的定时任务进行
				判定,到时的抛出消息,对于需多次运行的可以重载其定时计
				数次数
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
extern void smart_timer_server(void)
{
	byte idata i;
	if(!SmartTimerNumber)
	{	
		return;					/*r若智能定时器个数为0,则退出*/
	}
	for(i = 0; i < 4; i++)
	{
		if(GETBIT(SmartTimerNumber,i))
		{
			if(!wSmartTimerCounterPool[i])
			{
				msg_queue_in(SmartTimerMsgPool[i][0], SmartTimerMsgPool[i][1]);
				switch(SmartTimerSeveralPool[i])
				{
					case 0x00:											/*无限次*/
						wSmartTimerCounterPool[i] = wSmartTimerCounterRestorePool[i];
						break;
					case 0x01:											/*一次*/
						RESETBIT(SmartTimerNumber, i);
						break;
					default:											/*多次*/
						wSmartTimerCounterPool[i] = wSmartTimerCounterRestorePool[i];
						SmartTimerSeveralPool[i]--;
						break;
				}
			}
			wSmartTimerCounterPool[i]--;
		}
	}
}



/******************************************************************************************
*函数名:		smart_timer_idle_check
*参数:			无
*返回值:		number
*描述:			智能定时器空闲检测,返回空闲定时器数目
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
extern byte smart_timer_idle_check(void)
{
	byte idata i;
	byte idata number=0;
	for(i = 0; i < 4; i++)
	{
		if(!GETBIT(SmartTimerNumber, i))
		{
			number++;
		}
	}
	return(number);
}



/******************************************************************************************
*函数名:		smart_timer_start
*参数:			msgType			消息类型
				msgPoint		消息指针
				wCounter		在此例中以5ms为最小计数单位值,设置等待多少
								个5ms后抛出在智能计时器中的暂存任务消息
				several			智能计时器重复计数次数,这样可以多次按某一
								时间间隔抛出储存的消息
*返回值:		空闲定时器数目
*描述:			开启智能定时器,设置一个在若干时间后被抛出的消息,此消
				可以重复多次经过一定延时后再次被抛出
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
extern byte smart_timer_start(MSGTYPE msgType, MSGPOINT msgPoint, word wCounter, byte several)
{
	byte idata i;
	for(i = 0; i < 4; i++)
	{
		if(!GETBIT(SmartTimerNumber, i))
		{
			SmartTimerMsgPool[i][0] = msgType;
			SmartTimerMsgPool[i][1] = msgPoint;
			wSmartTimerCounterPool[i] = wCounter;
			SmartTimerSeveralPool[i] = several;
			wSmartTimerCounterRestorePool[i] = wCounter;
			SETBIT(SmartTimerNumber, i);
			break;
		}
	}
	return((smart_timer_idle_check() << 4) + i);			
}



/******************************************************************************************
*函数名:		smart_timer_stop
*参数:			number
*返回值:		无
*描述:			终止相应的智能定时器		,回收其资源
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
extern void smart_timer_stop(byte number)
{
	if(number == ALL)
	{
		SmartTimerNumber = 0;
	}
	else
	{
		SmartTimerNumber &= ~((byte)1 << number);	
	}
}

⌨️ 快捷键说明

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