接通信协议之一线协议--DHT11_7 un的博客-CSDN博客

ds18b20简介

一线协议的温度传感器,工作在3~5.5v电压范围,测量温度范围为-55~125℃精度为±0.5℃。ds18b20采用多种封装形式从而设计灵活,方便。与传统的热敏电阻等测温元件相比,他是一种新型的体积小,适用电压宽,接口简单的数字化温度传感器。

每个ds18b20芯片在出厂时,都固化烧录了一个唯一的64位产品序列号在其ROM中,它可以看作是ds19b20的地址序列码。64位ROM的排列是:前8位是产品家族码。接着48位时ds18b20的序列号,最后8位是前面56位的循环冗余检验码(CRC=X8+X5+X4+X1)。ROM作用是使每一个ds18b20都各不相同,这样就实现一个总线挂接多个ds18b20。

ds18b20一线协议

所有的单总线器件要求采用严格的信号时序,以保证数据的完整性。ds18b20共有6种信号类型:复位脉冲、应答信号、写0/1,读0/1。所有的这些信号,除了应答脉冲以外,都是有主机发出同步信号,并且发送所有命令和数据都是字节的地位在前LSB

复位脉冲和应答信号

单总线上所有的通信都是初始化序列开始。主机输出低电平,保持低电平时间至少480us,以产生复位脉冲。接着主机释放总线,4.7k的上拉电阻将单总线拉高,延时15~60us并进入接收模式(Rx)。接着ds18b20拉低总线60~240us,以产生低电平应答脉冲信号,若为低电平,在岩石480us。

写时序

写时序包括写0时序和写1时序。所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,两种时序均起始于主机拉低总线。

写0时序:主机输出低电平,延时60us,然后释放总线,延时2us;

写1时序:主机输出低电平,延时2us,然后释放总线,延时60us;

读时序

单总线器件仅在主机发出读时序,才向主机传输数据,所以,在主机发送读数据指令,必须立刻马上昌盛读时序,以便从主机能够传送数据。所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的回复恢复时间。

当总线控制器把数据线从高电平拉低到低电平时,读时序开始,数据线必须至少保持1us,然后总线被释放。ds18b20通过拉高拉低总线上来传输“1”或“0”。当传输逻辑"0"结束后,总线被释放,通过上拉电阻回到上升沿状态,从ds18b20输出的数据在读时序的下降沿出现15us内有效。因此,总线控制器读时序开始后必须停止把I/O口驱动为低点15us,读取I/O口状态。

DS18B20工作流程

DS18B20工作过程中的协议为:初始化,ROM操作命令,存储器操作命令,处理数据。具体如下

1、初始化

单总线上的所有通信都是以初始化序列开始,Master发出初始化信号后等待从设备的应答信号,已确定从设备是否存在并能正常工作。

2、ROM操作命令

总线主机检测到ds18b20的存在后,便可以发出ROM操作命令之一,这些命令如下表所示。一般我们不关心ROM中的16位产品序列号,通常会发送0xCC跳过ROM的相关操作。

3、存储器操作指令

ROM命令操作完成之后,接下来可以发送相应的高速暂存存储器操作命令,这些命令如下表所示,其中0x44命令将通知DS18B20温度传感器开始采样,而0xBE命令则开始读出DS18B20的采样值。

4、数据处理

DS18B20的高速暂存存储器9个字节组成。当温度转换命令(0x44)发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器前两个字节。

接着单片机可以发送读暂存存储器命令(0xBH)读出存储器里的值,存储器里的9个字节的存储结构如下图所示

如果我们只关心采样温度值的话,则只需要读前两个字节即可,其中Byte[0]为温度值的低字节,而Byte[1]为温度的高字节,这样16位数据的格式如下

其中BIT[3:0]为温度值的小部分,而BIT[10:4]为温度值的整数部分,BIT[15:11]则为符号位,如果0则温度值为正值,如果为1则温度值为负值。

代码实现

创建编写DS18B20的驱动源文件ds18b20.c

#include "tim.h"
#include "gpio.h"
#include "main.h"typedef struct w1_gpio_s
{GPIO_TypeDef        *group;uint16_t             pin;
} w1_gpio_t;static w1_gpio_t   W1Dat =  /* IO pin connected to PA5 */
{.group = GPIOA,.pin   = GPIO_PIN_5,
};#define W1DQ_Input()      \
{   \GPIO_InitTypeDef GPIO_InitStruct = {0}; \GPIO_InitStruct.Pin = W1Dat.pin; \GPIO_InitStruct.Mode = GPIO_MODE_INPUT; \GPIO_InitStruct.Pull = GPIO_PULLUP; \GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; \HAL_GPIO_Init(W1Dat.group, &GPIO_InitStruct); \
}#define W1DQ_Output()      \
{   \GPIO_InitTypeDef GPIO_InitStruct = {0}; \GPIO_InitStruct.Pin = W1Dat.pin; \GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \GPIO_InitStruct.Pull = GPIO_NOPULL; \GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; \HAL_GPIO_Init(W1Dat.group, &GPIO_InitStruct); \
}#define W1DQ_Write(x)  HAL_GPIO_WritePin(W1Dat.group, W1Dat.pin, \(x==1)?GPIO_PIN_SET:GPIO_PIN_RESET)#define W1DQ_Read()     HAL_GPIO_ReadPin(W1Dat.group,  W1Dat.pin)/* Master issues reset pulse and DS18B20s respond with presence pulse */
uint8_t DS18B20_Reset(void)
{uint8_t            rv = 0;uint8_t            retry;/* Setup W1 DQ pin as output and high level*/W1DQ_Output();W1DQ_Write(1);delay_us(2);/* Reset pulse by pulling the DQ pin low >=480us */W1DQ_Write(0);delay_us(480);/* Master releases bus to high. When DS18B20 detects this rising edge, it waits 15µs to 60µs */W1DQ_Write(1);delay_us(60);/* Then DS18B20 transmits a presence pulse by pulling the W1 bus low for 60µs to 240µs */while( W1DQ_Read() && retry <240){retry++;delay_us(1);}if(retry >= 240)rv = 1;delay_us(240);/* Master Rx time must >= 480us */W1DQ_Output();W1DQ_Write(1);delay_us(240);return rv;
}void DS18B20_WriteByte(uint8_t byte)
{uint8_t            i = 0;W1DQ_Output();for(i=0; i<8; i++){/* Write 1: pull low <= 15us, Write 0: pull low 15~60us*/W1DQ_Write(0);delay_us(10);/* DS18B20 bit sent by LSB (lower bit first) */if( byte & 0x1 )W1DQ_Write(1);elseW1DQ_Write(0);/* Write 1/0 slot both >= 60us, hold the level for 60us */delay_us(60);/* Release W1 bus to high */W1DQ_Write(1);delay_us(2);/* Prepare for next bit */byte >>= 1;}
}uint8_t DS18B20_ReadByte(void)
{uint8_t            i = 0;uint8_t            byte = 0;for(i=0; i<8; i++){/* Read time slot is initiated by master pulling the W1 bus* low for minimum of 1µs and then releasing the bus */W1DQ_Output();W1DQ_Write(0);delay_us(2);W1DQ_Write(1);delay_us(2);/* After master initiates read time slot, DS18B20 will begin* transmitting a 1 or 0 on bus */W1DQ_Input();/* DS18B20 bit sent by LSB (lower bit first) */if( W1DQ_Read() ){byte |= 1<<i;}/* Read slot for >= 60us */delay_us(60);/* Release W1 bus to high */W1DQ_Output();W1DQ_Write(1);delay_us(2);}return byte;
}static inline int DS18B20_Start_Convert(void)
{/* Master issues reset pulse and DS18B20s respond with presence pulse */if( 0 != DS18B20_Reset() )return -1;/* Master issues Skip ROM command */DS18B20_WriteByte(0xCC);/* Master issues Convert T command. */DS18B20_WriteByte(0x44);return 0;
}static inline int DS18B20_Start_Read(uint8_t *buf, int bytes)
{/* Master issues reset pulse and DS18B20s respond with presence pulse */if( 0 != DS18B20_Reset() )return -1;/* Master issues Skip ROM command */DS18B20_WriteByte(0xCC);/* Master issues Read Scratchpad command. */DS18B20_WriteByte(0xBE);buf[0] = DS18B20_ReadByte();   /* Temperature LSB */buf[1] = DS18B20_ReadByte();   /* Temperature MSB *//*Don't care followed 7 bytes data */return 0;
}int DS18B20_SampleData(float *temperature)
{uint8_t               byte[2];uint8_t               sign;uint16_t              temp;if( !temperature )return -1;if( 0 != DS18B20_Start_Convert() )return -2;if( 0 != DS18B20_Start_Read(byte, 2) )return -3;/* Temperature byte[0] is LSB, byte[1] is MSB, total 16 bit:* Byte[0]:  bit[3:0]: decimal bits,  bit[7:4]: integer bits* bYTE[1]:  bit[2:0]: integer bits,  bit[7:3]: sign bits*/if( byte[1]> 0x7 ) /* bit[7:3] is 1 */{temp = ~(byte[1]<<8|byte[0]) + 1;  //补码sign=0; //温度为负}else{sign=1;//温度为正temp = byte[1]<<8 | byte[0];}/* byte[1]的低三位和byte[0]的高四位组成温度值的整数部分,* 而byte[0]的低四位为小数精度部分,且精度系数为0.0625 */*temperature = (temp>>4) + (temp&0xF)*0.0625 ;if( !sign ){*temperature = -*temperature;}return 0;
}

写ds18b20的头文件 ds18b20.h

#ifndef INC_DS18B20_H_
#define INC_DS18B20_H_extern int DS18B20_SampleData(float *temperature);#endif /* INC_DS18B20_H_ */

一线协议—ds18b20相关推荐

  1. STM32一线协议-DS18B20温度传感器采样实现

    文章目录 1- DS18B20温度传感器简介 (1)简介 (2)特征 (3)引脚 2- 内部功能结构 (1)64位光刻ROM (2)温度传感器(存放数据形式) (3)配置寄存器 (4)内部存储器 4- ...

  2. DS18B20温度传感器解读单线协议

    单总线协议意思就是一个线就可以完成数据的发送和接收.IIc通信有两根线:SCL时钟线和SDA数据线,通过两根线的完美配合完成读写操作.具体可以参考第一篇文章.SPI通信有四根线:片选线,时钟线,主机输 ...

  3. ds18b20温度传感器驱动编写

    协议 DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输,其工作时序包括:初始化时序.写时序.读时序. 黑色部分表示单片机操作,蓝色部分表示18b20操作,每次主机操 ...

  4. STM32--学习笔记 常用协议总结

    学习笔记–STM32常用协议总结 文章目录 学习笔记--STM32常用协议总结 1. One-Wire:一根数据线 2. I2C协议:时钟线(SCL)和数据线(SDA) 3. UART串口:DB9接口 ...

  5. 树莓派-利用DS18B20检测温度

    一.DS18B20概述与连接 DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点.这里不对DS18B20进行详细描述. 传感器的引脚有三个: ...

  6. 树莓派下DS18B20获取实时温度

    文章目录 1. DS18B20温度传感器 2. DS18B20安装及配置 3.基础代码逻辑分析 3.1 逻辑分析 3.2 阶段代码示例 4. 代码及运行结果 4.1 全部代码 4.1 运行结果 1. ...

  7. 串口协议(1-Wire)解析

    一线协议概述 异步通信 串行 半双工(分时) 电平信号 定义:主机和从机通过一根数据线进行通信,在一条总线上可以挂多个器件. 特点:①没有相应的时钟线,所以是异步通信 ②只有一根总线,所以是串行传输数 ...

  8. LoRaWAN学习心得

    LoRaWAN学习心得 1.学习历程 在前面学习了Linux高级编程的基础上,开始对硬件正式有所交集,以前学习Linux可能只知道某些传感器的数据存放在哪个文件夹下,读取相应的数据就完事,大部分是应用 ...

  9. C51联盟 —— STC89C52RC

    我和我的小伙伴们即将踏上新的旅程,借此机会记录一下学习的点点滴滴 开发板:普中HC6800-ES V2.0 程序作者:C51联盟 开始日期:2018-11-19 结束日期:2019-XX-XX 目录 ...

  10. 基于51单片机的智能温度检测仪

    目录 一. 基于STC89C52单片机的智能温度检测仪设计概述 1. 智能温度检测仪系统功能概述 1.1 整体功能框图 1.2 界面控制和显示功能 1.3 智能降温和报警功能 1.4 温度采集和记录功 ...

最新文章

  1. 文字超过省略_从楚篆到楚玺的文字结构
  2. 火狐浏览器刷新ctrl+F5
  3. 树莓派kail linux安装wine,在ubuntu14.04中安装wine
  4. 深入理解原型模式 ——通过复制生成实例
  5. python正则表达式处理文本内容_Python处理txt文本
  6. 麦子学院python百度云_麦子学院python
  7. 详解SourceOffsite的安装配置解决VSS共享数据库目录的问题
  8. 动手学深度学习讲义批量下载
  9. 构建Spring Cloud项目找不到Application类
  10. 学习状态通道,Part-1:支付通道
  11. 鸿蒙系统和安卓哪个更流畅,鸿蒙系统比安卓系统更流畅吗?
  12. 首富软件测试工资,测试你成为富豪 测试你天生是什么命
  13. hadoop 集群启动 ERROR: Cannot write datanode pid /tmp/hadoop-user-datanode.pid. 问题的解决
  14. layui数据表格合计行
  15. Paper reading (十八):Machine learning applications in genetics and genomics
  16. AD7190之STM32程序
  17. 读书笔记《即兴演讲》
  18. 洛谷P1554 梦中的统计
  19. 基于OCC+OSG的CAD之GMSH与Netgen网格连贯性测试
  20. 软件著作权多久能申请下来

热门文章

  1. Java 汉字获取拼音或首字母工具类
  2. 海康大华摄像头GB/T28181接入国标视频平台如何选择主码流还是子码流
  3. 南京大学计算机系统实验报告,南京大学 计算机系统基础 课程实验 2018(PA3)
  4. 好消息:GAX/GAT February 2008 Final Release
  5. 知网caj转pdf格式的方法
  6. Excel提示:您的组织策略阻止我们为您完成此操作
  7. uniapp ucharts统计图表
  8. c语言 代码自动补全,codeblocks 设置代码自动补全
  9. 自动回复html模板邮件,outlook邮件自动回复设置
  10. 语音计算机在线算使用方法,计算器在线计算