STM32驱动HDC1080温湿度转化


一、HDC1080 简介

HDC1080是一款集成温度、湿度的数字传感器,以极低的功耗提供出色的测量精度,最高14Bit测量分辨率,相对湿度精度±2%,温度精度±0.2°C,在高湿度下具有优异的稳定性。传感器供电电压为2.7V至5.5V,具有较高的电压兼容性,是一种低成本,低功耗的替代竞争解决方案,广泛应用于常见温湿度测量应用场景。

二、引脚功能

在这里插入图片描述

在这里插入图片描述
上图的模块已自带上拉电阻,SDA SCL 引脚可直接到 IO 口

三、IIC时序

要访问HDC1080上的特定寄存器,将所需的寄存器地址值写入指针寄存器。该指针值是在从地址字节之后传输的第一个R/W位低的字节。对HDC1080的每个写操作都需要指针寄存器的值(参见图10)。
当从HDC1080读取时,写操作存储在指针中的最后一个值用于确定读操作访问哪个寄存器。要为读操作更改指针寄存器,必须向指针寄存器写入一个新值。这个事务是通过发出R/W位低的从地址字节,然后是指针字节来完成的。不需要额外的数据(参见图11)。
在这里插入图片描述
在这里插入图片描述

四、寄存器说明

4.1 寄存器地址映射

主要注意 0x00(温度数据) 0x01(湿度数据) 0x02(传感器配置),其余地址保存的ID信息可以不看
在这里插入图片描述
0x03到0xFA的寄存器地址保留,不能写入。HDC1080有一个8位指针,用于指定要访问的数据寄存器。指针标识哪个数据寄存器应响应在两线总线上执行的读写命令。每次写入命令时都会设置此寄存器。在执行读取命令之前,必须发出写入命令以设置指针以正确值。

4.2 温度寄存器(0x00)

温度寄存器是二进制格式的16位结果寄存器(2个LSBs D1和D0始终为0),采集结果始终为14位值。结果的准确性与所选择的转换时间有关。从输出数据可以计算出温度:

在这里插入图片描述

4.3 湿度寄存器(0x01)

湿度寄存器为二进制格式的16位结果寄存器(2个LSBs D1和D0始终为0),采集结果始终为14位值,而精度与所选择的转换时间有关。从输出数据可以计算出湿度:
在这里插入图片描述

4.4 配置寄存器(0x02)

字段Bits说明
RST[15]软件重置位。0:正常操作,此位自动清除,1:软件复位
Reserved[14]0:预留,必须为0
HEAT[13]加热功能。0:禁用加热,1:启用加热
MODE[12]采样模式。0:温度或者湿度,1:温湿度依次采样,温度优先
BTST[11]电池状态。0:电压>2.8V,1:电压<2.8V
TRES[10]温度测量分辨率。0:14 bit,1:11 bit
HRES[9:8]湿度测量分辨率。00:14 bit,01:11 bit,10:8 bit,
Reserved[7:0]0:预留,必须为0

五、驱动程序

hdc1080.c

#include "hdc1080.h"
#include "IIC.h"            
#include "delay.h"
//**************************************
//向IIC设备写入一个字节数据
//**************************************
u8 Single_WriteI2C_byte(u8 Slave_Address,u8 REG_Address ,u8 data,u8 data1)
{
	 if(I2C_Start()==0)  //起始信号
	 {I2C_Stop(); return RESET;}           

     I2C_SendByte(Slave_Address);   //发送设备地址+写信号
 	 if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
   
	 I2C_SendByte(REG_Address);    //内部寄存器地址,
 	 if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
   
	 I2C_SendByte(data);       //内部寄存器数据,
	 I2C_WaitAck();
	 I2C_SendByte(data1); 
	 if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
		
	 I2C_Stop();   //发送停止信号
	 return SET;
}
//**************************************
//从IIC设备读取一个字节数据
//**************************************
u8 Single_ReadI2C(u8 Slave_Address,u8 REG_Address,u8 *REG_data,u8 length)
{
 if(I2C_Start()==0)  //起始信号
	{I2C_Stop(); return RESET;}          
	 
	I2C_SendByte(Slave_Address);    //发送设备地址+写信号
 	if(!I2C_WaitAck()){I2C_Stop(); return RESET;} 
	
	I2C_SendByte(REG_Address);     //发送存储单元地址
 	if(!I2C_WaitAck()){I2C_Stop(); return RESET;} 
	

	delay_ms(50);		 //延时一段时间,等待转换完成
	if(I2C_Start()==0)  //起始信号
	{I2C_Stop(); return RESET;}            

	I2C_SendByte(Slave_Address+1);  //发送设备地址+读信号
 	if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
	
	while(length--)
	{
		*REG_data++=I2C_RecvByte();       //读出寄存器数据
		I2C_SendACK(0);               //应答
	}
	REG_data = 0;    //防止越界
	
	I2C_SendACK(1);     //发送停止传输信号
	I2C_Stop();                    //停止信号
	return SET;
}
void hdc_Init(void)
{
	Single_WriteI2C_byte(0x80,0x02,0x10,0x00); //禁用加热器 温湿度测量 精度都为14位
}
void hdc_Read(u8 *data)
{
	Single_ReadI2C(0x80,0x00,data,4);//读取温湿度数据
}

main.c

/********************************************************************
STM32------HDC1080
PB6---SCL
PB7---SDA
STM32------USB-TTL
PA9---RX
PA10---TX
波特率115200
********************************************************************/
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "IIC.h"
#include "math.h"
#include "hdc1080.h"

u8 BUF[8];
float Tempreture,Humidity;

int main()
{

	SystemInit();//系统时钟等初始化
	delay_init();//延时初始化
	NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);//串口初始化
	I2C_GPIO_Config();
	delay_ms(100);
	hdc_Init();//初始化配置
	while(1)
	{
		hdc_Read(BUF);//开启测量 读出数据
		Tempreture=(BUF[0]*256+BUF[1])/65536.0*165.0-40.0;//温湿度计算公式上文已经给出
		Humidity=(BUF[2]*256+BUF[3])/65536.0;
		printf("Humidity=%.1f   Tempreture=%.1f\r\n",Humidity,Tempreture);
		delay_ms(400);
	}
}

六、实验现象

在这里插入图片描述
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值