历史上的今天
返回首页

历史上的今天

今天是:2024年08月30日(星期五)

正在发生

2021年08月30日 | 51单片机-温度传感器代码解析Ⅱ

2021-08-30 来源:eefocus

1.小于0度的转换

我们知道当测量的实际温度为0度以下时,temp没转换时的情况为下图所示

13.9.png?imageView2/2/w/550

我们已经知道高5位为1表示的是负数,那么-0.5度的时候为什么是1111 1111 1111 1000。


负数的计算涉及到补码的知识。首先0xFFF8,除去高5位那就是

111 1111 1000

反码为 000 0000 0111

而补码就是反码加1,也就是补码为000 0000 1000

这样0.5就是由补码(十进制的8)乘以0.0625得来。


我们要知道,负数的时候需要关注的是temp的低11位,补码其实就是2的11次方(2048)减去temp的低11位的数值。


-55度的时候,补码为2048-0x0490=880。 转换就是880*0.0625=55。加上符号就是-55度了。


因为测量负数时只能测-0.1~-55.0,所以液晶屏的显示就有像以下两种情况

13.10.png?imageView2/2/w/550

13.11.png?imageView2/2/w/550


代码上我们是这样处理的


temp=temp&0x07FF;                   //清除掉高5位使其变为0

temp=2048-temp;                     //此时的temp为补码     

temp_float=(float)temp*0.0625*10.0; //实际温度值再乘以10倍

temp=(unsigned int)temp_float;      //得到16位整型的数值

  

str[0]='-';                         //添加负数的符号

str[1]='0'+( (temp/100)%10 );       //当温度在-10度以下时需要显示十位数

str[2]='0'+( (temp/10)%10 );        //温度必须显示个位数,哪怕是0,比如“-0.5”

str[3]='.';

str[4]='0'+( temp%10 );             //温度必须显示小数点后的一位

  

if(str[1]=='0')

    str[1]='-';                     //如果温度没有低于等于-10.0度(比如是-9.8度),让str[1]填充负数符号,如果温度低于等于-10.0度,那么填充负数符号的是str[0]

    LcdShowStr(0, 0, str+1);        //温度高于-10.0度,只需显示4个字符

}

else LcdShowStr(0, 0, str);         //温度低于等于-10.0度,显示5个字符


实际温度是-10.0以下的话就是显示5个字符(比如-11.7度)。

实际温度大于-10.0的话,比如-9.8度,要做到高位为0不显示,所以str[1]等于'0'时让“str[1]='-';”。这样的话“LcdShowStr(0, 0, str+1);”就是如下图显示了


13.12.png?imageView2/2/w/550


2.再谈指针

以上两种转换方式我们整合成了一个“温度转换”的函数


unsigned char TEMP_CONV(unsigned int *temp, unsigned char *str)

{

    unsigned char res;

    float  temp_float;

     

    res = Get18B20Temp(temp);  //读取当前温度,传入的参数是指针类型

    if (res)                   //读取成功时,进行温度转换

    {

        if( (*temp>>11)==0 )   //温度大于等于0度     

        {   

            temp_float=( (float)(*temp) ) *0.0625*10.0;  //*temp就是没有转换时的16位那个变量,然后再把实际温度值再乘以10倍

            *temp=(unsigned int)temp_float;              //得到16位整型的数值

            str[0]='0'+( (*temp/1000)%10 );              //当温度大于等于100度时需要显示百位数

            str[1]='0'+( (*temp/100)%10 );               //当温度大于等于10度时需要显示十位数

            str[2]='0'+( (*temp/10)%10 );                //当温度大于等于1度时需要显示个位数

            str[3]='.';

            str[4]='0'+( (*temp)%10 );                   //温度必须显示小数点后的一位

  

            if(str[0]=='0')temp_i++;

            if(str[1]=='0')temp_i++;

  

            return 1;//读取温度成功,返回值一律为1

        } 

  

        else if( (*temp>>11)>0 )//温度小于0度     

        {

            *temp=(*temp)&0x07FF;                       //清除掉高5位使其变为0

            *temp=2048-(*temp);                         //此时的temp为补码     

            temp_float=( (float)(*temp) )*0.0625*10.0;  //实际温度值再乘以10倍

            *temp=(unsigned int)temp_float;             //得到16位整型的数值

  

            str[0]='-';                                 //添加负数的符号

            str[1]='0'+( (*temp/100)%10 );              //当温度在-10度以下时需要显示十位数

            str[2]='0'+( (*temp/10)%10 );               //温度必须显示个位数,哪怕是0,比如“-0.5”

            str[3]='.';

            str[4]='0'+( (*temp)%10 );                  //温度必须显示小数点后的一位

  

            if(str[1]=='0')

            { 

                str[1]='-';

                temp_i=1;//实际温度大于-10.0度的时候,假如是-5.4度,那么“LcdShowStr(0, 0, str+temp_i);”就是显示“-5.4”,小数点就是在第3个显示格上显示

                         //实际温度小于等于-10.0度的时候,假如是-12.6度,str[1]不等于‘0’,

                         //这样temp_i是等于0的,那么“LcdShowStr(0, 0, str+temp_i);”显示“-12.6”,小数点就是在第4个显示格上显示  

            }

  

            return 1;    //读取温度成功,返回值一律为1

        } 

    } 

      

    return 0;//读取温度不成功,返回值为0

}


这个函数在主函数里的用法就是判断返回值是否为1


if( TEMP_CONV(&temp,str)==1 )     //返回值为1代表读取温度成功


我们在主函数里定义了一个u16类型的变量temp,

传入给“unsigned char TEMP_CONV(unsigned int *temp, unsigned char *str)”的第一个参数是变量temp的指针,然后该函数执行的第一句“res = Get18B20Temp(temp);”此时传入的参数temp是个指针变量,“Get18B20Temp(temp)”函数内部的执行就是把温度数据赋给传入的指针的那个内存里,后面的“*temp”代表的就是这个内存的变量,也就是读出的未转换的温度值。

推荐阅读

史海拾趣

CT [ Central Technologies ]公司的发展小趣事

经过数年的努力,CT公司终于研发出了一款具有颠覆性的新型芯片技术。这款芯片在性能上大幅超越了当时的同类产品,引起了市场的广泛关注。多家知名企业纷纷与CT公司展开合作,将这款芯片应用于他们的产品中。随着合作伙伴的增加和市场份额的扩大,CT公司的知名度逐渐提升,成为了电子行业的一匹黑马。

CONTTEK Group GmbH公司的发展小趣事

CONTTEK Group GmbH公司注重企业文化的建设和团队精神的培养。公司倡导“以人为本、创新驱动”的企业文化,鼓励员工积极参与创新活动,发挥个人潜能。同时,公司还注重团队建设,通过定期的培训和团建活动活动,增强员工的凝聚力和向心力。这种积极向上的企业文化和团结协作的团队精神,为公司的持续发展提供了强大的动力。

这五个故事展示了CONTTEK Group GmbH公司在电子行业中的发展历程和取得的成就。从创立初期的艰难起步到技术创新、市场拓展、品质管理和企业文化建设的不断推进,CONTTEK Group GmbH公司始终保持着积极进取的精神和不断创新的态度,在电子连接器领域取得了显著的成绩。

ABC [ABC Taiwan Electronics Corp]公司的发展小趣事

ABC Taiwan Electronics Corp成立于上世纪八十年代,起初只是一个小型电子零件加工厂。面对激烈的市场竞争和有限的资源,公司创始人凭借对电子技术的深刻理解和敏锐的市场洞察力,带领团队不断研发新产品,逐步赢得了客户的信任。通过不断积累经验和扩大规模,ABC逐渐在电子零件加工领域站稳了脚跟。

三环(CCTC)公司的发展小趣事

面对全球化的市场趋势和竞争压力,三环(CCTC)公司制定了国际化战略和全球布局计划。公司将继续加大研发投入力度,提升自主创新能力;同时积极拓展国际市场,加强与国际知名企业的合作与交流;此外还将加强人才培养和引进工作,打造一支高素质、专业化的国际化团队。通过这些措施的实施,三环(CCTC)公司将不断提升自身实力和市场竞争力,为成为全球领先的电子企业而不懈努力。

BK Precision公司的发展小趣事

为了满足全球市场的需求,BK Precision开始实施全球化战略。公司不仅在美国本土设立了多个办事处和研发中心,还在欧洲和亚洲等地建立了分支机构。通过与国际授权分销商的合作,BK Precision成功地将产品推向全球市场,并赢得了众多国际客户的信赖。同时,公司还积极参与国际电子行业的展会和交流活动,提升品牌知名度和影响力。

ELM Technology Corporation公司的发展小趣事

ELM Technology Corporation一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格把控。这种对品质的坚持不仅赢得了客户的信任,还为ELM赢得了良好的口碑。在激烈的市场竞争中,ELM凭借卓越的产品品质赢得了市场份额。

问答坊 | AI 解惑

exdi2是否只支持oal,而不支持应用程序的调试?

基于exdi2rvi,我利用visual studio2005和rvi仿真器,在三星6410上进行调试。是否exdi2只支持oal,只能进行image的调试,而对于应用程序(.exe)和驱动(.dll)无能为力?请教各位,谢谢…

查看全部问答>

SSP与SSI接口的区别?

SSP与SSI接口的区别?…

查看全部问答>

remote spy++ 需要怎么配置猜能使用?

我老是连不上 请问有谁成功使用的吗?…

查看全部问答>

请教:AD1674的DB6-DB0值不稳定的原因

我在使用ad1674时发现,转换后的DB6-DB0这几位数据不稳定,比如说输入5V电压,转换后的DB11-DB7这几位的值是固定不变的,但是DB6-DB0这几位时而是0,时而是1。所以在采集100HZ的正弦波时,得到的数据重新绘出的波形,不是很平滑的正弦波。 不知道 ...…

查看全部问答>

求助:能否删除用户模式,使得一个ARM处理器能正常应用,分析适用场合与优缺点,,

求助:     能否删除用户模式,使得一个ARM处理器能正常应用,分析适用场合与优缺点,,请高手指点一二。。。。。。   谢谢…

查看全部问答>

socket编程 connect总返回0

在Wince做的Socket程序,客户端首先进行GPRS拨号,成功后在线程中完成connect,但是connect的地址无论什么都返回0,请教一下 为什么? 这个客户端程序移植到VC下则测试 能用。 …

查看全部问答>

照明电源上使用贴片电容的过程中需要注意的事项

      MLCC(片状多层陶瓷电容)现在已经成为了电子电路最常用的元件之一。MLCC表面看来,非常简单,可是,很多情况下,设计工程师或生产、工艺人员对MLCC的认识却有不足的地方。有些公司在MLCC的应用上也会有一些误区, ...…

查看全部问答>

哪里可以得到LM3S8962评估套件里的程序代码?

如题:        哪里可以得到LM3S8962评估套件里的程序代码?…

查看全部问答>

出售闲置

  出售闲置:1.火牛STM32开发板2.microchip开发套件  进口ICD3+18片(PIC18F87J10)+microchip以太网串口 价格QQ上聊 需要的朋友联系QQ:562191411…

查看全部问答>