51单片机-温度传感器代码解析Ⅱ

发布者:悦耳旋律最新更新时间:2021-08-30 来源: eefocus关键字:51单片机  温度传感器 手机看文章 扫描二维码
随时随地手机看文章

1.小于0度的转换

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

13.9.png

我们已经知道高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

13.11.png


代码上我们是这样处理的


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


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”代表的就是这个内存的变量,也就是读出的未转换的温度值。

关键字:51单片机  温度传感器 引用地址:51单片机-温度传感器代码解析Ⅱ

上一篇:51单片机-温度传感器代码解析Ⅰ
下一篇:51单片机-温度传感器代码独立文件

推荐阅读最新更新时间:2024-11-17 04:18

51单片机概述以及设计最小系统
单片机是什么? 在学之前必须要明白这个东西是什么,怎么用,为什么能这样用。理解这三个问题,那么51单片机就可以学得很好。 单片机的对比 这里只对8051与8052进行对比: 型号 Flash(ROM) RAM I/O 定时/计数器 中断源 引脚数 AT89C51 4KB 128B 32 2 5 40 AT89c52 8KB 256B 32 3 8 40 引脚描述 20引脚VSS:电源负极 40引脚VCC:电源正极(+5V) 19引脚XTAL1:片内时钟振荡器的输入端;当使用片内时钟振荡器时,这个引脚接石英晶体和微调电容。 18引脚XTAL2:片内时钟振荡器的输出端;当使用片内时钟振荡器时,这个引脚接石英晶体和微
[单片机]
<font color='red'>51单片机</font>概述以及设计最小系统
51单片机实现独立按键控制LED灯
3-1独立按键控制LED亮灭 本段代码主要使用了if...else...语句实现按下按下灯亮,松开按键时灯灭 #include REGX51.H void main() { while(1) { if(P3_1==0&&P3_0==0) { P2_0=0; } else { P2_0=1; } } } 3-2独立按键控制LED状态 首先使用较为灵活的延时函数生成代码,进行修改后如下 void Delay(unsigned int xms) { unsigned char i, j; while(xms) { i = 2; j = 2
[单片机]
51单片机驱动12位AD转换TLC2543电路图+程序
下面是电路图和仿真图: TI公司的12位AD转换TLC2543芯片比ADC0832的8位AD转换芯片,精度要高很多,ADC0832的精度是255分之1,而TLC2543 由于二进制数的位数是12bit,所以精度要高出很多,它的精度为4096分之一。以下为89C51单片机控制C语言程序和电路连接图。完整的工程文件及hex文件下载:http://www.51hei.com/f/tlccadc.rar 是用stc89c51单片机制作的 成品正在使用中. #include reg51.h #define uint unsigned int #define uchar unsigned char sbit cs=P1^0;
[单片机]
<font color='red'>51单片机</font>驱动12位AD转换TLC2543电路图+程序
80C51单片机模仿实例100—1 LED闪烁
为了保存住假期里学习过的单片机,尽量做到一个星期模仿一个实例,也是进一步学习Proteus。 今天编写的是LED间隔闪光,时间为1S,仿真软件Proteus。 /* Main.c file generated by New Project wizard * * Created: 周六 11月 25 2017 * Processor: 80C52 * Compiler: Keil for 8051 * Author: Chenchong */ #include #include #define uchar unsigned char #define uint unsigned int sbit LED
[单片机]
80C<font color='red'>51单片机</font>模仿实例100—1 LED闪烁
mcs51单片机计数器/定时器工作方式3 编程举例
2个8位方式。工作方式3只适用于定时器0。如果使定时器1为工作方式3,则定时器1将处于关闭状态。 当T0为工作方式3时,THo和TL0分成2个独立的8位 计数器 。其中,TL0既可用作定时器,又可用作计数器,并使用原T0的所有控制位及其定时器回零标志和中断源。TH0只能用作定时器,并使用T1的控制位TRl、回零标志TFl和中断源,见下图。 通常情况下,T0不运行于工作方式3,只有在T1处于工作方式2,并不要求中断的条件下才可能使用。这时,T1往往用作串行口波特率发生器(见1.4),TH0用作定时器,TL0作为定时器或计数器。所以,方式3是为了使单片机有1个独立的定时器/计数器、1个定时器以及1个串行口波特率发生器的应用场合而特地
[单片机]
mcs<font color='red'>51单片机</font>计数器/定时器工作方式3 编程举例
51单片机驱动ADC0832模数转换程序-lcd1602显示
/*这个芯应用不多*/ #include reg51.h #define uchar unsigned char #define uint unsigned int uchar Chan0Value,Chan1Value; sbit RS=P1^0; //1602各控制脚 sbit RW=P1^1; sbit EN=P1^2; sbit Cs0832= P2^0; //0832各控制脚 sbit Clk0832= P3^6; sbit Di0832= P3^7; sbit Do0832= P3^7; void delay1ms(unsigned int ms)//延时1毫秒(不够精确的) { int i,j; for(
[单片机]
基于AT89C51单片机和放大器实现音频信号均幅控制放大电路的设计
引言 现在的学校,有许多已经采用计算机加网络多媒体系统来进行现场教学。此外,工程施工人员在施工现场进行对讲通话,驾驶人员在开动的坦克等自行火炮车辆上进行通话等,都避免不了讲话时嘈杂的背景噪声或无线干扰(包括网络射频干扰),因而声音有大有小。怎样才能使听到的广播声或耳机中说话的声音平稳清晰,本文给出了一种用SG270、LM4884电路配合AT89C51单片机来解决干扰问题的实现方案。 1 电路主要器件 1.1 SG270放大器 SG270电路为国产工业级(-40℃~+85℃)可控增益音频放大器,该芯片的1、2脚为正、反相信号输人端,A、B、C为压控输入端,增益控制电压范围为2.1~2.5 V,可通过输出反馈信号来即时进行自动增益
[单片机]
基于AT89C<font color='red'>51单片机</font>和放大器实现音频信号均幅控制放大电路的设计
基于51单片机的多通道数据采集范围控制系统
1 引 言   在实际应用中,对被控对象的物理参数(温度、湿度、位移、电流、电压等)在一定的范围内进行控制,是单片机的典型应用之一。很多宏观要求精确控制的场合,其微观控制过程,仍可归结为是对某些参数变化范围的控制。如,传统的三相异步电机从启动到正常运行,其电流、电压和温度的变化;抽水塔水位的变化;机床刀具的行程变化及数字电表的自动量程变换等。这些控制过程最显著的特点是:被控物理量都是一个变化范围,而非某一个精确的“点”。有效控制物理量变化范围的方法很多,本文重点介绍利用C8051F000单片机片内8路高性能的12位ADC数据采集系统和可编程窗口检测器,实现对多路参数变化范围控制的硬件组成和软件设计方法。 2 C8051Fxxx系列
[单片机]
基于<font color='red'>51单片机</font>的多通道数据采集范围控制系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved