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

📄 env.c

📁 16为单片机实现调制解调器功能
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -