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

来源:互联网 发布:网络控制器 编辑:程序博客网 时间:2024/05/23 14:21

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. }  


0 0