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

📄 search.c

📁 带时钟功能温度和湿度测量的仪器
💻 C
字号:
/*############################################################
文件名称: Search.c
功能    : 查表确定特定频率代表的温度或者湿度.分别保留一位小数
创建人  : Houseivan
创建日期: 2005-03-17
修改人  : Houseivan
修改日期: 2005-03-17
############################################################*/

#include"Includes.h"
#include<stdlib.h>

/*检测是否配置了传感器监控功能*/
#if _DETECT_TASK > 0

/*------------------------------------------------*/
/*Variants define*/
/*############################################################
VarName:TempFoscGroup[]
Popurse:存放温度频率计数据
Used By:查找算法函数调用
Other  :
	温度频率表:-20.0 ~ 80.0 ℃
	将震荡频率调节在10KHZ左右
	增长型  Temperature:2B如:-16。5℃
############################################################*/
extern	uint code TempFoscGroup[];
/*############################################################
VarName:HumiFoscGroup
Popurse:存放湿度频率计数据
Used By:查找算法函数调用
Other  :
	湿度频率表:RH:0 ~ 100 %
	将震荡频率调节在10KHZ左右
	衰减型  Humidity:2B    如:RH56.9%
############################################################*/

extern	uint code HumiFoscGroup[];

/*Function define*/
/*############################################################
FuncName:	uint LocateRefValue(uint RefValue,uint Values[],uchar Size);
Discription:查找RefValue对应的地址
Input:		要查找的数据、目的数组首地址、数组大小
Return:		返回相应的地址整数和小数部分
Notice:		整数部分和符号位处于uint的高字节
       		小数部分则位于uint的低字节
       		只要定位到一个最小区间即可xi->[x1,x2]
############################################################*/
uint LocateRefValue(uint RefValue,uint Values[],uchar Size)
{
 	uchar Integer,Decimal;				//整数部分由整点值确定、小数部分有偏移量确定
 	uchar Head,Tail,Mid;				//Head(小),Tail(大)作为指针
	uint Temp;
 	if(Values[0]<Values[Size-1])		//检测当前数据序列的单调性
 	{
 	/*表明这个序列是递增的序列:温度*/
		Head=0;
 		Tail=Size-1;
		if(RefValue<=Values[Head])
			return _MIN_NUM;
		if(RefValue>=Values[Tail])
			return _MAX_NUM;
	}
	else
	{
	/*表明这是一个递减的数字序列:湿度*/
 		Head=Size-1;
		Tail=0;
		if(RefValue<=Values[Head])
			return _MAX_NUM;
		if(RefValue>=Values[Tail])
			return _MIN_NUM;
	}
	
 	while(1)				
	{
		Mid=(Head+Tail)/2;				//Mid>=Head
		if(RefValue>=Values[Mid])		//说明落在(Mid,Tail)中
			Head=Mid;
		else							//说明落在(Head,Mid)中
			Tail=Mid;
		if(abs(Tail-Head)<=1)			//当首尾间隔为1或0时说明已经到了一个最小区间
			break;						//结束查找操作
	}
	if(Values[0]<Values[Size-1])		//检测当前数据序列的单调性
 	{
 	/*表明这个序列是递增的序列:温度*/
		Integer=Head;		   			//取出区间下限作为整数部分
	}
	else	
	{
		 Integer=Tail;		   			//取出区间下限作为整数部分
	}				
	Decimal=Values[Tail]-Values[Head];	//确定区间宽度SpWidth
 	Temp=(RefValue-Values[Head])
			*_DECIMAL_BIT;				//确定当前值对下限的偏移量Offset,10表示精确到小数点后一位
	Decimal=Temp/Decimal;				//确定小数点后第一位	
	Temp=Integer*10+Decimal;			//将温度湿度全部用0.1的倍数来表示	

 	return Temp;
}

/*---------------------------------------------------------*/
#endif

⌨️ 快捷键说明

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