一、温湿度采集传感器(HDC1080)

1.简要概述
HDC1080是一种集成温度传感器的数字湿度传感器,具有出色的测量精度和超低的功耗。其具有14位测量分辨率,相对湿度精度为±2%,温度精度为±0.2°C,工作时平均电流在0.7-1.3uA级。

传感器供电电压为2.7V至5.5V,具有较高的电压兼容性,通过单片机读取数据一般不再需要额外设置电平转换控制芯片,其可以应用在温度监测控制系统、医疗设备、大型家用电器和手测计量表等领域。

TI官网数据手册:HDC1080 具有温度传感器的低功耗、高精度数字湿度传感器 数据表 (Rev. A)

图为传感器功能框图和典型应用,采用3.3V电源供电,数据线(SDA)和时钟线(SCL)可接10kΩ上拉电阻。

HDC1080传感器管脚图:

HDC1080的管脚较为简单,为3*3mm小型器件封装,总共有6个管脚:
SDA,SCL为IIC通信管脚,与单片机IIC接口相连,一般要求接上拉电阻,兼容5V和3.3V;
VDD,GND为电源和地管脚,VCC可接5V或3.3V电源;
NC为闲置管脚,一般悬浮或接地。

2.编程应用
IIC时序图:

HDC1080作为从设备通过IIC总线与主机通信,由于HDC1080的地址固定为1000000(7位地址),IIC总线上不允许搭载多个HDC1080设备。芯片上电后至多15ms传感器便可进入工作状态,SCL时钟频率最小为10KHz,最大为400KHz。

读写传感器寄存器要将所需的寄存器地址值写入指针寄存器(指针值是从地址字节之后传输的第一个字节),即主机在发送从机寻址地址后,再发送需要具体操作的寄存器地址。对HDC1080的每次写入操作都需要指针寄存器的值,寄存器字节首先发送MSB,然后是LSB。HDC固定地址为七位二进制编码(1000000x),最后一位为读写标志位,10000000为写地址,10000001为读地址。

如图为写命令时序图:
1.主机发出起始信号,发送7位从设备地址和写寄存器命令,从机接收后发出应答信号
2.主机发送8位寄存器地址,从机接收并发出应答信号
3.主机发送高八位数据,从机接收并发出应答信号
4.主机发送低八位数据,从机接收并发出应答信号,主机发出停止信号。

根据上述写寄存器时序,可以编写HDC1080写函数:

void HDC1080_WriteReg(u8 Addr,u16 Data)
{unsigned char data[2];data[0] = (uint8_t)((Data& 0xFF00) >> 8);        //高八位数据data[1] = (uint8_t)(Data & 0x00FF);               //低八位数据IIC_Start();   IIC_Send_Byte(0x80);                              //地址为10000000,写寄存器IIC_Wait_Ack();                                //等待从机应答信号IIC_Send_Byte(Addr);                              //写寄存器地址IIC_Wait_Ack();IIC_Send_Byte(data[0]);                          //发送高八位数据IIC_Wait_Ack();IIC_Send_Byte(data[1]);                         //发送低八位数据IIC_Wait_Ack();IIC_Stop();                                     //停止信号
}


如图为读命令时序图:
1.主机发出起始信号,发送7位从设备地址和写寄存器命令,从机接收后发出应答信号
2.主机发送需要读取的寄存器地址,从机接收后返回应答信号
3.主机发出起始信号,发送7位从设备地址和读寄存器命令,从机接收发出应答信号
4.从机发送,主机接收高八位数据并发出应答信号
5.从机发送,主机接收低八位数据并发出应答信号,主机发出停止传输信号

根据上述读寄存器时序,可以编写HDC1080读函数:

u16 HDC1080_ReadReg(u8 Addr)
{     unsigned char  bytes[2];u16 data;                                     //需要接收的16位数(2字节)       IIC_Start();   IIC_Send_Byte(0x80);                            //地址为10000000,写地址IIC_Wait_Ack();  IIC_Send_Byte(Addr);                               //需要读取的寄存器地址IIC_Wait_Ack();IIC_Start();  IIC_Send_Byte(0x81);                           //地址为10000001,读地址IIC_Wait_Ack(); bytes[1]=IIC_Read_Byte(1);                     //读取高八位数据bytes[0]=IIC_Read_Byte(1);                    //读取低八位数据IIC_NAck();   IIC_Stop();     data=(bytes[1]<<8)+bytes[0];return data;                                             //返回16位数据
}

HDC1080测量配置:
使用以下步骤测量温度和湿度,然后检索结果

  1. 在寄存器地址0x02中配置采集参数:
    (a)通过将位[12]设置为1,将采集模式设置为测量温度和湿度。
    (b) 设置所需的温度测量分辨率:–对于14位分辨率,将位[10]设置为0。–对于11位分辨率,将位[10]设置为1。
    (c) 设置所需的湿度测量分辨率:–对于14位分辨率,将位[9:8]设置为00。–对于11位分辨率,将位[9:8]设置为01。–将位[9:8]设置为10,以获得8位分辨率。
  2. 通过执行地址指针设置为0x00的指针写入转换来触发测量。
  3. 根据转换时间等待测量完成。
  4. 读取输出数据:在单个转换中,从寄存器地址0x00读取温度数据,然后从寄存器地址0x01读取湿度数据。

使用以下步骤只测量温度或只测量湿度,然后检索结果

  1. 在寄存器地址0x02中配置采集参数:
    (a)通过将位[12]设置为0,将采集模式设置为只测量温度或只测量湿度。
    (b) 设置所需的温度测量分辨率:–对于14位分辨率,将位[10]设置为0。–对于11位分辨率,将位[10]设置为1。
    (c) 设置所需的湿度测量分辨率:–对于14位分辨率,将位[9:8]设置为00。–对于11位分辨率,将位[9:8]设置为01。–将位[9:8]设置为10,以获得8位分辨率。
  2. 通过执行地址指针设置来触发测量。
    (a)地址指针设置为0x00转换来触发温度测量。
    (b)地址指针设置为0x01转换来触发湿度测量。
  3. 根据转换时间等待测量完成。
  4. 读取输出数据:在单个转换中,从寄存器地址0x00读取温度数据,从寄存器地址0x01读取湿度数据。

HDC寄存器地址:

根据上述HDC测量配置,我们只需要定义;

# define HDC1080_TEMPERATURE 0x00
# define HDC1080_HUMIDITY       0x01
# define HDC1080_CONFIGURATION  0x02

使用到的配置寄存器描述(上述HDC1080测量配置中已有具体描述):

温度寄存器为二进制格式的16位结果寄存器(2个LSB D1和D0始终为0)。采集结果始终为高14位值。结果的准确性与选择的转换时间有关,温度计算公式如下:

湿度寄存器同样为二进制格式的16位结果寄存器(2个LSB D1和D0始终为0)。采集结果始终为高14位值。结果的准确性与选择的转换时间有关,相对湿度计算公式如下:

根据HDC1080测量配置,可写HDC1080读取温湿度函数:

void HDC1080_ReadTempHumidity(void)
{uint16_t temp_data;uint16_t humidity_data;HDC1080_WriteReg(HDC1080_CONFIGURATION,0x3000);                  //写配置寄存器为0x3000,测量温度和湿度,精度均为14位HDC1080_ReadReg(HDC1080_TEMPERATURE);                           //配置指针地址为00,触发温度湿度测量delay_ms(20);                                                //延时20ms,等待转换完成temp_data=HDC1080_ReadReg(HDC1080_TEMPERATURE);               //获取温度数据humidity_data=HDC1080_ReadReg(HDC1080_HUMIDITY);                //获取湿度数据temperature=(float)165*temp_data/65536-40;                     //温度转换humidity=(float)100*humidity_data/65536;                     //湿度转换,这里温湿度定义为全局变量
}

(使用STM F1系列单片机)

HDC1080.h文件可定义为:

#ifndef __HDC1080_H
#define __HDC1080_H
#include "iic.h"
#include "delay.h"//寄存器地址
# define HDC1080_TEMPERATURE    0x00
# define HDC1080_HUMIDITY       0x01
# define HDC1080_CONFIGURATION  0x02extern float temperature,humidity;                  //定义温湿度全局变量void HDC1080_WriteReg(u8 Addr,u16 Data);         //HDC1080写函数
u16 HDC1080_ReadReg(u8 Addr);                       //HDC1080读函数
void HDC1080_ReadTempHumidity(void);                //HDC1080获取温湿度#endif

HDC1080.c文件可定义为:

#include "HDC1080.h"float temperature,humidity;void HDC1080_WriteReg(u8 Addr,u16 Data)
{unsigned char data[2];data[0] = (uint8_t)((Data& 0xFF00) >> 8);        //高八位数据data[1] = (uint8_t)(Data & 0x00FF);               //低八位数据IIC_Start();   IIC_Send_Byte(0x80);                              //地址为10000000,写寄存器IIC_Wait_Ack();                                //等待从机应答信号IIC_Send_Byte(Addr);                              //写寄存器地址IIC_Wait_Ack();IIC_Send_Byte(data[0]);                          //发送高八位数据IIC_Wait_Ack();IIC_Send_Byte(data[1]);                         //发送低八位数据IIC_Wait_Ack();IIC_Stop();                                     //停止信号
}u16 HDC1080_ReadReg(u8 Addr)
{     unsigned char  bytes[2];u16 data;                                     //需要接收的16位数(2字节)       IIC_Start();   IIC_Send_Byte(0x80);                            //地址为10000000,写地址IIC_Wait_Ack();  IIC_Send_Byte(Addr);                               //需要读取的寄存器地址IIC_Wait_Ack();IIC_Start();  IIC_Send_Byte(0x81);                           //地址为10000001,读地址IIC_Wait_Ack(); bytes[1]=IIC_Read_Byte(1);                     //读取高八位数据bytes[0]=IIC_Read_Byte(1);                    //读取低八位数据IIC_NAck();   IIC_Stop();     data=(bytes[1]<<8)+bytes[0];return data;                                             //返回16位数据
}void HDC1080_ReadTempHumidity(void)
{uint16_t temp_data;uint16_t humidity_data;HDC1080_WriteReg(HDC1080_CONFIGURATION,0x3000);                  //写配置寄存器为0x3000,测量温度和湿度,精度均为14位HDC1080_ReadReg(HDC1080_TEMPERATURE);                           //配置指针地址为00,触发温度湿度测量delay_ms(20);                                                //延时20ms,等待转换完成temp_data=HDC1080_ReadReg(HDC1080_TEMPERATURE);               //获取温度数据humidity_data=HDC1080_ReadReg(HDC1080_HUMIDITY);                //获取湿度数据temperature=(float)165*temp_data/65536-40;                     //温度转换humidity=(float)100*humidity_data/65536;                     //湿度转换,这里温湿度定义为全局变量
}

其他更详尽的资料请自行参考数据手册。

参考资料:
1.HDC1080数据手册(文中插图均来自数据手册),代码为本人编写。
2.参看AnthonyYMH的博客可能对理解有所帮助:HDC1080温湿度驱动 IIC I2C STM32

几种数字传感器介绍(一)————温湿度传感器(HDC1080)相关推荐

  1. dht22温湿度传感器特点及使用介绍

    dht22温湿度传感器特点及使用介绍 前言 一.dht22温湿度传感器外观 二.连接图 三.相关参数讲解 1.引脚 2.温湿度测量范围 3.通讯方式(单总线数字信号) 4.优点 5.产品特性(根据官方 ...

  2. dht11温湿度传感器特点及使用介绍

    dht11温湿度传感器特点及使用介绍 前言 一.dht11温湿度传感器外观 二.原理图 三.相关参数讲解 1.引脚 2.温湿度测量范围 3.通讯方式(单总线数字信号) 4.优点 5.产品特性(根据官方 ...

  3. 几种通信方式介绍(二)————总线通信介绍(SPI、I2C、单总线)

    一.SPI总线 SPI (Serial Peripheral Interface,串行外围设备接口)是一种全双工同步串行外设接口总线,主要用于MCU与外围设备的串口通信.它由四根线构成:串行时钟线(S ...

  4. 湿度检测仪输入示数计算机编程,温湿度传感器DHT11驱动程序 - 全文

    温湿度传感器DHT11驱动程序 - 全文 来源:网络整理 作者:2018年01月22日 16:52 [导读] 本文开始介绍了驱动程序的定义与驱动程序的作用,其次介绍了DHT11温湿度传感器特性.引脚说 ...

  5. 【正点原子STM32连载】第四十章 DHT11数字温湿度传感器 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  6. 【正点原子MP157连载】第二十七章 DHT11数字温湿度传感器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  7. 防爆温湿度传感器:保障工业安全环境的关键设备

    在现代工业生产过程中,安全是一项至关重要的考虑因素.特别是在危险和爆炸性环境中,保障人员和设备的安全更是至关重要.为了解决这一问题,防爆温湿度传感器应运而生.本文将详细介绍防爆温湿度传感器的工作原理. ...

  8. 玩转传感器——DHT11温湿度传感器(STM32版)

    玩转传感器--DHT11温湿度传感器(STM32版) 文章目录 玩转传感器--DHT11温湿度传感器(STM32版) 前言 一.接口说明 1 接线图 2 电源引脚 3 串行接口(单线双向) 二.通信过 ...

  9. STM32应用(八)数字温度传感器DS18B20、数字温湿度传感器DHT11(软件模拟I2C)

    文章目录 1.DS18B20 数字温度传感器实验 1.1 DS18B20简介 1.2 硬件与IO口配置 1.3 实物图与接线 1.4 工程配置 1.5 驱动和检测代码编写 1.5.1 ds18b20. ...

最新文章

  1. iOS之使用CoreImage进行人脸识别
  2. 【Python】12、字典的实现
  3. sqlserver之定位死锁(经验分享)
  4. 使用ASP.NET实现Model View Presenter(MVP)
  5. Linux安装配置Java1.8开发环境
  6. Python学习:集合
  7. java string blob_java String类型转换为Blob类型
  8. SharePoint网站集备份与恢复
  9. random_state的值如何选_DC轴流散热风扇如何选择更合理?
  10. 深度学习(二十二)Dropout浅层理解与实现
  11. 大数据学习系列----大数据项目的思考
  12. Windows安装镜像下载
  13. 中高端洪流已至,酒店企业如何趁势突围
  14. 《微习惯:简单到不可能失败的自我管理法则》读书小结
  15. PDF页面删除怎么操作
  16. 微信小程序显示html内容
  17. 永恒之蓝ms17_010漏洞复现
  18. python画风景图_风景侠
  19. 区块链骇客第一讲:重入攻击
  20. 中兴OLT ZXA10 C200 V1.1.3P2T6固件

热门文章

  1. 第六章 图论 8 AcWing 1624. 地铁地图
  2. [转]十年一覺程設夢[完整版]
  3. 2022前端都考察些什么
  4. 记录Java Steam流的一些用法
  5. 「go-micro」学习笔记1——Micro 与 Go-Micro
  6. 如何处理Elixir中的异常
  7. 【单片机】单片机课程设计(测温打铃)附完整代码和电路图
  8. HTML5系列代码:为文字设置深灰色阴影
  9. MySQL_创建表,添加表注释,复制表结构
  10. Java除法结果带小数、进一法的实现