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度,将温度进行等分刻画 华氏度: ...
随机推荐
- Centos7制作本地yum仓库,共享给局域网其他设备
环境准备: 准备好安装好Centos7的虚机A(服务端)和虚机B(客户端) 配置两台虚机网络使其互通,关闭selinux和firewalld等限制 下载完整的ISO镜像(CentOS-7-x86_64 ...
- GIT保存记录原理之commit对象
GIT 中提交对象非常的重要,我们通过它记录代码提交过程.进行文件保存.回退等操作,那么它是怎样帮助我们记录这些信息的呢?其实就是都保存在项目根目录的 .git 文件夹中. 新建空项目 ```gitD ...
- 从redis未授权访问到获取服务器权限
从redis未授权访问到获取服务器权限 好久没写博客了,博客园快荒芜了.赶紧再写一篇,算是一个关于自己学习的简要的记录把. 这里是关于redis未授权访问漏洞的一篇漏洞利用: 首先是redis,靶场搭 ...
- phpexcel图片获取
phpexcel图片获取常见的两种方式: require_once dirname(__FILE__) . '/../Jn/PHPExcel.php'; $filePath = "123.x ...
- K210 调节颜色阈值识别红绿黄三色
官方在机器视觉的API中提供了寻找绿色色块的例程 https://wiki.sipeed.com/soft/maixpy/zh/api_reference/machine_vision/image/i ...
- 从零开始实现放置游戏(十七)——完结篇(附DEMO地址)
大家好,时隔2年多,我来填坑啦! 之前用的技术.设计思路都不成熟,所以直接干掉重做了. 由于从头教学实在太啰嗦,精力也有限,咱们还是直接上源码吧. DEMO地址: http://212.129.154 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-11-playwright操作iframe-上篇
1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了.但是还是有小伙伴或者童 ...
- 深入理解Linux内核——内存管理(3)
提要:本系列文章主要参考MIT 6.828课程以及两本书籍<深入理解Linux内核> <深入Linux内核架构>对Linux内核内容进行总结. 内存管理的实现覆盖了多个领域: ...
- [Qt开发探幽(二)]浅谈关于元对象,宏和Q_ENUM
目录 [Qt开发探幽(二)]浅谈关于元对象,宏和Q_ENUM 前言 一.元对象 但是 二.关于Q_OBJECT等宏属性 1.元对象系统 2.信号与槽 3.属性系统 三.关于Q_ENUMS 1.将其注册 ...
- OpenLDAP服务器搭建
一.关闭防火墙和selinux [root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# systemctl d ...