1.小于0度的转换

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

我们已经知道高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,所以液晶屏的显示就有像以下两种情况

代码上我们是这样处理的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);”就是如下图显示了

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

}

这个函数在主函数里的用法就是判断返回值是否为1if( 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”代表的就是这个内存的变量,也就是读出的未转换的温度值。

单片机温度传感器c语言编码,温度传感器代码解析Ⅱ相关推荐

  1. 温度传感器c语言编写,温度传感器代码解析Ⅰ

    温度传感器的读写时序原理跟红外遥控差不多,关于宋老师的lesson16_2例程的DS18B20.c的代码这里我们就不讲解了, <手把手教你学51单片机>文档第16章都已讲解明白.我们要讲解 ...

  2. pt100温度传感器c语言,pt100温度传感器阻值,pt100温度与阻值对照表

    描述 Pt100在用于温度传感器时,是采用温度系数符合特定要求的金属铂制成的,依据物体电阻值随温度变化而变化的原理工作的,电阻式温度传感器中,按照国际温标(国际组织对热力学温度的定义)在热力学温度为2 ...

  3. java三色球问题_C语言三色球问题代码解析

    问题描述 一个口袋中放有12个球,已知其中3个是红的,3个是白的,6个是黑的,现从中任取8个,问共有多少种可能的颜色搭配? 问题分析 根据问题描述可设任取的8个球中红球为m个,白球为n个,则黑球为8- ...

  4. 51单片机用c语言写音符代码,51单片机电子琴设计C语言程序实例

    51单片机C程序实例,电子琴设计 #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsi ...

  5. DSB算法C语言程序,单片机中使用DSB温度传感器C语言程序.doc

    单片机中使用DSB温度传感器C语言程序 单片机中使用DS18B20温度传感器C语言程序(参考1) /************************************************** ...

  6. 单片机温度控制器c语言代码,51单片机两路温度控制器设计方案

    原标题:51单片机两路温度控制器设计方案 本文提出了基于 两路 的设计方案,该设计方案采用两个DS18B20温度 ,采集两个不同地方的温度,通过AT89C51处理进行,由四位 数码管显示所测量温度,前 ...

  7. 单片机c语言必背代码_【典藏】深度剖析单片机程序的运行(C程序版)

    1.日常聊一聊 今天为大家带来一篇对于单片机学习的小伙伴非常重量级的一篇文章<深度剖析单片机程序的运行(C语言版本)>,该文章会比较全面的为大家解析我们的用C语言编译出来的程序是如何在单片 ...

  8. 单片机-bmp280大气压强与温度传感器使用详解

    单片机-bmp280大气压强与温度传感器使用详解" 转载: https://blog.csdn.net/sunshinebooming/article/details/79637822 最近 ...

  9. 数字式气压和温度传感器MPXY8020A介绍及驱动代码

    数字式气压和温度传感器MPXY8020A介绍及驱动代码 Author:Once Day Date:北部市保留地,2022年5月13日 文章目录 数字式气压和温度传感器MPXY8020A介绍及驱动代码 ...

  10. java兔子问题流程图_C语言编程狼追兔子问题代码解析

    原标题:C语言编程狼追兔子问题代码解析 问题描述 一只兔子躲进了10个环形分布的洞中的一个.狼在第一个洞中没有找到兔子,就隔一个洞,到第3个洞去找:也没有找到,就隔2个洞,到第6个洞去找:以后每次多一 ...

最新文章

  1. eventbus框架
  2. 误删/etc/passwd的修复
  3. 【腾讯Bugly干货分享】那些年,我们一起写过的“单例模式”
  4. 亚马逊正式发布关系型数据库Amazon Aurora
  5. listview与gridview点击时的背景色取消
  6. javascript --- 异步按顺序执行
  7. C#实践设计模式原则SOLID
  8. QT项目开发与团队合作
  9. Android下的HttpClient的使用(9.11)
  10. ZKWeb网页框架2.1正式发布
  11. C#-WinForm-ListView-表格式展示数据、如何将数据库中的数据展示到ListView中、如何对选中的项进行修改...
  12. 大数据Hadoop学习记录(2)----基于Java语言的HDFS文件数据载入(判断文件是否存在、写入文本文件、上传本次文件到HDFS、读取HDFS文件内容)
  13. Spring Boot_打造企业级微信点餐系统_汇总贴
  14. java读取properties文件详解
  15. matlab legend分栏,word排版技巧
  16. 计算机操作系统(汤小丹)慕课版课后题答案第五章:储存器管理
  17. ubuntu安装包常用下载地址
  18. linux连接苹果鼠标,Linux 5.13添加对苹果Magic Mouse 2和微软SAM的支持
  19. Zynga公布2020年第三季度财务业绩
  20. 亚马逊账号关联的后果是什么

热门文章

  1. 传奇 SF 开服架设流程详细介绍:
  2. 图片转为PDF怎么弄
  3. 【JZOJ5773】简单数学题【数论,数学】
  4. C语言编程奖学金评定,C语言计算奖学金总额
  5. steam linux安装目录在哪,如何在Mac(以及Windows / Linux)上重新安装Steam游戏
  6. 为什么博途V17及以下的HMI面板不能与1500固件版本2.9或1200版本4.5 的CPU建立连接?
  7. java 代码块 构造函数_Java学习笔记之------构造函数,静态关键字,静态代码块,构造代...
  8. CMS采集插件-CMS自动采集插件免费
  9. 一个好中医就是一座全科医院
  10. 在一夜暴富之前,我先一夜秃了头