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

📄 env.c

📁 16为单片机实现调制解调器功能
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "msp430x14x.h"
#include "main.h"
#include <stdlib.h>
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
//from ds1820drv.c
unsigned char  DS1820_Read_Byte_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
void           DS1820_Write_Byte_MultiChannel(unsigned char chMCUPort, unsigned int DataBit, unsigned char val);
unsigned char  DS1820_Reset_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
//void           DS1820_Write_Reg_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
//void           DS1820_StartConvert_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
extern void DS1820_StartConvert_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
extern unsigned char DS1820_Read_Temperature_Board(unsigned char chMCUPort, unsigned int DataBit);
extern void DS1820_Write_Reg_MultiChannel(unsigned char chMCUPort, unsigned int DataBit);
//from debug.c
extern void ExternInsertDebugSendBuf(unsigned char *pData, unsigned int intLen);
//from main.c
extern unsigned int g_intMark;
extern unsigned int g_intMarkA;
//--test
extern unsigned int intTBCount_50ms;
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区**************** 

unsigned char g_chEnv_Free;//按位表示 环境  为空闲,既不报告告警
						//3--5位为三路环境模拟量:温度1,有害气体,48V,第6位为门系统
unsigned char g_chEnv_Mark;// -------按位表明1-2通道的环境的要等待发送告警或恢复状态
						//3--5位为三路环境模拟量:温度1,有害气体,48V,第6位为门系统
unsigned char g_chEnv_Alert;// -------按位表明1-2通道的环境的要等待发送告警状态
						//3--5位为三路环境模拟量:温度1,有害气体,48V,第6位为门系统
unsigned char g_chEnv_Restore;// -------按位表明1-2通道的环境的要等待发送恢复状态
						//3--5位为三路环境模拟量:温度1,有害气体,48V,第6位为门系统
unsigned char g_chEnv_LowHign;//对于 象		温度1		48V 要分高还是低告警!		
//温度
unsigned char g_chTemperatureAlert,g_chTemperatureRestore;
unsigned char g_chTemperatureBoardAlert,g_chTemperatureBoardRestor;		
//3 个 A/D 处理		
unsigned char g_chDCAlert,g_chDCRestore;//P6。2
unsigned char g_chBadGasAlert,g_chBadGasRestore;//P6。0
unsigned char g_chTheTwoADAlert,g_chTheTwoADRestore;			
											
unsigned char g_chEnv_Status;//-按位表明1-2通道的环境的告警/恢复状态
						//3--5位为三路环境模拟量(温度1,48V,有害气体):
						//6位为门禁,
						//7位为温度2 剩下一个可以以后扩展
//门的缓冲区
unsigned char g_chDoorStatAlert[20];
unsigned char g_chDoorStatHead,g_chDoorStatTail;//,用20缓冲区来记录门状态改变
//温度						
void ProcessTemperatures(void);
unsigned char g_chTemperature;
unsigned char g_chTemperatureSift;
unsigned char g_chTemperatureBoard;
//门
void ReadDoorID(void);
void MainDoor(void);
unsigned char g_chDoorStat;//0-门关 1-密码开门 2-非法开门 3-中心开门 4-禁用门禁 5-启用 6-门开
unsigned char g_chDoorStatTemp;//门状态变化中的量
unsigned char g_chOpenDoorID[3];//记录开门人,保留的是索引号
unsigned char g_chDoorSwitch_50ms;
unsigned char g_chDoorOpened_1s;
#define Door_Opened_1s_Max 10
#define Door_Stability_50ms 10
unsigned char g_chDoorClosed_50ms;
//环境开关量
void ProcessSwitch(void);
	unsigned char g_chEnvChanOne;
	unsigned char g_chEnvChanTwo;
	#define EnvSampleSift 4
//2 个 A/D 处理
void ProcessAD(void);
	unsigned char g_chDC;//P6。2
	unsigned char g_chBadGas;//P6。0
	unsigned char g_chTheTwoAD;
	unsigned char g_chProcessAD_50ms;
	unsigned char g_chDCSift;
	unsigned char g_chBadGasSift;//P6。0
	unsigned char g_chTheTwoADSift;
	#define ADSiftMax 5
	#define ADSampleFirstSift 16
void ProcessAD(void);
	unsigned char g_chProcessAD_Stat;
void ProcessAD(void)
{
	switch(g_chProcessAD_Stat)
	{
		case 0://
			ADC12CTL0 |= ADC12SC;  // Start conversion
			g_chProcessAD_Stat = 1;
			g_chProcessAD_50ms = 0;
		break;
		case 1://
			if((ADC12IFG & 0xFF) == 0xFF)	//Wait result
			{
				g_chProcessAD_Stat = 2;
			}
			if(g_chProcessAD_50ms > 10)
			{
				g_chProcessAD_Stat = 2;
			}
		break;
		case 2://
			{
				//DC 过滤
				unsigned int m_intMem[5];
				unsigned int m_intAverageMem = 0,m_intAverMem = 0;
				unsigned char m_chCount = 0,m_chI;
				/////////////////////////////////////////////////////////////DC////////////////////
				m_intMem[0] = ADC12MEM2;
				m_intMem[1] = ADC12MEM5;
				m_intMem[2] = ADC12MEM8;
				m_intMem[3] = ADC12MEM11;
				m_intMem[4] = ADC12MEM14;
				for(m_chI = 0; m_chI < 5; m_chI++)
				{
					m_intAverageMem += m_intMem[m_chI];
				}
				m_intAverageMem /= 5;
				for(m_chI = 0; m_chI < 5; m_chI++)
				{//丢掉 尖值
					if(abs(m_intAverageMem - m_intMem[m_chI]) > ADSampleFirstSift)
					{//不要----使用 abs 使代码的 空间减少到 29158--》19120! 38 个 char
						//丢掉!
					}
					else
					{
						m_chCount++;
						m_intAverMem += m_intMem[m_chI];
					}
				}
				
				if(m_chCount >= 3)
				{//至少有三个有效的数值
					//还要二次过滤
					unsigned char chT;
					chT = (m_intAverMem / m_chCount) / 36.8;//本来 / 16 后来发现有 2。3 的偏差
					//----test 
				#ifdef Env_Debug
					chT = (intTBCount_50ms % 3200) / 40;
				#endif
					//保证 0---99!
					if(chT > 99)
					{
						chT = 99;	
					}
					if(g_chDC == chT)
					{
						g_chDCSift = 0;
					}
					else
					{//report
						g_chDCSift++;
						if(g_chDCSift > ADSiftMax)
						{
							unsigned char chM[] = "DC飘动 xxx\n\r";
							chM[7] = (chT) / 100 + 48;
							chM[8] = ((chT) / 10 ) % 10 + 48;
							chM[9] = (chT) % 10 + 48;
							ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
							g_chDCSift = 0;
							g_chDC = chT;
						}
					}
				}
				else
				{//丢掉----这次的采样太乱!
					ExternInsertDebugSendBuf("丢掉DC\n\r",8);
				}
				//处理报告
				if((g_chEnv_Free & EnvFree_DC))
				{//不报告! 
					//g_chMainLcdProcess_Stat++;
				}
				else
				{
					unsigned char chLow,chHign;
					chLow = (*(unsigned char *)(EnvDC_Info) - 48) * 100 + (*(unsigned char *)(EnvDC_Info + 1) - 48) * 10
																		 + (*(unsigned char *)(EnvDC_Info + 2) - 48);
					chHign = (*(unsigned char *)(EnvDC_Info + 3) - 48) * 100 + (*(unsigned char *)(EnvDC_Info + 4) - 48) * 10
																		 + (*(unsigned char *)(EnvDC_Info + 5) - 48);
					if((g_chDC >= chLow) && (g_chDC <= chHign))
					{//正常!
						if(g_chEnv_Status & EnvStat_DC)
						{//告警状态,
							//报告恢复
							g_chEnv_Restore |= EnvStat_DC;
							//恢复正常
							g_chEnv_Status &= ~EnvStat_DC;
							g_chDCRestore = g_chDC;
						}
						else
						{//
							//无事情,也不做过滤的清 0 
						}
					}
					else if(g_chDC < chLow)
						{//要告警!--低
							g_chEnv_LowHign &= ~EnvStat_DC;//只记录告警的状态!
							if(g_chEnv_Status & EnvStat_DC)
							{//告警状态
								//无动作
							}
							else
							{
								//报告告警
								g_chEnv_Alert |= EnvStat_DC;
								//告警状态
								g_chEnv_Status |= EnvStat_DC;
								g_chDCAlert = g_chDC;
							}
						}
						else if(g_chDC > chHign)
							{//hign
								g_chEnv_LowHign |= EnvStat_DC;
								if(g_chEnv_Status & EnvStat_DC)
								{//告警状态
									//无动作
								}
								else
								{
									//报告告警
									g_chEnv_Alert |= EnvStat_DC;
									//告警状态
									g_chEnv_Status |= EnvStat_DC;
									g_chDCAlert = g_chDC;
								}
							}																		 																		
				}
				/////////////////////////////////////////////////////////////DC////////////////////
				/////////////////////////////////////////////////////////////BadGas////////////////////
				//借用别人的变量,清先 = 0
				m_intAverageMem = 0;
				m_intAverMem = 0;
				m_chCount = 0;
				m_intMem[0] = ADC12MEM0;
				m_intMem[1] = ADC12MEM3;
				m_intMem[2] = ADC12MEM6;
				m_intMem[3] = ADC12MEM9;
				m_intMem[4] = ADC12MEM12;
				for(m_chI = 0; m_chI < 5; m_chI++)
				{
					m_intAverageMem += m_intMem[m_chI];
				}
				m_intAverageMem /= 5;
				for(m_chI = 0; m_chI < 5; m_chI++)
				{//丢掉 尖值
					if(abs(m_intAverageMem - m_intMem[m_chI]) > ADSampleFirstSift)
					{//不要----使用 abs 使代码的 空间减少到 29158--》19120! 38 个 char
						//丢掉!
					}
					else
					{
						m_chCount++;
						m_intAverMem += m_intMem[m_chI];
					}
				}
				if(m_chCount >= 3)
				{//至少有三个有效的数值
					//还要二次过滤
					unsigned char chT;
					chT = (m_intAverMem / m_chCount) / 40;//0--100
					//----test 
				#ifdef Env_Debug
					chT = (intTBCount_50ms % 3200) / 40;
				#endif
					// 对 4 mA 进行处理
					if(chT < 5)
					{//没有电压,表示没有接东西!
						chT = 200;
					}
					else if(chT < 20)
						{
							chT = 20;// 0 %
						}
					//转换为 %
					chT = (chT - 20) * 1.25;
					//if(abs(g_chBadGas - chT) >= 1)
					if(g_chBadGas == chT)
					{
						g_chBadGasSift = 0;
					}
					else
					{//report
						g_chBadGasSift++;
						if(g_chBadGasSift > ADSiftMax)
						{
							unsigned char chM[] = "BadGas飘动 xxx\n\r";
							chM[11] = (chT) / 100 + 48;
							chM[12] = ((chT) / 10 ) % 10 + 48;
							chM[13] = (chT) % 10 + 48;
							ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
							g_chBadGasSift = 0;
							g_chBadGas = chT;
						}
					}
				}
				else
				{//丢掉
					ExternInsertDebugSendBuf("丢掉BadGas\n\r",12);
				}
				//处理报告
				if((g_chEnv_Free & EnvFree_BadGas))
				{//不报告! 
					//g_chMainLcdProcess_Stat++;
				}
				else
				{
					if(g_chBadGas <= 25)
					{//正常!
						if(g_chEnv_Status & EnvStat_BadGas)
						{//告警状态,
							//报告恢复
							g_chEnv_Restore |= EnvStat_BadGas;
							//恢复正常
							g_chEnv_Status &= ~EnvStat_BadGas;
							g_chBadGasRestore = g_chBadGas;
						}
					}
					else if(g_chBadGas <= 50)
						{//要告警!--一级
							if(g_chEnv_Status & EnvStat_BadGas)
							{//告警状态
								if(g_chEnv_LowHign & g_chEnv_LowHign)
								{// hign
									g_chEnv_LowHign &= ~g_chEnv_LowHign;
									//要报告低级别
									//报告告警
									g_chEnv_Alert |= EnvStat_BadGas;
									//告警状态
									g_chEnv_Status |= EnvStat_BadGas;
									g_chBadGasAlert = g_chBadGas;
								}
							}
							else
							{
								//报告告警
								g_chEnv_Alert |= EnvStat_BadGas;
								//告警状态
								g_chEnv_Status |= EnvStat_BadGas;
								g_chBadGasAlert = g_chBadGas;
							}
						}
						else 
						{//hign
							if(g_chEnv_Status & EnvStat_BadGas)
							{//告警状态
								if(g_chEnv_LowHign & EnvStat_BadGas)
								{// hign
									//无动作
								}
								else
								{
									g_chEnv_LowHign |= g_chEnv_LowHign;
									//要报告高级别
									//报告告警
									g_chEnv_Alert |= EnvStat_BadGas;
									//告警状态
									g_chEnv_Status |= EnvStat_BadGas;
									g_chBadGasAlert = g_chBadGas;
								}
							}
							else
							{
								//报告告警
								g_chEnv_Alert |= EnvStat_BadGas;
								//告警状态
								g_chEnv_Status |= EnvStat_BadGas;
								g_chBadGasAlert = g_chBadGas;
							}
						}																		 																		
				}
				/////////////////////////////////////////////////////////////BadGas////////////////////
				g_chTheTwoAD = ADC12MEM15;//不使用 15
				g_chTheTwoAD = (ADC12MEM1 + ADC12MEM4 + ADC12MEM7 + ADC12MEM10 + ADC12MEM13) / 80;//0--255
				
			}
			g_chProcessAD_Stat = 0;
		break;
		default://
			g_chProcessAD_Stat = 0;
		break;
	}
}
/**************************************
*功能: 处理开关量 告警!  
*参数:  
*返回: 
*备注: 每 300 秒 调用一次
**************************************/						
void ProcessSwitch(void)
{
	//通道1
	if(P5IN & T1)
	{//无事情
		if(g_chEnv_Status & T1)//请 千万注意,这里 P5IN 与 g_chEnv_Status 
		{//告警
			//准备改变为恢复!
			g_chEnvChanOne++;
			if(g_chEnvChanOne > EnvSampleSift)
			{
				//报告恢复标志
				g_chEnv_Restore |= T1;
				//恢复
				g_chEnv_Status &= ~T1;
			}
		}
		else
		{//无事情
			g_chEnvChanOne = 0;
		}
	}
	else
	{//告警
		if(g_chEnv_Status & T1)//请 千万注意,这里 P5IN 与 g_chEnv_Status 
		{//告警
			g_chEnvChanOne = 0;
		}

⌨️ 快捷键说明

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