DS18B20温度转换

2019-07-15 15:41发布

51单片机从DS18B20读取到温度值之后如何转换才能显示到1602上,重点讲解小数点怎么控制,通俗一些,急急急,拜托了,这个问题已经困扰我很久了。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
无量寿经
2019-07-16 03:12
以下内容来源于《51单片机轻松入门—基于STC15W4K系列》


19.2  单只DS18B20的温度检测
例19.1 单只DS18B20的温度检测,测温范围 -55~+125度,1602液晶显示,1602写单字符方式写入数据。R/C时钟频率:22.1184MHz。程序移植时只需要修改DS18B20.H中的18B20信号引脚定义与myfun.c中的延时函数参数保证延时时间基本准确即可,程序运行结果如图19-11所示。
未命名5.jpg

        图19-11  单只18B20测温结果
//单只DS18B20的温度检测,测温范围-55 ~ +125度,1602液晶显示。#include "STC15W4K.H" #include "DS18b20.h"#include "myfun.h"#include "LCD1602.h" bit flag;                             // flag=0表示正温,flag=1表示负温。unsigned char baiw,shiw,gew;          // 百位、十位、个位 ASCII码unsigned char point_1,point_2,point_3,point_4;    // 小数点后1、2、3、4位ASCII码//****************温度数据处理函数************************/void gettemp()                          // 读取温度值 {                          unsigned int temp0,temp1,temp;      // 存放小数、整数、符号,10000倍小数值     unsigned char temh,teml;            // 存放原始高字节与低字节        temp=DS18B20_ReadTemperature();     // 从18B20中读取2字节原始温度值     flag=0;      if ((temp&0xf800)!=0)        // 如果是负温,将补码取反加1变为原码     {         temp=~temp +1;         flag=1;     }       temh=temp/256;                // 高字节(5位符号+3位数据)     teml=temp%256;                // 低字节(4位整数+4位小数)     temp0=teml&0x0F;              // 4 位小数    temp1=(temh<<4)|(teml>>4);   // 8 位整数(最高一位符号0不用管)          baiw=temp1/100+48;            // 百位ASCII码       shiw=(temp1%100)/10+48;       // 十位 ASCII码      gew=(temp1%100)%10+48;        // 个位 ASCII码       temp=temp0*625;               // 将结果中的小数乘以分辨温度0.0625                                 // 扩大10000倍进行输出,不用浮点,同样可以保留4位小数精度     point_1=temp/1000+48;         // 小数点后1位ASCII码     point_2=(temp%1000)/100+48;   // 小数点后2位ASCII码     point_3=(temp%100)/10+48;     // 小数点后3位ASCII码     point_4=temp%10+48;           // 小数点后4位ASCII码}void main(){    unsigned char xPos,yPos;    unsigned char *s="Now tempis:";    port_mode();                 // 所有IO口设为准双向弱上拉方式。    xPos=0;                       // xPos表示水平右移字符数(0-15)    yPos=0;                       // yPos表示垂直下移字符数(0-1)    delay100ms();                 // 等待LCD1602上电时内部复位    LCD1602_Init();    WriteString(xPos,yPos,s);     // X坐标、Y坐标、字符串,屏幕左上角为坐标原点        DS18B20_SetResolution(3); //设置DS18B20的分辨率为12位(默认值,新器件可以不作任何设置)    while(1)    {        gettemp();        if(flag)      // 负温度        {             WriteChar(0,1,'-');        }        if(!flag)     // 正温度        {            WriteChar(0,1,'+');        }               WriteChar(1,1,baiw);WriteChar(2,1,shiw); WriteChar(3,1,gew); WriteChar(4,1,'.');        WriteChar(5,1,point_1); WriteChar(6,1,point_2); WriteChar(7,1,point_3);        WriteChar(8,1,point_4);        SetCur(NoCur);        //有显示无光标    }}

一周热门 更多>