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

📄 sensorservice.c

📁 带时钟功能温度和湿度测量的仪器
💻 C
字号:
/*#######################################################################################
文件名:  SensorService.c
功能:    传感器服务函数实现
单位:    浙江工商大学-信电学院
创建日期:2004-09-24
创建人:  Houseivan
修改人:  Houseivan
修改日期:2005-03-11
#######################################################################################*/
#include"Includes.h"

/*检测是否配置了传感器监控功能*/
#if _DETECT_TASK>0
/*------------------------------------------------*/
/*符号位包含在整数部分的最高位1:负数=======0:正数*/
	extern uchar data TempInteger;		//温度值整数和符号字节
	extern uchar data TempDecimal;		//温度值小数位字节
	extern uchar data HumiInteger;		//湿度值整数和符号字节
	extern uchar data HumiDecimal;		//湿度值小数位字节
	extern uint  data HumiCounter;		//湿度计数器<65.536KHZ
	extern uint  data TempCounter;		//温度计数器<65.536KHZ
	extern uint  code TempFoscGroup[];	//温度数据集合
	extern uint  code HumiFoscGroup[];	//湿度数据集合

#if _SYS_INTERRUPT>0
	extern uchar data MeasureTimer;		//测量用定时器1s=50x20ms
	extern uchar data SampleTimer;		//系统数据刷新定时器1min=60x1s
	extern uchar data StoreTimer;		//存储采样定时器1Hour=60x1min
#endif

#if	_LCM_TASK>0
	extern uchar code position[];

	extern uchar data UartRecBuf[_MAX_LENG];
	extern uchar data LcmMode;			//显示模式选择
#endif

	extern bit	WorkMode;				//根据登陆成功与否确定站点工作的模式
/*------------------------------------------------*/
//#######################################################################################//
//#Function:		MeasureCAE555()
//#Description:	系统传感器数据测量任务
//#Input:		无
//#Output:		无
//#Return:		无 测量结果存放在两个16位计数器中 HumiCounter TempCounter
//#Others:		文件级公共函数
//#######################################################################################//

void	MeasureCAE555(void)				//应该认真考虑各指令的先后顺序来降低误差
{	
	CloseScom();						//关闭通讯口ES=0;降低测量误差

	CloseHumiCounter();					//关闭湿度计数器 EX0=0
	CloseTempCounter();					//关闭温度计数器 TR0=0
	CloseTimer1();						//关闭定时器1 TR1=0;

	HumiCounter=0;						//初始化测量容器
	TempCounter=0;
	TH0=TL0=0;
	MeasureTimer=0;						//清空测量计数器

	OpenHumiCounter();					//打开湿度计数器 EX0=1
	OpenTempCounter();					//打开温度计数器 TR0=1
	OpenTimer1();						//启动定时器1 TR1=1;开始测量


	while(MeasureTimer<_MEASURE_ALARM);	//等待时间到
	CloseHumiCounter();					//关闭湿度计数器 EX0=0
	CloseTempCounter();					//关闭温度计数器 TR0=0

	TempCounter=TH0;					//读取温度传感器数据
	TempCounter<<=8;
	TempCounter|=TL0;
	//HumiCounter=HumiCounter;			//读取湿度传感器数据
	/*此处可以添加测试输出代码*/
	#if(_SYS_TEST>0)
		#if	_LCM_TASK>0		
			OutputFrequency(TempCounter);
			OutputFrequency(HumiCounter);
		#endif
	#endif

	OpenScom();							//恢复通讯ES=1;
}

//#######################################################################################//
//#Function:		SensorTaskRun()
//#Description:	系统传感器数据计算出真实的参数值Temperatrue:xx.0℃;Humidity:xx.0%RH
//#Input:		无
//#Output:		无
//#Return:		无 计算结果存放在两个8位容器中 xxInteger xxDecimal用作显示上传用;
//#Others:		文件级公共函数
//#######################################################################################//

void	SensorTaskRun(void)
{		
	#if	(_REAL_TIME_TEST<1)
		if(SampleTimer>=_SAMPLE_ALARM)
	#endif
		{
			MeasureCAE555();
			/*将查表结果暂时存放到计数器中 不带符号位单位:0.1度*/
			TempCounter=LocateRefValue(TempCounter,TempFoscGroup,_BLOCK_LENG);
			//TempCounter=LocateRefValue(0,TempFoscGroup,_BLOCK_LENG);
			HumiCounter=LocateRefValue(HumiCounter,HumiFoscGroup,_BLOCK_LENG);
			/*此处可以添加测试输出代码*/
		/*	#if(_SYS_TEST>0)								//此时显示的是查表后的结果
				#if	_LCM_TASK>0
					OutputFrequency(TempCounter);
					OutputFrequency(HumiCounter);
				#endif
			#endif
		*/
			/*处理湿度 因其偏差为0所以直接表示为正数*/
			HumiCounter&=_PLUS_BIT;							//确定为正数
			/*将实际测量值转移到温湿度单元+*/
			//HumiInteger=0x7f&(HumiCounter/_DECIMAL_BIT);
			HumiInteger=HumiCounter/_DECIMAL_BIT;	
    		HumiDecimal=HumiCounter%_DECIMAL_BIT;
			/*处理温度 因其偏差为200所以根据处理结果确定正负*/
		if(TempCounter>=_FLOOR_LIMIT)		    			//Plus+
		{
			TempCounter=TempCounter-_FLOOR_LIMIT;
			/*将实际测量值转移到温湿度单元*/
			//TempInteger=0x7f&(TempCounter/_DECIMAL_BIT);
			TempInteger=TempCounter/_DECIMAL_BIT;		
    		TempDecimal=TempCounter%_DECIMAL_BIT;			//x/_DECIMAL_BIT为小数
			//TempCounter&=_PLUS_BIT;
		}									         
		else									  			//Minus-
		{
			TempCounter=_FLOOR_LIMIT-TempCounter;
			/*将实际测量值转移到温湿度单元*/
			TempInteger=(uchar)(TempCounter/_DECIMAL_BIT);	
			TempInteger|=0x80;
    		TempDecimal=(uchar)(TempCounter%_DECIMAL_BIT);			//x/10为小数
			//TempCounter|=_MINUS_BIT;
		}
		/*此处可以添加测试输出代码*/
		#if(_SYS_TEST>0)
			#if	_LCM_TASK>0
				LCM_Clear();
				OutputTHValue(TempInteger,TempDecimal,6);
				OutputTHValue(HumiInteger,HumiDecimal,0);
				OutputChar(position[4],22,0);  				//off
    			OutputChar(position[5],22,0);  				//[ 16:字型编号
				DelayTime(2,_LCM_KEEP_T);
 				LCM_Clear();
			#endif
		#endif 
		}			
}
#endif

⌨️ 快捷键说明

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