📄 env.c
字号:
else
{//无事情
//准备改变为告警!
g_chEnvChanOne++;
if(g_chEnvChanOne > EnvSampleSift)
{
//报告告警标志
g_chEnv_Alert |= T2;
//告警
g_chEnv_Status |= T1;
}
}
}
//通道2
if(P5IN & T2)
{//无事情
if(g_chEnv_Status & T2)//请 千万注意,这里 P5IN 与 g_chEnv_Status
{//告警
//准备改变为恢复!
g_chEnvChanTwo++;
if(g_chEnvChanTwo > EnvSampleSift)
{
//报告恢复标志
g_chEnv_Restore |= T2;
//恢复
g_chEnv_Status &= ~T2;
}
}
else
{//无事情
g_chEnvChanTwo = 0;
}
}
else
{//告警
if(g_chEnv_Status & T2)//请 千万注意,这里 P5IN 与 g_chEnv_Status
{//告警
g_chEnvChanTwo = 0;
}
else
{//无事情
//准备改变为告警!
g_chEnvChanTwo++;
if(g_chEnvChanTwo > EnvSampleSift)
{
//报告告警标志
g_chEnv_Alert |= T2;
//告警
g_chEnv_Status |= T2;
}
}
}
}
/**************************************
*功能: 读温度
*参数:
*返回:
*备注: 每秒 调用一次
**************************************/
void ProcessTemperatures(void)
{
//读温度---作前后两次相同的过滤处理---no
unsigned char m_chTemperature;
m_chTemperature = DS1820_Read_Temperature_Board(DqPort,DqDataBit);
if(m_chTemperature != g_chTemperature)
{// 三次后改变!
g_chTemperatureSift++;
if(g_chTemperatureSift > 3)
{
g_chTemperatureSift = 0;
g_chTemperature = m_chTemperature;
}
}
else
{
g_chTemperatureSift = 0;
}
if(g_chTemperature < 60)
{
g_chTemperature = 60;//肯定 没有 负温度!
}
g_chTemperatureBoard = DS1820_Read_Temperature_Board(DqBorad,DqBoradBit);
if(g_chTemperatureBoard < 60)
{
g_chTemperatureBoard = 60;//肯定 没有 负温度!
}
//处理报告
if((g_chEnv_Free & EnvStat_Temperature))
{
//空闲了
}
else
//状态处理报告!
{
unsigned char chLow,chHign;
if(*(unsigned char *)(EnvTemp_Info) == '1')
{//负温度
chLow = 60;
}
else
{
chLow = (*(unsigned char *)(EnvTemp_Info + 1) - 48) * 100 + (*(unsigned char *)(EnvTemp_Info + 2) - 48) * 10
+ (*(unsigned char *)(EnvTemp_Info + 3) - 48) + 60;
}
if(*(unsigned char *)(EnvTemp_Info + 5) == '1')
{//负温度
chHign = 60;
}
else
{
chHign = (*(unsigned char *)(EnvTemp_Info + 6) - 48) * 100 + (*(unsigned char *)(EnvTemp_Info + 7) - 48) * 10
+ (*(unsigned char *)(EnvTemp_Info + 8) - 48) + 60;
}
//----test
#ifdef Env_Debug
g_chTemperature = (intTBCount_50ms % 3200) / 40 + 60;
#endif
if((g_chTemperature <= chHign) && (g_chTemperature >= chLow))
{//温度正常
if(g_chEnv_Status & EnvStat_Temperature)
{//告警状态,
//报告恢复
g_chEnv_Restore |= EnvStat_Temperature;
//恢复正常
g_chEnv_Status &= ~EnvStat_Temperature;
g_chTemperatureRestore = g_chTemperature;
}
}
else if(g_chTemperature < chLow)
{//要告警!--低
g_chEnv_LowHign &= ~EnvStat_Temperature;
if(g_chEnv_Status & EnvStat_Temperature)
{//告警状态
//无动作
}
else
{
//报告告警
g_chEnv_Alert |= EnvStat_Temperature;
//告警状态
g_chEnv_Status |= EnvStat_Temperature;
g_chTemperatureAlert = g_chTemperature;
}
}
else if(g_chTemperature > chHign)
{//hign
g_chEnv_LowHign |= EnvStat_Temperature;
if(g_chEnv_Status & EnvStat_Temperature)
{//告警状态
//无动作
}
else
{
//报告告警
g_chEnv_Alert |= EnvStat_Temperature;
//告警状态
g_chEnv_Status |= EnvStat_Temperature;
g_chTemperatureAlert = g_chTemperature;
}
}
}
//作是否告警/恢复的处理---no
//写标志及转换温度--DqBorad
DS1820_Write_Reg_MultiChannel(DqPort,DqDataBit);
DS1820_StartConvert_MultiChannel(DqPort,DqDataBit);
DS1820_Write_Reg_MultiChannel(DqBorad,DqBoradBit);
DS1820_StartConvert_MultiChannel(DqBorad,DqBoradBit);
}
/**************************************
*功能: 有条件地读 电子纽扣
*参数:
*返回:
*备注: 实时运行
**************************************/
void ReadDoorID(void)
{
unsigned char chD;
if(g_chDoorStat + g_chDoorStatTemp > 0)
{//不在关门状态,不读电子纽扣!
return;
}
//读 电子纽扣的条件:1.启用 2.门关 3.门池也关
//以上都不用判断 电子纽扣 的存在
DS1820_Reset_MultiChannel(DoorChannelPort, DoorChannelDataBit);
DS1820_Write_Byte_MultiChannel(DoorChannelPort, DoorChannelDataBit, 0x33);//假定只有一个从机--读 8 位 ID 号
chD = DS1820_Read_Byte_MultiChannel(DoorChannelPort, DoorChannelDataBit);
if(chD == 2)//有电子纽扣
{
unsigned char i;
unsigned char chData[8],chIDData[8];
//先不判断
DS1820_Reset_MultiChannel(DoorChannelPort,DoorChannelDataBit);
//写命令
DS1820_Write_Byte_MultiChannel(DoorChannelPort, DoorChannelDataBit, 0xCC);//skip rom 针对所有通道!
DS1820_Write_Byte_MultiChannel(DoorChannelPort, DoorChannelDataBit, 0x66);//Read Subkey
DS1820_Write_Byte_MultiChannel(DoorChannelPort, DoorChannelDataBit, 0x10);//Read first Subkey address
DS1820_Write_Byte_MultiChannel(DoorChannelPort, DoorChannelDataBit, 0xEF);//Read first Subkey address 的补码
//读8 Byte subkey
for (i = 0; i < 8; i++)
{
chIDData[i] = DS1820_Read_Byte_MultiChannel(DoorChannelPort, DoorChannelDataBit);
}
//写 8 Byte passwore
for (i = 0; i < 8; i++)
{
DS1820_Write_Byte_MultiChannel(DoorChannelPort, DoorChannelDataBit, *(unsigned char *)(Door_Password_Info + i));//
}
//读8 Byte message
for (i = 0; i < 8; i++)
{
chData[i] = DS1820_Read_Byte_MultiChannel(DoorChannelPort, DoorChannelDataBit);
}
//判断正。。。2003-3-19 判断后四位
for (i = 4; i < 8; i++)
{//要求 KEY ID = 信息
if(chData[i] != chIDData[i])
{
return;//停止!结束
}
}
//判断 前 4 BYTE
for (i = 0; i < 4; i++)
{//要求 前四位 = 密码后四位
if(chData[i] != *(unsigned char *)(Door_Password_Info + i + 4))
{
return;//停止!结束
}
}
//去掉 0000 0000 用户为非法用户
for (i = 0; i < 4; i++)
{
if(chData[i + 4] != '0')
{
break;//停止!
}
}
if(i >= 4)//肯定有 4 个'0' 不能开门
{//0000 用户为非法用户
return;//返 回!结束
}
//检查号是否正切!
for (i = 0; i < 128; i++)
{//在 0---127 的范围里找!
unsigned char j;
for (j = 0; j < 4; j++)
{// 0--4
if(chData[j + 4] != *(unsigned char *)(FLASHMEM_Seg_DoorAddr + i * 4 + j))
{
break;
}
}
if(j == 4)
{
break;//成功
}
if(i >= 127)
{
return;//没有招到 结束
}
}
//可以开门! chDoorOpener
//for (j = 0; j < 3; j++)
//记录 开门人的索引号
{
i++;//为协议规定
g_chOpenDoorID[0] = (i / 100) + 48;
g_chOpenDoorID[1] = ((i / 10) % 10) + 48;
g_chOpenDoorID[2] = (i % 10) + 48;
}
g_intMarkA |= OprOpening_MarkA;
g_chDoorStatTemp = 11;//01--密码开门
{
unsigned char chM[] = "用户号:xxxx 序号:xxx要开门\n\r";
chM[7] = chData[0];
chM[8] = chData[1];
chM[9] = chData[2];
chM[10] = chData[3];
chM[17] = g_chOpenDoorID[0];
chM[18] = g_chOpenDoorID[1];
chM[19] = g_chOpenDoorID[2];
ExternInsertDebugSendBuf((unsigned char *)chM,sizeof(chM) - 1);
}
}
}
/**************************************
*功能: 门的控制
*参数:
*返回:
*备注: 实时运行
**************************************/
void MainDoor(void)
{//温度会判断是否有安装,门禁一样要有!-开门--或者禁用
//T2--门池 T3--禁用开关 Jout1--控制开门!
//#define T2 BIT6 //P5.6 1--关门 0--开门
//#define T3 BIT5 //P5.5 1-- 启用 0--不用
//#define Mjout1 BIT0 //P2.0, 1: 继电器跳变 0: 不动
//判断 是否要禁用!
//DELAY 延迟 一下
if(g_chDoorSwitch_50ms > 10)
{
g_chDoorSwitch_50ms = 20;
}
else
{
return;
}
if(P5IN & DoorDisable)// 禁用开关
{//启用----被 VCC上拉
//无条件去判断是否要开门---
if(g_intMarkA & OprOpening_MarkA)//在中心要求开门,及电子纽扣开门后
{
P5DIR |= Mjout1;//输出
P5OUT |= Mjout1;//1: 继电器跳变
//保持为开的时间 不能超过 30 秒
if(g_chDoorOpened_1s > Door_Opened_1s_Max)
{
g_intMarkA &= ~OprOpening_MarkA;//关闭
//g_intMarkA |= OprWaitOpen_MarkA;//门已经关了,现在要等待开门!
g_chDoorOpened_1s = 0;
//g_chDoorStat = 0;// 关门
}
}
else
{
g_chDoorOpened_1s = 0;
P5DIR &= ~Mjout1;//高阻!
}
//关门处理----判断 门池 关闭 5 秒,以后可以扩充 加快过程!
if(P5IN & DoorStat)
{//开门状态
if(g_intMarkA & OprWaitOpen_MarkA)//=1 等待开门
{
if(g_chDoorClosed_50ms > Door_Stability_50ms)
{
g_chDoorClosed_50ms = 101;
g_intMarkA &= ~OprOpening_MarkA;//关闭
//由 禁用 到 启用,但门是开的!
if(g_chDoorStat == 4 || g_chDoorStatTemp == 13)//禁用开门
{
g_chDoorStat = 6;//门开
g_chDoorStatTemp = 0;
//报告!
}
//由关门 到 门开
if(g_chDoorStatTemp == 0)
{
g_chDoorStat = 2;//非法门开
g_chDoorStatTemp = 0;
//报告!
}
//由正切密码 到 门开
if(g_chDoorStatTemp == 11)
{
g_chDoorStat = 1;//密码开门
g_chDoorStatTemp = 0;
//报告!
}
//由中心命令 到 门开
if(g_chDoorStatTemp == 12)
{
g_chDoorStat = 3;//中心开门
g_chDoorStatTemp = 0;
//报告!
}
g_intMarkA &= ~OprWaitOpen_MarkA;//门已经开了,现在要等待关门!
}
}
else//=0 等待关门
{
//03=中心开门 01--密码开门
g_chDoorClosed_50ms = 0;
}
}
else
{//关门状态
if(g_intMarkA & OprWaitOpen_MarkA)
{//=1 等待开门
g_chDoorClosed_50ms = 0;
}
else
{//=0 等待关门
if(g_chDoorClosed_50ms > Door_Stability_50ms)
{
g_chDoorClosed_50ms = 101;
g_intMarkA &= ~OprOpening_MarkA;//关门
g_chDoorStat = 0;// 关门
g_chDoorStatTemp = 0;
g_intMarkA |= OprWaitOpen_MarkA;//门已经关了,现在要等待开门!
//报告!
}
}
}
//回到原来的地方!
if(g_chDoorStat == 4)
{
g_chDoorStatTemp = 13;//禁用开门
g_chDoorSwitch_50ms = 0;
//报告!
g_intMarkA |= OprOpening_MarkA;//要开状态
g_intMarkA |= OprWaitOpen_MarkA;//门已经关了,现在要等待开门!
}
}
else
{// 禁用 //无条件保持 门开!,并且不用判断门的状态! // 禁用
P5DIR |= Mjout1;//输出
P5OUT |= Mjout1;//1: 继电器跳变
// 保证
g_chDoorClosed_50ms = 0;
if(g_chDoorStat != 4)
{
g_chDoorStat = 4;// 禁用门禁
//EnvPC_InsertSendStr("禁用门禁\n\r", 10);
g_chDoorSwitch_50ms = 0;//用于状态改变后,停留 500 ms 再 检查下一个状态的改变
//报告!
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -