专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
DS18B20温度转换
2019-07-15 15:41
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
9448
3
1717
51
单片机
从DS18B20读取到温度值之后如何转换才能显示到1602上,重点讲解小数点怎么控制,通俗一些,急急急,拜托了,这个问题已经困扰我很久了。。。。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
ningandro
1楼-- · 2019-07-15 20:14
disdata[0]=temp/1000+0x30;//百位数
disdata[1]=temp%1000/100+0x30;//十位数
disdata[2]=temp%100/10+0x30;//个位数
disdata[3]=temp%10+0x30;//小数位
其中temp是从温度读取函数里读取出来的温度值!当然了,想18B20正常工作,还得需要初始化函数,位读取函数,字节读取函数,写字节函数。要在1602上显示就简单了,首先是写入地址,接着写入数据就OK了!write-com(0x80);write-dat(disdata[0])!
加载中...
ST_Lover
2楼-- · 2019-07-15 22:28
1002925094
加载中...
无量寿经
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所示。
图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); //有显示无光标
}
}
加载中...
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
disdata[1]=temp%1000/100+0x30;//十位数
disdata[2]=temp%100/10+0x30;//个位数
disdata[3]=temp%10+0x30;//小数位
其中temp是从温度读取函数里读取出来的温度值!当然了,想18B20正常工作,还得需要初始化函数,位读取函数,字节读取函数,写字节函数。要在1602上显示就简单了,首先是写入地址,接着写入数据就OK了!write-com(0x80);write-dat(disdata[0])!
19.2 单只DS18B20的温度检测
例19.1 单只DS18B20的温度检测,测温范围 -55~+125度,1602液晶显示,1602写单字符方式写入数据。R/C时钟频率:22.1184MHz。程序移植时只需要修改DS18B20.H中的18B20信号引脚定义与myfun.c中的延时函数参数保证延时时间基本准确即可,程序运行结果如图19-11所示。
图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); //有显示无光标 }}
一周热门 更多>