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

📄 alarm.c

📁 该程序完成了c8051外围电路的驱动和串口协议的编写。希望能给大家学习51单片机带来帮助
💻 C
📖 第 1 页 / 共 3 页
字号:
//返    回:无
//完成日期:4/16/2007
//---------------------------------------------------------------------------------------
void JudgeBypassAlarmStatus(unsigned char uchChannel)
{
	if (AlarmModule.uchSystemBypassStatus[uchChannel - 1] == 0xff)
	{
		return;		
	}
	else if (AlarmModule.uchSystemBypassStatus[uchChannel - 1] == 0x00)
	{
		AlarmModule.uchAlarmStatus[uchChannel - 1] &= 0x00; 		
	}
	else if (AlarmModule.uchSystemBypassStatus[uchChannel - 1] == 0x01)
	{
		AlarmModule.uchAlarmStatus[uchChannel - 1] &= 0xf9;	
	}
	else if (AlarmModule.uchSystemBypassStatus[uchChannel - 1] == 0x02)
	{
		AlarmModule.uchAlarmStatus[uchChannel - 1] &= 0xf6;	
	}
	else 
	{
		return;
	}
}


//----------------------------------------------------------------------------------------------------------------
//函数名称:void AlarmIOControl(unsigned char uchChannel, unsigned char uchAlarmStatus, unsigned char uchOKStatus)
//功    能:由各种状态的判断得到报警控制输出供三冗余或43使用      
//输入参数:通道号,报警状态、 OK状态
//返    回:无
//完成日期:4/12/2007
//----------------------------------------------------------------------------------------------------------------
void AlarmIOControl(unsigned char uchChannel, unsigned char uchAlarmStatus, unsigned char uchOKStatus)
{		
	if (uchOKStatus == 1)
    {
    	SetNotOKIOControl(uchChannel);
    }   
    else if ( uchOKStatus == 0 )
	{
		if (uchAlarmStatus == 0x00)
		{
	    	SetOKIOControl(uchChannel);
		}
	    else if ((uchAlarmStatus == 0x04) || (uchAlarmStatus == 0x02))
	    {
	    	SetAlertIOControl(uchChannel);
	    }
	    else if ((uchAlarmStatus == 0x0c) || (uchAlarmStatus == 0x03))
	    {
	    	SetDangerIOControl(uchChannel);
	    }
	}
}

//--------------------------------------------------------------------------------------
//函数名称:void SetPercentValueALM(unsigned char uchChannel, int iMeasurePercent)
//功    能:设置测量的比例值到报警模块	 
//输入参数:通道号
//返    回:无
//完成日期:4/16/2007
//---------------------------------------------------------------------------------------
void SetPercentValueALM(unsigned char uchChannel, int iMeasurePercent)
{
	if (iMeasurePercent >= 5940)
	{
		iMeasurePercent = 5940;
	}
	else if (iMeasurePercent <= -1250)
	{
		iMeasurePercent = -1250;
	}
	else
	{
		;
	}
	
	AlarmModule.iMeasurePercent[uchChannel - 1] = iMeasurePercent;

}

//--------------------------------------------------------------------------------------
//函数名称:void SetAlertTypeStatusALM(unsigned char uchChannel, unsigned char uchAlertType)
//功    能:将报警类型的状态设置到报警模块中,以供报警类选择使用	 
//输入参数:通道号,报警类型
//返    回:无
//完成日期:4/16/2007
//作    者:佟文杰
//---------------------------------------------------------------------------------------
void SetAlertTypeStatusALM(unsigned char uchChannel, unsigned char uchAlertType)
{
	AlarmModule.uchAlertTypeStatus[uchChannel - 1] = uchAlertType;
}

//--------------------------------------------------------------------------------------
//函数名称:void SetAfreshConfigFlagAlarm(unsigned char uchChannel,unsigned char AfreshConfigFlag)
//功    能:将重新配置参数的标志设置到报警模块
//输入参数:通道号,重新配置参数的标志
//返    回:无
//完成日期:4/16/2007
//作    者:佟文杰
//---------------------------------------------------------------------------------------
void SetAfreshConfigFlagAlarm(unsigned char uchChannel,unsigned char AfreshConfigFlag)
{
	AlarmModule.uchAfreshConfigFlag[uchChannel - 1] = AfreshConfigFlag;
}

//--------------------------------------------------------------------------------------
//函数名称:void AlarmModuleProcess(void)
//功    能:报警模块数据的处理	  
//输入参数:通道号
//返    回:无
//完成日期:4/16/2007
//---------------------------------------------------------------------------------------
void AlarmModuleProcess(unsigned char uchChannel)
{		
	StopHeartBeat();
	SetHeartbeatALM(uiHeartbeatValue);
	StartHeartBeat();
	switch(AlarmModule.uchChannelType[uchChannel - 1])
	{
		case 13:			  //加速度输入   加速度输出
		case 14:			  //加速度输入   速度输出
		case 15:			  //加速度输入   位移输出
		case 16:			  //速度输入     速度输出
		case 17:			  //速度输入     位移输出
		case 18:			  //位移输入     位移输出
		case 21:			  //涡流+速度   输出复合式振动
		case 22:			  //LVDT输入     机壳膨胀输出
		case 28:              //HHH
			if (AlarmModule.uchEnable[uchChannel - 1] == 0) 
			{
				OutputCurrentValue(uchChannel, 400);
				AlarmIOControl(uchChannel, 0x00, 0);	//通道Disable 通道OK,无报警0x00  输出4mA
				AlarmModule.uchLEDAlarmStatus[uchChannel - 1] = 0x00;
				SetAlarmStatusMain(uchChannel, 0x00);
				SetAlarmStatusCOMM(uchChannel, 0x00);			  
			}
			else if (AlarmModule.uchOKStatus[uchChannel - 1] != 0)
			{
				JudgeAlarmStatus(uchChannel);
				JudgeBypassAlarmStatus(uchChannel);			 //20080313
				OutputCurrentValue(uchChannel, 300);			//通道不OK,输出3mA		
				SetAlarmStatusMain(uchChannel, AlarmModule.uchAlarmStatus[uchChannel - 1]);
				AlarmIOControl(uchChannel, AlarmModule.uchAlarmStatus[uchChannel - 1], 1);
				SetAlarmStatusCOMM(uchChannel, AlarmModule.uchAlarmStatus[uchChannel - 1]);		
				AlarmModule.uchLEDAlarmStatus[uchChannel - 1] = AlarmModule.uchAlarmStatus[uchChannel - 1];
			}
			else if (AlarmModule.uchOKStatus[uchChannel - 1] == 0)	
			{
				JudgeAlarmStatus(uchChannel);
				JudgeBypassAlarmStatus(uchChannel);
				
			    if (AlarmModule.uchAfreshConfigFlag[uchChannel - 1] == 0)
				{
					if (AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] == 1)
					{
						OutputCurrentValue(uchChannel, (((float)AlarmModule.iMeasurePercent[uchChannel - 1] * 16) / 50 + 400));
					}	
				}
				else if (AlarmModule.uchAfreshConfigFlag[uchChannel - 1] == 1)
				{
					AlarmModule.uchAfreshConfigStartOutCurrentCount[uchChannel - 1]++;
					if (AlarmModule.uchAfreshConfigStartOutCurrentCount[uchChannel - 1] == 5)
					{
						AlarmModule.uchAfreshConfigFlag[uchChannel - 1] = 0;
						AlarmModule.uchAfreshConfigStartOutCurrentCount[uchChannel - 1] = 0;
					}
				}
				else
				{
					if (AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] == 1)
					{
						OutputCurrentValue(uchChannel, (((float)AlarmModule.iMeasurePercent[uchChannel - 1] * 16) / 50 + 400));
					}	
				}	  
				//配置参数后的电流抑制				
				AlarmModule.uchLEDAlarmStatus[uchChannel - 1] = AlarmModule.uchAlarmStatus[uchChannel - 1];
				AlarmIOControl(uchChannel, AlarmModule.uchAlarmStatus[uchChannel - 1], 0);	
				SetAlarmStatusMain(uchChannel, AlarmModule.uchAlarmStatus[uchChannel - 1]);	
				SetAlarmStatusCOMM(uchChannel, AlarmModule.uchAlarmStatus[uchChannel - 1]);		
			}
			AlarmModule.uchResetStatus[uchChannel - 1] = 0;		//清除复位状态
			break;

		default:

			break;	
	}
	AlarmLEDControl(AlarmModule.uchLEDAlarmStatus[1] || AlarmModule.uchLEDAlarmStatus[0]);		//最后根据报警状态控制报警灯

}

//--------------------------------------------------------------------------------------
//函数名称:void HaveHotResetProcess(unsigned char uchChannel)
//功    能:有热复位时处理数据	  
//输入参数:通道号
//返    回:无
//---------------------------------------------------------------------------------------
void HaveHotResetAlarmProcess(unsigned char uchChannel)
{
	AlarmLEDControl(AlarmModule.uchLEDAlarmStatus[1] || AlarmModule.uchLEDAlarmStatus[0]);
	OutputCurrentValue(uchChannel, (((long)AlarmModule.iMeasurePercent[uchChannel - 1] * 16) / 50 + 400));
}

//--------------------------------------------------------------------------------------
//函数名称:void InitAlarmModuleSoftPara(void)
//功    能:初始化报警模块的参数	  
//输入参数:无
//返    回:无
//完成日期:4/16/2007
//---------------------------------------------------------------------------------------
void InitAlarmModuleSoftPara(void)
{
	AlarmModule.uchResetStatus[0] = 0;
	AlarmModule.uchResetStatus[1] = 0;
	AlarmModule.uchAlarmStatus[0] = 0;
	AlarmModule.uchAlarmStatus[1] = 0;
	AlarmModule.uchAlertTypeStatus[0] = 1;	 //默认报警类型的形式位当前测量形式
	AlarmModule.uchAlertTypeStatus[1] = 1;
	AlarmModule.uchChannelNotoktoOkFlag[0] = 1;	
	AlarmModule.uchChannelNotoktoOkFlag[1] = 1;	
	AlarmModule.uchLEDAlarmStatus[1] = 0; 
	AlarmModule.uchLEDAlarmStatus[0] = 0;
	AlarmModule.uchAfreshConfigFlag[0] = 0;
	AlarmModule.uchAfreshConfigFlag[1] = 0;
	AlarmModule.uchAfreshConfigStartOutCurrentCount[0]	= 0;
	AlarmModule.uchAfreshConfigStartOutCurrentCount[1] = 0;
}

//--------------------------------------------------------------------------------------------------
//函数名称:void DelayChannelNotoktoOK(unsigned char uchChannel)
//功    能:由心跳值计算通道从NOTOK到OK状态,延时10ms
//输入参数:通道号
//返    回:无			  
//完成日期:4/16/2007
//--------------------------------------------------------------------------------------------------
void DelayChannelNotoktoOK(unsigned char uchChannel)
{
	unsigned int xdata uiHeartbeatcount[2];	
	
	if ((AlarmModule.uchLastChannelOK[uchChannel - 1] != 0) && (AlarmModule.uchOKStatus[uchChannel - 1] == 0))
//			 && (AlarmModule.uchDelayStart[uchChannel - 1] == 0))
	{		
//		AlarmModule.uchDelayStart[uchChannel - 1] = 1;
		StopHeartBeat();
		AlarmModule.uiHeartBeatBAK[uchChannel - 1] = uiHeartbeatValue;		
		StartHeartBeat();
		AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] = 0;	
	}

	if (AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] == 0) 
	{
		StopHeartBeat();
		if (uiHeartbeatValue >= AlarmModule.uiHeartBeatBAK[uchChannel - 1])
		{
			uiHeartbeatcount[uchChannel - 1] = uiHeartbeatValue - AlarmModule.uiHeartBeatBAK[uchChannel - 1];
			
		}
		else
		{
			uiHeartbeatcount[uchChannel - 1] = 65535 - AlarmModule.uiHeartBeatBAK[uchChannel - 1] + uiHeartbeatValue ;							
		}
		StartHeartBeat();	
		if (uiHeartbeatcount[uchChannel - 1] > 500)
		{
			AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] = 1;
		} 
		else 
		{
			AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] = 0;
		}	
//		if (AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1] == 1)
//		{
//			AlarmModule.uchDelayStart[uchChannel - 1] = 0;							 
//		}
	}
		 	
	AlarmModule.uchLastChannelOK[uchChannel - 1] = AlarmModule.uchOKStatus[uchChannel - 1];

	SetNotOKToOKFlag(uchChannel,AlarmModule.uchChannelNotoktoOkFlag[uchChannel - 1]);

}	 

//--------------------------------------------------------------------------------------------------
//函数名称:void InitAlarmModuleHeartBeatPara(void)
//功    能:初始化报警模块心跳应用的参数
//输入参数:无
//返    回:无			  
//--------------------------------------------------------------------------------------------------
void InitAlarmModuleHeartBeatPara(void)
{
	unsigned int xdata i;
	for (i=0; i<2; i++)
	{
//		AlarmModule.uchDelayStart[i] = 0;
		AlarmModule.uiHeartBeatBAK[i] = 0; 
	}
}

	






















⌨️ 快捷键说明

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