NTC测温中 经典温度查表算法--二分查找法
2014-05-08 14:27
1226 查看
NTC测温中 经典温度查表算法--二分查找法
/*******************************************
说明:
二分查找法的优点:查找速度快 1024个长度的表最长只需10次查表就能得出结果
在用NTC测试温度的方案中,NTC的温度表的长度一般是100-200 有些达到400-500的长度
在这种情况下如果用逐个查表比较的方法来查温度 会导致查表的时间过长,影响程序的
执行效率 这里推出一个优秀的算法来取代这种最笨的做法
应用实例如下:
#define TempSize 100 //定义表长度
//温度值对应的AD值的表的定义
const int16 TabNtc_100K[TempSize]={0xf00,0xe00,oxd00,......};
int16 *pTmp ; //定义一个字长的指针
pTmp = TabNtc_100K ; //指向要温度表的地址
CuTemp = FineTab(pTmp,TempSize,R_NTCAD); //查表得出温度 R_NTCAD为NTC分压得出的AD值
********************************************/
//*************************************
// 函数名称:FineTab 二分查找算法 ->查温度表
// 函数功能:查找数据在表中对应的位置 表中数据从大到小
// 入口参数:表地址、表长度、要查找的数据
// 出口参数:无
// 返 回 值:数据在表中的位置
//*************************************
uint8 FineTab(uint16 *a,uint8 TabLong,uint16 data)//表中数据从大到小
{
uint8 st,ed,m ;
uint8 i ;
st = 0 ;
ed = TabLong-1 ;
i = 0 ;
if(data >= a[st]) return st ;
else if(data <= a[ed]) return ed ;
while(st < ed)
{
m = (st+ed)/2 ;
if(data == a[m] ) break ;
if(data < a[m] && data > a[m+1]) break ;
if(data > a[m]) ed = m ;
else st = m ;
if(i++ > TabLong) break ;
}
if(st > ed ) return 0 ;
return m ;
}
//*************************************
// 函数名称:FineTab 二分查找算法 ->查温度表
// 函数功能:查找数据在表中对应的位置 表中数据从小到大
// 入口参数:表地址、表长度、要查找的数据
// 出口参数:无
// 返 回 值:数据在表中的位置
//***************************************
uint8 FineTab(uint16 *a,uint8 TabLong,uint16 dat)//表中数据从小到大
{
uint8 st,ed,m ;
uint8 i ;
st = 0 ;
ed = TabLong-1 ;
i = 0 ;
if(dat >= a[ed]) return ed ;
else if(dat <= a[st]) return st ;
while(st < ed)
{
m = (st+ed)/2 ;
if(dat == a[m] ) break ;
if(dat < a[m+1] && dat > a[m]) break ;
if(dat > a[m]) st = m ; //ed = m ;
else ed = m ;//st = m ;
if(i++ > TabLong) break ;
}
if(st > ed ) return 0 ;
return m ;
}
/*******************************************
说明:
二分查找法的优点:查找速度快 1024个长度的表最长只需10次查表就能得出结果
在用NTC测试温度的方案中,NTC的温度表的长度一般是100-200 有些达到400-500的长度
在这种情况下如果用逐个查表比较的方法来查温度 会导致查表的时间过长,影响程序的
执行效率 这里推出一个优秀的算法来取代这种最笨的做法
应用实例如下:
#define TempSize 100 //定义表长度
//温度值对应的AD值的表的定义
const int16 TabNtc_100K[TempSize]={0xf00,0xe00,oxd00,......};
int16 *pTmp ; //定义一个字长的指针
pTmp = TabNtc_100K ; //指向要温度表的地址
CuTemp = FineTab(pTmp,TempSize,R_NTCAD); //查表得出温度 R_NTCAD为NTC分压得出的AD值
********************************************/
//*************************************
// 函数名称:FineTab 二分查找算法 ->查温度表
// 函数功能:查找数据在表中对应的位置 表中数据从大到小
// 入口参数:表地址、表长度、要查找的数据
// 出口参数:无
// 返 回 值:数据在表中的位置
//*************************************
uint8 FineTab(uint16 *a,uint8 TabLong,uint16 data)//表中数据从大到小
{
uint8 st,ed,m ;
uint8 i ;
st = 0 ;
ed = TabLong-1 ;
i = 0 ;
if(data >= a[st]) return st ;
else if(data <= a[ed]) return ed ;
while(st < ed)
{
m = (st+ed)/2 ;
if(data == a[m] ) break ;
if(data < a[m] && data > a[m+1]) break ;
if(data > a[m]) ed = m ;
else st = m ;
if(i++ > TabLong) break ;
}
if(st > ed ) return 0 ;
return m ;
}
//*************************************
// 函数名称:FineTab 二分查找算法 ->查温度表
// 函数功能:查找数据在表中对应的位置 表中数据从小到大
// 入口参数:表地址、表长度、要查找的数据
// 出口参数:无
// 返 回 值:数据在表中的位置
//***************************************
uint8 FineTab(uint16 *a,uint8 TabLong,uint16 dat)//表中数据从小到大
{
uint8 st,ed,m ;
uint8 i ;
st = 0 ;
ed = TabLong-1 ;
i = 0 ;
if(dat >= a[ed]) return ed ;
else if(dat <= a[st]) return st ;
while(st < ed)
{
m = (st+ed)/2 ;
if(dat == a[m] ) break ;
if(dat < a[m+1] && dat > a[m]) break ;
if(dat > a[m]) st = m ; //ed = m ;
else ed = m ;//st = m ;
if(i++ > TabLong) break ;
}
if(st > ed ) return 0 ;
return m ;
}
相关文章推荐
- llinux 执行级别
- 13年很多客户推广淘宝淘宝客站推广技巧视频教程COM “TARGET = ” _bla
- MyEclipse10修改User default location
- Nagios Ganglia网络监控
- 引用NPOI动态创建EXCEL表
- OpenSSL
- 火狐浏览器下new Date返回NaN的问题处理,以及日期yyyy-MM-dd格式化功能
- 黑客马拉松
- 高清视频文件丢了怎么恢复丨电脑下载好的缓存数据
- Mysql高级集群-读写分离Amoeba
- 代码编写布局
- [IOS] URLWithString拼接NSURL时,url=nil的问题
- 我自己常用的eclipse 快捷键整理
- Chart FX Gauges for Java仪表计量器控件下载及详细介绍
- 高速缓冲存储器--地址映射
- jQuery选择器大全
- jQuery 学习之路(1):引子
- 这可能是最快最简单的赚钱方法了!
- ubuntu.sh: 118: ubuntu.sh: Syntax error: "(" unexpected
- DNSAMD撒旦撒