实用的温度查询算法,超好用

实用的温度查询算法

本来是想着至少一周写一遍博客,但是忙着没时间写,其实时间都是花在没有什么意义的事情上面了,感觉做的事情对自己帮助不大,而正真自己想做的有意义的事却搁置了,真是得不偿失。比如一周一遍博客,我感觉就是有意义的事,既是对自己的一个总结,也能让自己反思一些问题,让自己持续的更新。

废话说得太多不好,在一些项目中,往往要用到NTC来检测温度,比如要显示或者获取当前温度之类的,此时就得查表来得到温度,现下面这种算法,如果8位AD的温度,只需要查询8次,12位的AD循环查询12次即可得到当前温度,超好用的。

C语言版本:

C_TEMP_MAX 表示最大的温度,不能超过最大的温度范围
  			Count=0x80;  //从最高位开始判断
    		TempBit=0;//预先给0值,这个值会逐渐逼近真正的温度。
    		do
    		{
     
    			if((Count>C_TEMP_MAX)||((Count|TempBit)>C_TEMP_MAX))  //如果Count>C_TEMP_MAX或者(Count|TempBit)>C_TEMP_MAX,则需要把TempBit的对应COUNT的1位清0
    			{
     
    				TempBit=(~Count)&TempBit;
    			}
    			else   //否则对[Count|TempBit]进行查表,默认表格温度和AD值的关系是成正比关系,如果查表出来当前的AD值要大于查表数据,则TempBit=Count|TempBit,否则TempBit=(~Count)&TempBit。
    			{
     
    				if(AdResult>=TempTab[Count|TempBit])    
    				{
     
    					TempBit=Count|TempBit;
    				}
    				else
    				{
     
    					TempBit=(~Count)&TempBit;
    				}
    			}
    			Count=Count>>1; //Count左移动一位继续判断查表
    		}while(0!=Count); //直到Count==0退出循环,一共8次。 如果是12位AD数据等,也可以用该种方式。

最后得到的TempBit就是当前的温度值。

CMS汇编版本:

SEARCH_TEMP:
	LDIA	080H
	LD		TEMP,A  //TEMP相当于C语言里面的Count
	CLR		TEMPL  //TEMPL相当与C语言里面的TempBit
SEARCH_LOOP:
	LD		A,TEMP
	ORA		TEMPL
	SUBIA	.130  //最大温度
	SZB		FLAGS,C
	JP		SEARCH_LOOP_1
	COMA	TEMP
	ANDR	TEMPL
	JP		SEARCH_LOOP_2		
	
SEARCH_LOOP_1:
	LD		A,TEMP
	ORA		TEMPL	
	ADDIA	TEMP_TABLE$L    //查表,注意查表算法
	LD		TABLE_SPL,A
	LDIA	TEMP_TABLE$H
	LD		TABLE_SPH,A
	TABLEA
	SUBA	BOT_AD
	SNZB	FLAGS,C
	JP		SEARCH_1
	JP		SEARCH_2
	
SEARCH_1:
	COMA	TEMP
	ANDR	TEMPL
	JP		SEARCH_LOOP_2

SEARCH_2:
	LD		A,TEMP
	ORR		TEMPL
	JP		SEARCH_LOOP_2
SEARCH_LOOP_2:
	CLRB	FLAGS,C
	RRCR	TEMP
	LD		A,TEMP
	SNZB	FLAGS,Z
	JP		SEARCH_LOOP
	LD		A,TEMPL
	LD		BOT_WENDU,A   //最后得到的实际温度存到BOT_WENDU
SEARCH_TEMP_BACK:
	RET

ORG 0700H	 //W温度表格数据
TEMP_TABLE:	
DW	8 
DW	8 
DW	8 
DW	9 
DW	9 
DW	10 
DW	10 
DW	11 
DW	11 
......

你可能感兴趣的:(算法)