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

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐