新闻| 论坛| 博客| 在线研讨会
NTC测温中 经典温度查表算法--二分查找法
电子禅石| 2021-08-02 11:39:53 阅读:8838 发布文章

  1. 说明:

  2. 二分查找法的优点:查找速度快 1024个长度的表最长只需10次查表就能得出结果

  3. 在用NTC测试温度的方案中,NTC的温度表的长度一般是100-200 有些达到400-500的长度

  4. 在这种情况下如果用逐个查表比较的方法来查温度 会导致查表的时间过长,影响程序的

  5. 执行效率 这里推出一个优秀的算法来取代这种最笨的做法

  6. 应用实例如下:

  7. #define TempSize 100 //定义表长度

  8. //温度值对应的AD值的表的定义

  9. const int16 TabNtc_100K[TempSize]={0xf00,0xe00,oxd00,......};

  10. int16 *pTmp ; //定义一个字长的指针

  11. pTmp = TabNtc_100K ; //指向要温度表的地址

  12. CuTemp = FineTab(pTmp,TempSize,R_NTCAD); //查表得出温度 R_NTCAD为NTC分压得出的AD值

  13. ********************************************/

    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. st = 0 ;

    13. ed = TabLong-1 ;

    14. i = 0 ;

    15. if(data >= a[st])returnst ;

    16. elseif(data <= a[ed])returned ;

    17. while(st < ed)

    18. {

    19. m = (st+ed)/2 ;

    20. if(data == a[m] )break;

    21. if(data < a[m] && data > a[m+1])break;

    22. if(data > a[m]) ed = m ;

    23. elsest = m ;

    24. if(i++ > TabLong)break;

    25. }

    26. if(st > ed )return0 ;

    27. returnm ;

    28. }

    29. //*************************************

    30. // 函数名称:FineTab 二分查找算法 ->查温度表

    31. // 函数功能:查找数据在表中对应的位置 表中数据从小到大

    32. // 入口参数:表地址、表长度、要查找的数据

    33. // 出口参数:无

    34. // 返 回 值:数据在表中的位置

    35. //***************************************

    36. uint8 FineTab(uint16 *a,uint8 TabLong,uint16 dat)//表中数据从小到大

    37. {

    38. uint8 st,ed,m ;

    39. uint8 i ;

    40. st = 0 ;

    41. ed = TabLong-1 ;

    42. i = 0 ;

    43. if(dat >= a[ed])returned ;

    44. elseif(dat <= a[st])returnst ;

    45. while(st < ed)

    46. {

    47. m = (st+ed)/2 ;

    48. if(dat == a[m] )break;

    49. if(dat < a[m+1] && dat > a[m])break;

    50. if(dat > a[m]) st = m ;//ed = m ;

    51. elseed = m ;//st = m ;

    52. if(i++ > TabLong)break;

    53. }

    54. if(st > ed )return0 ;

    55. returnm ;

    56. }


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
属于自己的技术积累分享,成为嵌入式系统研发高手。
最近文章
签名类型
2024-04-29 16:28:59
cat 文件名
2024-04-29 15:05:34
推荐文章
最近访客