(一)初始化

初始化时序:

  1. 数据线先拉到高电平,稍作延时即可(刚开始是高电平还是低电平芯片手册上其实不关心这一部分)
  2. 数据线拉到低电平
  3. 延时(480us~960us)
  4. 将数据线拉高电平
  5. 延时等待(大于60us)
  6. 判断有没有初始化成功;理论上电平在第4步置高后,DS18B20如果存在就会将数据线拉低
    如果不存在就还是高电平
  7. 延时(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);
}

(二)读字节

时序图:

  1. 将数据线拉低
  2. 延时大于1us(不要太大,因为我延时后面还要执行一个语句,所以整体时间大于1us)
  3. 将数据线拉高
  4. 延时10us
  5. 处理数据
  6. 延时50us
  7. 重复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);
}

(三)写字节

时序图:

  1. 数据线拉低
  2. 延时15us
  3. 从低位到高位发送数据,一次一位
  4. 延时60us
  5. 拉高数据线
  6. 重复1~5
  7. 读完一个字节后要延时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转换数据

  1. 格式

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

  3. 温度表示图

  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(如上图)

  5. 代码(我用的是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);
}
  1. 效果图(有点简陋)

DS18B20初始化-读-写-温度转换的更多相关文章

  1. 温度转换-java

    java 温度转换 题目内容: 写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32 其中C表示摄氏温度,F表示华氏温度. 程序的输入是一个整数,表示华氏温度.输 ...

  2. 用树莓派和DS18B20做个汽车温度记录仪[原创]

    用树莓派和DS18B20做个汽车温度记录仪[原创] 很想知道夏日阳光暴晒下,汽车内的最高温度以及温度的变化情况.觉得用树莓派和DS18B20来实现应该很简单,于是就尝试捣鼓了一下,半天时间就搞定了,写 ...

  3. 用树莓派和DS18B20做个汽车温度记录仪

    原文:用树莓派和DS18B20做个汽车温度记录仪 用树莓派和DS18B20做个汽车温度记录仪[原创] 很想知道夏日阳光暴晒下,汽车内的最高温度以及温度的变化情况.觉得用树莓派和DS18B20来实现应该 ...

  4. 中国MOOC_零基础学Java语言_第1周 计算_第1周编程题_1温度转换

    第1周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将 ...

  5. ytu 2029: C语言实验——温度转换(水题)

    2029: C语言实验——温度转换 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 12  Solved: 10[Submit][Status][Web B ...

  6. 【笔记】嵩天.Python语言程序设计.完成两个简单实例(温度转换和绘图)

    [博客导航] [Python相关] 目标 使用PyCharm,完成两个小实例的编写和运行.一个是温度转换,一个是蟒蛇图形绘制. 过程 1.先设置project目录,虽然命名不是很正式,主要不太习惯软件 ...

  7. Pandas 基础(4) - 读/写 Excel 和 CSV 文件

    这一节将分别介绍读/写 Excel 和 CSV 文件的各种方式: - 读入 CSV 文件 首先是准备一个 csv 文件, 这里我用的是 stock_data.csv, 文件我已上传, 大家可以直接下载 ...

  8. 1001. 温度转换 (Standard IO)

    1001. 温度转换 (Standard IO) 时间限制: 1000 ms  空间限制: 262144 KB  具体限制   题目描述 将输入的华氏温度转换为摄氏温度.由华氏温度F与摄氏温度C的转换 ...

  9. MyISAM Key Buffer 读/写/利用率(%) MylSAM平均每秒Key Buffer利用率(%) MylSAM平均每秒Key Buffer读命中率(%) MylSAM平均每秒Key Buffer写命中率(%)

    MyISAM Key Buffer 读/写/利用率(%) MylSAM平均每秒Key Buffer利用率(%)MylSAM平均每秒Key Buffer读命中率(%)MylSAM平均每秒Key Buff ...

  10. day1-01 温度转换

    一."温度转换"问题分析 1.1 温度转换 温度刻画的两种不同体系 摄氏度:中国等世界大多数国家使用 以1标准大气压下水的结冰点为0度,沸点为100度,将温度进行等分刻画 华氏度: ...

随机推荐

  1. Docker安装及镜像加速器配置

    Centos7安装 卸载旧版本(如果安装过旧版本的话) yum remove docker docker-common docker-selinux docker-engine 安装Docker依赖环 ...

  2. Linux 文件系统的设计

    一 硬盘的最小存储单元是扇区,扇区大小为512B 文件系统将硬盘划分为固定大小的块(block),最常见的块大小为4KB 块是文件系统读写硬盘的最小单位 二 文件系统设计面临的基本问题: 用户怎么找到 ...

  3. 行行AI人才直播第14期:【国内第二波人工智能进入者、连续创业者】土豆《土豆利用GPT成功融资两次的提示词和故事》

    行行AI人才(海南行行智能科技有限公司)是博客园和顺顺智慧共同运营的AI行业人才全生命周期服务平台. 此刻,ChatGPT的火热程度已经无需多言.一时间,追逐大模型成了国内AI行业的标准动作,&quo ...

  4. Django: Token分发

    Django后台token分发 在settings.py中引入 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'd ...

  5. 显示Label标签

    1 from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout 2 from PyQt5.QtCore import ...

  6. K8S | Service服务发现

    服务发现与负载均衡. 一.背景 在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关.注册中心.配置中心等相关服务,可以被集群外部访问: 对于测试「Tes」环境或者 ...

  7. 超详细的webpack之开始体验吧

    webpack是一个前端工程化非常重要静态模块化打包工具,可以帮我们把 less.sass.esmodule.commonjs 等模块依赖处理成浏览器可识别的静态资源. 虽然webpack非常好用,但 ...

  8. Electron-builder打包和自动更新

    Electron-builder打包和自动更新 前言 文本主要讲述如何为 electron 打包出来软件配置安装引导和结合 github 的 release 配置自动更新. electron-buil ...

  9. [Lua][Love Engine] 有效碰撞处理の类别与位掩码 | fixture:setFilterData

    有效的碰撞处理 只用IF判断 假设在一个物理世界,不希望两个同类实体发生碰撞,那么 local begin_contact_callback = function(fixture_a, fixture ...

  10. Unity TextMeshPro 添加中文字体遇见的问题以及解决方案

    前言 按标准官方教程为 Unity TextMeshPro 添加中文字体时出现了各种奇奇怪怪的问题,于是有了这篇随笔. 中文字体解决方案 以下步骤适用于 TextMeshPro 3.0.6. 字符数量 ...