📄 env.c
字号:
#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 + -