01. /*******************************************
02.
03. 说明:
04.
05. ⼆分查法的优点:查速度快 1024个长度的表最长只需10次查表就能得出结果
06. 在⽤NTC测试温度的⽅案中,NTC的温度表的长度⼀般是100-200 有些达到400-500的长度
07. 在这种情况下如果⽤逐个查表⽐较的⽅法来查温度会导致查表的时间过长,影响程序的
08. 执⾏效率这⾥推出⼀个优秀的算法来取代这种最笨的做法
09.
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. ********************************************/
23.
01. //*************************************
02. // 函数名称:FineTab ⼆分查算法 ->查温度表
03. // 函数功能:查数据在表中对应的位置表中数据从⼤到⼩ 04. // ⼊⼝参数:表地址、表长度、要查的数据
05. // 出⼝参数:⽆
06. // 返回值:数据在表中的位置
07. //*************************************
08. uint8 FineTab(uint16 *a,uint8 TabLong,uint16 data)//表中数据从⼤到⼩
09. {
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. }