NTC测温中 经典温度查表算法--二分查找法

NTC测温中 经典温度查表算法--二分查找法

  1. /******************************************* 
  2.  
  3. 说明: 
  4.  
  5. 二分查找法的优点:查找速度快 1024个长度的表最长只需10次查表就能得出结果 
  6. 在用NTC测试温度的方案中,NTC的温度表的长度一般是100-200 有些达到400-500的长度 
  7. 在这种情况下如果用逐个查表比较的方法来查温度 会导致查表的时间过长,影响程序的 
  8. 执行效率 这里推出一个优秀的算法来取代这种最笨的做法 
  9.  
  10. 应用实例如下: 
  11.  
  12. #define TempSize  100 //定义表长度 
  13. //温度值对应的AD值的表的定义 
  14. const int16 TabNtc_100K[TempSize]={0xf00,0xe00,oxd00,......}; 
  15.  
  16. int16 *pTmp ; //定义一个字长的指针 
  17.      
  18. pTmp = TabNtc_100K ; //指向要温度表的地址 
  19. CuTemp = FineTab(pTmp,TempSize,R_NTCAD); //查表得出温度 R_NTCAD为NTC分压得出的AD值 
  20.  
  21.  
  22. ********************************************/
    1. //*************************************  
    2. // 函数名称:FineTab  二分查找算法 ->查温度表  
    3. // 函数功能:查找数据在表中对应的位置 表中数据从大到小  
    4. // 入口参数:表地址、表长度、要查找的数据  
    5. // 出口参数:无  
    6. // 返 回 值:数据在表中的位置  
    7. //*************************************  
    8. uint8 FineTab(uint16 *a,uint8 TabLong,uint16 data)//表中数据从大到小  
    9. {  
    10.     uint8 st,ed,m ;  
    11.     uint8 i ;  
    12.   
    13.     st = 0 ;  
    14.     ed = TabLong-1 ;  
    15.     i = 0  ;  
    16.   
    17.     if(data >= a[st]) return st ;  
    18.     else if(data <= a[ed]) return ed ;  
    19.   
    20.     while(st < ed)  
    21.     {  
    22.         m = (st+ed)/2 ;  
    23.   
    24.         if(data == a[m] ) break ;  
    25.         if(data < a[m] && data > a[m+1]) break ;  
    26.           
    27.           
    28.         if(data > a[m])  ed = m ;                      
    29.         else st = m ;     
    30.           
    31.         if(i++ > TabLong) break ;  
    32.     }  
    33.   
    34.     if(st > ed ) return 0 ;   
    35.   
    36.     return m ;  
    37. }  
    38.   
    39.   
    40. //*************************************  
    41. // 函数名称:FineTab  二分查找算法 ->查温度表  
    42. // 函数功能:查找数据在表中对应的位置    表中数据从小到大  
    43. // 入口参数:表地址、表长度、要查找的数据  
    44. // 出口参数:无  
    45. // 返 回 值:数据在表中的位置  
    46. //***************************************  
    47.   
    48. uint8 FineTab(uint16 *a,uint8 TabLong,uint16 dat)//表中数据从小到大  
    49. {  
    50.         uint8 st,ed,m ;  
    51.         uint8 i ;  
    52.       
    53.         st = 0 ;  
    54.         ed = TabLong-1 ;  
    55.         i = 0  ;  
    56.       
    57.         if(dat >= a[ed]) return ed ;  
    58.         else if(dat <= a[st]) return st ;  
    59.       
    60.         while(st < ed)  
    61.         {  
    62.             m = (st+ed)/2 ;  
    63.       
    64.             if(dat == a[m] ) break ;  
    65.             if(dat < a[m+1] && dat > a[m]) break ;  
    66.               
    67.               
    68.             if(dat > a[m]) st = m ;  //ed = m ;                    
    69.             else ed = m ;//st = m ;   
    70.               
    71.             if(i++ > TabLong) break ;  
    72.         }  
    73.       
    74.         if(st > ed ) return 0 ;   
    75.       
    76.         return m ;  
    77.   
    78. }  


  • 12
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值