📄 search.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 + -