DS18B20初始化-读-写-温度转换
(一)初始化
初始化时序:

- 数据线先拉到高电平,稍作延时即可(刚开始是高电平还是低电平芯片手册上其实不关心这一部分)
- 数据线拉到低电平
- 延时(480us~960us)
- 将数据线拉高电平
- 延时等待(大于60us)
- 判断有没有初始化成功;理论上电平在第4步置高后,DS18B20如果存在就会将数据线拉低
如果不存在就还是高电平 - 延时(cpu读到18b20回应的低电平后,还要做延时;其时间是从发出高电平(第4步)时间算起,至少要480us
/********************FunctionDescription_Start********************************
* @Name : Init_DS18B20
* @param :None
* @author : m晴朗
* @Data : 2021-11-26
* @return :
* @PURPOSE: 初始化DS18B20
1.数据线先拉到高电平,稍作延时即可(刚开始是高电平还是低电平芯片手册上其实不关心这一部分)
2.数据线拉到低电平
3.延时(480us~960us)
4.将数据线拉高电平
5.延时等待(DS18B20回应时间是15~60us,在我自己的硬件上测试出来是27us恢复,
所有我这里设置延时40us,如果不知道是多长时间回应,可以设置大于60us
6.判断有没有初始化成功;理论上电平在第4步置高后,DS18B20如果存在就会将数据线拉低
如果不存在就还是高电平
7.延时(cpu读到18b20回应的低电平后,还要做延时;其时间是从发出高电平(第4步)时间算起,至少要480us
/********************FunctionDescription_End*********************************/
void Init_DS18B20(void)
{
DQ=1;
delay1us(2);
DQ=0;
delay1us(500);
DQ=1;
delay1us(40);
isTemp=DQ;
delay1us(440);
}
(二)读字节
时序图:

- 将数据线拉低
- 延时大于1us(不要太大,因为我延时后面还要执行一个语句,所以整体时间大于1us)
- 将数据线拉高
- 延时10us
- 处理数据
- 延时50us
- 重复1~6,直至读完一个字节
/********************FunctionDescription_Start********************************
* @Name : ReadOneChar
* @param :None
* @author : m晴朗
* @Data : 2021-11-26
* @return :
* @PURPOSE: 读一个字节
1.将数据线拉低
2.延时大于1us(不要太大,因为我延时后面还要执行一个语句,所以整体时间大于1us)
3.将数据线拉高
4.延时10us
5.处理数据
6.延时50us
7.重复1~6,直至读完
/********************FunctionDescription_End*********************************/
Byte ReadOneChar(void)
{
Byte i=0;
Byte dat=0;
for (i=8; i>0; i--) //一个字节有8位
{
DQ=0;
delay1us(1);
dat>>=1;
DQ=1;
delay1us(10);
if(DQ)
dat|=0x80;
delay1us(50);
}
return(dat);
}
(三)写字节
时序图:

- 数据线拉低
- 延时15us
- 从低位到高位发送数据,一次一位
- 延时60us
- 拉高数据线
- 重复1~5
- 读完一个字节后要延时40us
/********************FunctionDescription_Start********************************
* @Name : WriteOneChar
* @param :dat: [输入/出]
* @author : m晴朗
* @Data : 2021-11-26
* @return :
* @PURPOSE: 写一个字节
1.数据线拉低
2.延时15us
3.从低位到高位发送数据,一次一位
4.延时60us
5.拉高数据线
6.重复1~5
7.读完一个字节后要延时40us
/********************FunctionDescription_End*********************************/
void WriteOneChar(Byte dat)
{
unsigned char i=0;
for(i=8; i>0; i--)
{
DQ=0;
delay1us(15);
DQ=dat&0x01;
delay1us(68);
DQ=1;
dat>>=1;
}
delay1us(40);
}
(四)温度转换
1获得数据
/********************FunctionDescription_Start********************************
* @Name : ReadTemperature
* @param :None
* @author : m晴朗
* @Data : 2021-11-26
* @return :
* @PURPOSE: 读温度值(低位放tempL;高位放tempH;)
/********************FunctionDescription_End*********************************/
void ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay1us(800); //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
}
2转换数据
格式

意义
tempH(xxxx x000):前5位是符号标志位(0-正数 1-负数); 后三位和低字节前4位的组成整数部分
tempL(0000 0000): 前4位和高字节的后三位组成整数部分; 后四位为小数部分温度表示图

实例计算
(1) 正数:
16进制是:00A2H
2进制是:0000 0000 1010 0010
取高字节后3位和低字节前4位:000 1010
转成10进制:10
低字节后4位:02-1+02-2+12-3+02-4=0.125(02-1为02的-1次方)
结果:10+0.125=10.125(如上图)
(2)负数:
16进制是:FF5EH
2进制是:1111 1111 0101 1110
取高字节后3位和低字节前4位:111 0101
取反加1:000 1011
转成10进制:11
加负号:-11
低字节后4位:12-1+12-2+12-3+02-4=0.875(02-1为02的-1次方)
结果:-11+0.875=-10.125(如上图)代码(我用的是QT(c++)编写的,大家用的编程语言不一样,但是算法一样)
//我用的是QT(c++)编写的,大家用的编程语言不一样,但是算法一样
QString DS18B20::CaculateTemp(quint8 tmh, quint8 tml)
{
quint8 th;
quint8 tl;
double temp = 0;
tl = tml & 0x0F; //取低字节后四位
th = (tmh << 4) + (tml >> 4); //取高字节后三位和低字节前四位
temp = (int)th; //整数部分
if (tmh > 0x08)
{
th = ~th + 1; //取反加一
temp = -th; //负数
}
temp += tl * 0.0625; //小数部分
return QString::number(temp, '.', 2);
}
- 效果图(有点简陋)

DS18B20初始化-读-写-温度转换的更多相关文章
- 温度转换-java
java 温度转换 题目内容: 写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32 其中C表示摄氏温度,F表示华氏温度. 程序的输入是一个整数,表示华氏温度.输 ...
- 用树莓派和DS18B20做个汽车温度记录仪[原创]
用树莓派和DS18B20做个汽车温度记录仪[原创] 很想知道夏日阳光暴晒下,汽车内的最高温度以及温度的变化情况.觉得用树莓派和DS18B20来实现应该很简单,于是就尝试捣鼓了一下,半天时间就搞定了,写 ...
- 用树莓派和DS18B20做个汽车温度记录仪
原文:用树莓派和DS18B20做个汽车温度记录仪 用树莓派和DS18B20做个汽车温度记录仪[原创] 很想知道夏日阳光暴晒下,汽车内的最高温度以及温度的变化情况.觉得用树莓派和DS18B20来实现应该 ...
- 中国MOOC_零基础学Java语言_第1周 计算_第1周编程题_1温度转换
第1周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将 ...
- ytu 2029: C语言实验——温度转换(水题)
2029: C语言实验——温度转换 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 12 Solved: 10[Submit][Status][Web B ...
- 【笔记】嵩天.Python语言程序设计.完成两个简单实例(温度转换和绘图)
[博客导航] [Python相关] 目标 使用PyCharm,完成两个小实例的编写和运行.一个是温度转换,一个是蟒蛇图形绘制. 过程 1.先设置project目录,虽然命名不是很正式,主要不太习惯软件 ...
- Pandas 基础(4) - 读/写 Excel 和 CSV 文件
这一节将分别介绍读/写 Excel 和 CSV 文件的各种方式: - 读入 CSV 文件 首先是准备一个 csv 文件, 这里我用的是 stock_data.csv, 文件我已上传, 大家可以直接下载 ...
- 1001. 温度转换 (Standard IO)
1001. 温度转换 (Standard IO) 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 题目描述 将输入的华氏温度转换为摄氏温度.由华氏温度F与摄氏温度C的转换 ...
- MyISAM Key Buffer 读/写/利用率(%) MylSAM平均每秒Key Buffer利用率(%) MylSAM平均每秒Key Buffer读命中率(%) MylSAM平均每秒Key Buffer写命中率(%)
MyISAM Key Buffer 读/写/利用率(%) MylSAM平均每秒Key Buffer利用率(%)MylSAM平均每秒Key Buffer读命中率(%)MylSAM平均每秒Key Buff ...
- day1-01 温度转换
一."温度转换"问题分析 1.1 温度转换 温度刻画的两种不同体系 摄氏度:中国等世界大多数国家使用 以1标准大气压下水的结冰点为0度,沸点为100度,将温度进行等分刻画 华氏度: ...
随机推荐
- PREDIV与PLLMUL配置应用笔记
下图为CH32V305/307和CH32F205/207时钟树框图,在此,以CH32V307VCT6芯片,外置25MHz晶振为例,简述图中PREDIV与PLLMUL的配置方法,最终实现144MHz系统 ...
- C++之函数的分文件编写
从黑马程序员的c++课里学到的函数的分文件编写 函数的分文件编写 作用:让代码结构更加清晰 函数分文件编写一般有4个步骤 1,创建后缀名为.h的头文件 2,创建后缀名为.cpp的源文件 3,在头文件中 ...
- 2022-1-11 面板控件学习1 Canvas、WrapPanel、StackPanel、DockPanel、Grid
Canvas WrapPanel 让控件横向排列 StackPanel 控件竖向排列 DockPanel 自由布局,LastChildFill防止最后一个控件自动填充满 Grid 使用*和2*可以分配 ...
- 文心一言 VS 讯飞星火 VS chatgpt (67)-- 算法导论6.5 6题
文心一言 VS 讯飞星火 VS chatgpt (67)-- 算法导论6.5 6题 六.在 HEAP-INCREASE-KEY 的第 5 行的交换操作中,一般需要通过三次赋值来完成.想一想如何利用IN ...
- Angular与AngularJS区别
简单介绍 目前 Angular 2 到現在 Angular 11 都是十分穩定的改版,不再出現之前 Angular 1.x 到 Angular 2.x 的哀鴻遍野. 因此目前市面上確實同時存在著兩種差 ...
- Java程序员的MacBookPro(14寸M1)配置备忘录
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 欣宸的月俸虽然很低,但还是咬着牙攒够银子,入 ...
- 记一次 .NET某报关系统 非托管泄露分析
一:背景 1. 讲故事 前段时间有位朋友找到我,说他的程序内存会出现暴涨,让我看下是怎么事情?而且还告诉我是在 Linux 环境下,说实话在Linux上分析.NET程序难度会很大,难度大的原因在于Li ...
- pentaho(keetle)数据同步实践
pentaho(keetle)数据同步实践 1 pentaho简介 pentaho可读作"彭塔湖",在keetle被pentaho公司收购后改名而来. pentaho是一款开源ET ...
- 【技术实战】Vue功能样式实战【六】
需求实战一 样式展示 代码展示 <template> <ARow> <ACol style="background-color:#F1F4F5 "&g ...
- Android 项目移植后运行黑屏
在做Android项目的移植过程中,即把名为a的代码和样式全部复制到b项目后,只是对a项目内多余代码删除和修改包名,最后替换完后,点击=>运行,运行成功,但是演示机显示黑屏,看log也没有报错. ...