(一)初始化

初始化时序:

  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构建可动态启动的FreeSWITCH实例

    操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Docker版本:23.0.6   使用docker打包FreeSWITCH可以极大简化部署环节,但针对高可用场景的 ...

  2. Spring的依赖注入方式(set及constructor)

    Bean的依赖注入方式: set方法注入 P命名空间注入本质也是set方法注入,但比起上面的set方法进行注入更加方便,主要体现在配置文件中,如下: 首先,引入P命名空间: xmlns:p=" ...

  3. upload-libs通关攻略

    pass01 第一关是一个前端验证,只要把Javascript禁止再上传就可以绕过了. 上传成功,到上传的地址查看结果如下: pass-02 这是一个MIME绕过,用bp抓包后修改文件类型即可将下面这 ...

  4. PHPstudy+Xdebug动态调试代码过程中遇到一分钟就超时问题的解决办法

    环境是PhpStorm+Xdebug+WAMP 在实际调试的过程中 碰到了调试还没走完就自动结束的情况 很尴尬 查阅了相关文档资料 找到了解决方法 首先在php.ini中进行修改 我的配置文件地址在 ...

  5. 为什么大于 $3$ 的素数可以表示为 $6n\pm1$?

    我们有一个素数 \(p\),都能表示为 \(6n \pm 1\). 为什么呢? 我们设 \(p = 6n \pm k\),\(k\) 可以是 \(0, 1, 2, 3, 4, 5\). 如果 \(k\ ...

  6. chrome浏览器插件react devtools、redux devtools,无需安装、解压即可用

    react devtools用于调试react代码,可以查看到props.state的值,以及定义的hooks,而redux devtools可以追踪到action的派发.store的变化,两个都是r ...

  7. BurpSuite设置上游代理访问内网

    转载原文 原理知道了后,开始! 拿到B的shell后,添加路由 拿到B的shell后,开启sock4 在D主机上设置好 最后成功抓到包

  8. Unity 游戏开发、01 基础知识大全、简单功能脚本实现

    2.3 窗口布局 Unity默认窗口布局 Hierarchy 层级窗口 Scene 场景窗口,3D视图窗口 Game 游戏播放窗口 Inspector 检查器窗口,属性窗口 Project 项目窗口 ...

  9. 【krpano】淘宝buy+案例

    这是一个类似淘宝buy+的案例,是基于krpano全景开发工具二次开发的全景视频.WebVR.360°环物.全景视频热点添加于一身的综合性案例.现在将案例上传网站供krpano技术人员和爱好者大家共同 ...

  10. 7-MySQL函数

    1.分组group by 在MySQL中,GROUP BY的意思是"分组查询",它可以根据一个或多个字段对查询结果进行分组. GROUP BY的作用是通过一定的规则将一个数据集划分 ...