STM32F407ZGT6驱动SHT20获取温湿度

news/2024/10/18 13:47:04 标签: stm32, 嵌入式硬件, 单片机, SHT20, 温湿度传感器

目录

  • 一、SHT20 温湿度传感器
    • 1、SHT20 的 I2C 地址
    • 2、SHT20 的指令集
    • 3、启动传感器
    • 4、主机/非主机模式
      • ①、主机模式下通信时序
      • ②、非主机模式下通信时序
    • 5、软复位
    • 6、用户寄存器(User Register)
    • 7、SHT20 分辨率
    • 8、CRC 校验和
    • 9、原始数据转换
  • 二、硬件设计
    • 1、接线说明
    • 2、原理图设计
  • 三、程序设计
    • 1、读取温湿度数据的步骤
    • 2、sht2x.h
    • 3、sht2.c
    • 4、main.c
  • 四、功能展示
    • 1、串口显示
    • 2、CRC 校验

SHT20__1">一、SHT20 温湿度传感器

  • SHT20 采用第 4C 代 CMOSens® 芯片,除了包含一个电容式湿度传感器、一个带隙温度传感器外,该芯片还包含放大器、A/D 转换器、OTP 存储器和数字处理单元。
  • 每一个传感器都经过单独校准和测试。传感器表面有印制的批号。
  • SHT20 通过 I2C 总线与主控制器进行通信,支持低功耗模式,适用于电池供电设备。
  • SHT20 默认测量分辨率为 14bit(温度)/12bit(湿度)。可以通过命令将测量分辨率降低至 12/8bit、11/11bit 或 13/10bit。
  • 传感器带有 CRC 校验和,有助于提高通信的可靠性。

SHT20___I2C__7">1、SHT20 的 I2C 地址

  • I2C 标头由 7 位 I2C 设备地址 ‘1000’000’ 和一个 SDA 方向位(读 R:‘1’,写 W:‘0’)组成。
  • 8 位写地址:‘1000’0000’ (0x80);8 位读地址:‘1000’0001’ (0x81)。

SHT20__10">2、SHT20 的指令集

在这里插入图片描述

命令说明代码(二进制)代码(十六进制)
Trigger T measurement主机模式下触发温度测量1110’00110xE3
Trigger RH measurement主机模式下触发湿度测量1110’01010xE5
Trigger T measurement非主机模式下触发温度测量1111’00110xF3
Trigger RH measurement非主机模式下触发湿度测量1111’01010xF5
Trigger RH measurement写用户寄存器1110’01100xE6
Write user register读用户寄存器1110’01110xE7
Soft reset软复位1111’11100xFE

3、启动传感器

  • 上电后,传感器最多需要 15ms(SCL 为高电平)才能进入空闲状态,即准备好接受来自主设备(MCU)的命令。
  • 启动期间的最大电流消耗为 350µA。
  • 只要传感器上电但不进行测量或通信,它就会自动处于空闲状态(睡眠模式)。

4、主机/非主机模式

  • 支持两种不同的操作模式与 SHT20 进行通信:主机模式或非主机模式。
  • 主机模式下,SHT2x 在测量时拉低 SCL 线以强制主设备进入等待状态(由传感器进行控制)。
    传感器通过释放 SCL 线,指示内部处理已终止并且可以继续传输。
  • 非主机模式下,SCL 线在传感器处理测量时保持打开状态,允许主设备(MCU)在传感器测量时处理总线上的其他 I2C 通信任务。
  • 对于这两种模式,由于测量的最大分辨率为 14 位,因此最后两个最低有效位(LSB,位 43 和 44)用于传输状态信息。
    两个 LSB 中的位 1 表示测量类型(“0”:温度,“1”:湿度)。位 0 目前未分配。
  • 每个传输时序都以起始条件(S)开始,以停止条件(P)结束。
    起始条件(S):I2C 起始信号;停止条件(P):I2C 停止信号。
  • 注意:I2C 通信允许重复启动条件(S),而无需使用停止条件(P)关闭先前的序列 - 比较图 15、16 和 18。
    不过,任何具有相邻启动条件的序列都可以用停止条件来关闭。
  • 灰色块由 SHT20 进行控制。

①、主机模式下通信时序

在这里插入图片描述

②、非主机模式下通信时序

在这里插入图片描述

5、软复位

  • 此命令用在无需关闭后再打开电源的情况下,重新启动传感器系统。
  • 收到此命令后,传感器系统将重新初始化,并根据默认设置开始运行(用户寄存器中的加热器位除外)。
  • 软复位所需时间不到 15ms。

在这里插入图片描述

6、用户寄存器(User Register)

  • 注意:保留位不得更改。因此,对于任何写入用户寄存器的操作,必须先读取保留位的默认值。

SHT20__57">7、SHT20 分辨率

  • 测量的最大持续时间取决于所选的测量类型和分辨率。MCU 通信时应选择最大值。

在这里插入图片描述

8、CRC 校验和

  • SHT20 提供 CRC-8 校验和用于错误检测。使用的多项式为 x8 + x5 + x4 +1。

9、原始数据转换

  • SHT20 返回的温湿度数据为 16 位原始数据,需要经过线性转换才能得到实际的温湿度值。
  • 对于温度,公式为:T = -46.85 + 175.72 * (温度数据 / 65536)
  • 对于湿度,公式为:RH = -6 + 125 * (湿度数据 / 65536)

二、硬件设计

1、接线说明

SHT20STM32F407ZGT6引脚定义
GGND电源负极 GND
V3.3V电源正极 VCC
SCLB9IIC 接口 SDA 数据引脚
SDAB8IIC 接口 SCL 时钟引脚

2、原理图设计

  • 芯片焊盘(中心焊盘)内部连接到 VSS。
  • NC 焊盘必须保持浮动(悬空,不连接)。
  • 电源引脚(VDD、VSS)必须使用 100nF 电容去耦。
  • 为避免信号争用,微控制器单元(MCU)必须仅将 SDA 和 SCL 驱动为低电平。需要外部上拉电阻(例如 10kΩ)来将信号拉高。
  • 不要使用热风枪对着芯片表面进行焊接!!!

三、程序设计

1、读取温湿度数据的步骤

1、初始化 SHT20 传感器:通过软件 I2C 发送软复位命令,确保传感器进入初始状态。
2、发送读取命令:发送温度读取或湿度读取命令(0xE3、0xE5 或 0xF3、0xF5)。
3、读取数据:接收传感器返回的 16 位数据并进行 CRC 校验。
4、数据转换:将 16 位数据通过公式转换为实际的温度和湿度值。
5、数据显示:可以通过串口或 OLED 屏幕显示实际的温湿度值。

2、sht2x.h

#ifndef __SHT2X_H
#define __SHT2X_H

#include "./SYSTEM/sys/sys.h"


/******************************************************************************************/
/* 传感器IIC地址(Sensor IIC address) */

typedef enum{
	SHT20_Address_Write					= 0x80,			/* 传感器I2C地址 + 写入位 */
	SHT20_Address_Read					= 0x81			/* 传感器I2C地址 + 读取位 */
}thSHT2xIICAddress;

/******************************************************************************************/

/******************************************************************************************/
/* 传感器命令集(Sensor Command set) */

typedef enum{
	SHT2x_Trig_T_Measurement_HM	        = 0xE3,			/* 触发温度测量命令,保持主机模式 */
	SHT2x_Trig_RH_Measurement_HM	    = 0xE5,			/* 触发湿度测量命令,保持主机模式 */
	SHT2x_Trig_T_Measurement_POLL	    = 0xF3,			/* 触发温度测量命令,不保持主机模式 */
	SHT2x_Trig_RH_Measurement_POLL		= 0xF5,			/* 触发湿度测量命令,不保持主机模式 */
	SHT2x_Write_User_Reg			    = 0xE6,			/* 写用户寄存器命令 */
	SHT2x_Read_User_Reg				    = 0xE7,			/* 读用户寄存器命令 */
	SHT2x_Soft_Reset				    = 0xFE			/* 软复位命令 */
}thSHT2xCommand;

/******************************************************************************************/

/******************************************************************************************/
/* 传感器分辨率(Sensor Resolution) */

typedef enum{
	SHT2x_RES_12_14BIT			        = 0x00,			/* RH=12bit, T=14bit */
	SHT2x_RES_8_12BIT				    = 0x01,			/* RH= 8bit, T=12bit */
	SHT2x_RES_10_13BIT				    = 0x80,			/* RH=10bit, T=13bit */
	SHT2x_RES_11_11BIT				    = 0x81,			/* RH=11bit, T=11bit */
	SHT2x_RES_MASK					    = 0x81			/* 用户寄存器中分辨率位(7,0)的掩码 */
}thSHT2xResolution;

/******************************************************************************************/

/******************************************************************************************/
/* 传感器电池电量耗尽(Sensor End of battery) */

typedef enum{
	SHT2x_EOB_ON					    = 0x40,			/* 电池电量耗尽(End of battery) */
	SHT2x_EOB_MASK					    = 0x40			/* 用户寄存器中EOB位(6)的掩码 */
}thSHT2xEOB;

/******************************************************************************************/

/******************************************************************************************/
/* 传感器片上加热器(Sensor On-chip heater) */

typedef enum{
	SHT2x_HEATER_ON					    = 0x04,			/* 开启片上加热器 */
	SHT2x_HEATER_OFF				    = 0x00,			/* 关闭片上加热器 */
	SHT2x_HEATER_MASK				    = 0x04			/* 用户寄存器中片上加热器位(2)的掩码 */
}thSHT2xHeater;

/******************************************************************************************/

/******************************************************************************************/
/* 传感器OTP重载(OTP Reload) */

typedef enum{
	SHT2x_OTP_Reload_ON				    = 0x02,			/*  */
	SHT2x_OTP_Reload_OFF			    = 0x00,			/*  */
	SHT2x_OTP_Reload_MASK			    = 0x02			/* 用户寄存器中的掩码 */
}thSHT2xOTP;

/******************************************************************************************/

/******************************************************************************************/
/* 函数声明(Function Declaration) */

void SHT2x_Init_SoftIIC(void);                                                      /* 初始化SHT2x */

uint8_t SHT2x_CheckCRC(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum);       /* CRC-8 校验 */

/* 读取/写入用户寄存器 */
uint8_t SHT2x_ReadReg_Data(uint8_t read_address, uint8_t reg);                      /* 读取SHT2x单个寄存器的数据 */
void SHT2x_WriteReg_Data(uint8_t write_address, uint8_t reg, uint8_t data);         /* 向SHT2x单个寄存器写入数据 */
uint8_t SHT2x_Read_UserReg_Data(uint8_t read_address);                              /* 读取SHT2x用户寄存器的数据 */
void SHT2x_Write_UserReg_Data(uint8_t read_address, uint8_t data);                  /* 向SHT2x用户寄存器写入数据 */

void SHT2x_SoftReset(uint8_t write_address);                                        /* 重启传感器 */

/* 在保持/不保持主机模式下读取温湿度 */
uint16_t SHT2x_Measure_HW(uint8_t read_address, uint8_t reg);                       /* 在保持主模式下读取温湿度命令 */
uint16_t SHT2x_Measure_POLL(uint8_t read_address, uint8_t reg);                     /* 在无保持主模式下读取温湿度命令 */
uint16_t SHT2x_Measure_Temp_HW(void);                                               /* 在保持主模式下读取温度 */
uint16_t SHT2x_Measure_Humidity_HW(void);                                           /* 在保持主模式下读取温度湿度 */
uint16_t SHT2x_Measure_Temp_POLL(void);                                             /* 在无保持主模式下读取温度 */
uint16_t SHT2x_Measure_Humidity_POLL(void);                                         /* 在无保持主模式下读取温度湿度 */
float SHT2x_Calclates_Temperature(uint16_t temp);                                   /* 计算实际温度值 */
float SHT2x_Calclates_Humidity(uint16_t temp);                                      /* 计算实际湿度值 */

/******************************************************************************************/

#endif  /* __SHT2X_H */

3、sht2.c

#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"

#include "./BSP/SoftIIC/softiic.h"
#include "./BSP/SHT2x/sht2x.h"

/* CRC-8校验和 */
const uint16_t SHT2x_POLYNOMIAL         = 0x131;        /* 多项式:P(x)=x^8+x^5+x^4+1 = 100110001 */

/**
 * @brief       初始化SHT2x
 * @param       无
 * @retval      无
 */
void SHT2x_Init_SoftIIC(void)
{
	SoftIIC_Init();                             /* 初始化软件IIC接口 */
    
    SHT2x_SoftReset(SHT20_Address_Write);       /* 重启传感器 */
    delay_ms(15);                               /* 等待传感器重新启动完成 */
}

/**
 * @brief       CRC-8 校验
 * @param       data[]         输入数据数组,用于计算CRC的原始数据
 * @param       nbrOfBytes     输入数据的字节数
 * @param       checksum       传感器返回的校验和,用于与计算得出的CRC进行比较
 * @retval      0              CRC校验成功
 * @retval      1              CRC校验失败
 */
uint8_t SHT2x_CheckCRC(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum)
{
    uint8_t byteCtr;
    uint8_t bit;
    uint8_t crc = 0;                                	/* 用于存储在计算过程中的CRC值 */
    
    for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
    {
        /* 将数据引入到CRC的计算中,是CRC校验的开始 */
        crc ^= (data[byteCtr]);                         /* 将输入的data与crc进行异或操作;0^x = x,即0异或任何数都等于任何数 */
        
        for (bit = 8; bit > 0; --bit)
        { 
            if (crc & 0x80)                             /* 检查crc的最高位(第8位)是否为1(即crc&0x80判断结果为真) */
            {
                crc = (crc << 1) ^ SHT2x_POLYNOMIAL;    /* 如果为1,则将crc左移一位,并与SHT2x_POLYNOMIAL(一个多项式常量)进行异或操作 */
            }
            else crc = (crc << 1);                      /* 如果crc的最高位为0,则只将crc左移一位,不进行异或操作;0^x = x,即0异或任何数都等于任何数 */
        }
    }
    /* 比较计算出来的crc和传入的checksum */
    if (crc != checksum) return 1;                      /* 如果crc与checksum不相等,说明数据有错误,返回1 */             
    else return 0;                                      /* 否则返回0,表示校验成功 */
//    return crc == checksum ? 0 : 1;
}

/**
 * @brief       读取SHT2x单个寄存器的数据
 * @param       read_address:SHT2x执行读操作时的8位IIC地址
 * @param       reg:要读取的寄存器地址
 * @retval      data:读取到的寄存器数据
 */
uint8_t SHT2x_ReadReg_Data(uint8_t read_address, uint8_t reg)
{
    uint8_t error = 0;                              /* 用于存储错误代码 */
    uint8_t checksum;                               /* 用于存储校验和 */
    uint8_t data[] = {0};                         	/* 用于存储读取到的寄存器数据 */
    
    SoftIIC_Start();                                /* 产生软件IIC起始信号 */
    
    SoftIIC_Send_Byte(read_address & ~0x01);        /* 发送设备地址和写命令(最低位为0表示写) */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    SoftIIC_Send_Byte(reg);                         /* 发送要读取的寄存器地址 */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    
    SoftIIC_Start();                                /* 再次产生软件IIC起始信号 */
    
    SoftIIC_Send_Byte(read_address);                /* 发送设备地址和读命令(最低位为1表示读) */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    
    data[0] = SoftIIC_Read_Byte(1);                 /* 读取一个字节的数据,并发送ACK(表示再次读取数据) */
    printf("SHT2x_ReadReg_Data data:%X\r\n", data[0]);
    checksum = SoftIIC_Read_Byte(0);                /* 读取一个字节的数据,并发送NACK(表示不再读取数据) */
    printf("SHT2x_ReadReg_Data checksum:%X\r\n", checksum);
    error |= SHT2x_CheckCRC(data, 1, checksum);
    printf("SHT2x_ReadReg_Data error:%X\r\n", error);
    
    SoftIIC_Stop();                                 /* 产生软件IIC停止信号 */
    
    return data[0];                                 /* 返回读取到的寄存器数据 */
}

/**
 * @brief       向SHT2x单个寄存器写入数据
 * @param       write_address:SHT2x执行写操作时的8位IIC地址
 * @param       reg:要写入的寄存器地址
 * @param       data:要写入的数据
 * @retval      无
 */
void SHT2x_WriteReg_Data(uint8_t write_address, uint8_t reg, uint8_t data)
{
    SoftIIC_Start();
    
    SoftIIC_Send_Byte(write_address);       /* 发送设备地址和写命令(最低位为0表示写) */
    SoftIIC_Wait_Ack();                     /* 等待ACK */
    SoftIIC_Send_Byte(reg);                 /* 发送要写入的寄存器地址 */
    SoftIIC_Wait_Ack();                     /* 等待ACK */
    SoftIIC_Send_Byte(data);                /* 发送要写入的数据 */
    SoftIIC_Wait_Ack();                     /* 等待ACK */
    
    SoftIIC_Stop();
}

/**
 * @brief       读取SHT2x用户寄存器的数据
 * @param       read_address:SHT2x执行读操作时的8位IIC地址
 * @retval      data:读取到的寄存器数据
 */
uint8_t SHT2x_Read_UserReg_Data(uint8_t read_address)
{
    uint8_t data;
    
    data = SHT2x_ReadReg_Data(read_address, SHT2x_Read_User_Reg);
    printf("SHT2x_UserReg:%X\r\n", data);
    
    return data;
}

/**
 * @brief       向SHT2x用户寄存器写入数据
 * @param       write_address:SHT2x执行写操作时的8位IIC地址
 * @param       data:要写入的数据
 */
void SHT2x_Write_UserReg_Data(uint8_t write_address, uint8_t data)
{
    SHT2x_WriteReg_Data(write_address, SHT2x_Write_User_Reg, data);
}

/**
 * @brief       重启传感器
 * @param       write_address:SHT2x执行写操作时的8位IIC地址
 * @retval      无
 */
void SHT2x_SoftReset(uint8_t write_address)
{
    SoftIIC_Start();
    
    SoftIIC_Send_Byte(write_address);           /* 发送设备地址和写命令(最低位为0表示写) */
    SoftIIC_Wait_Ack();                         /* 等待ACK */
    SoftIIC_Send_Byte(SHT2x_Soft_Reset);        /* 发送要写入的寄存器地址 */
    SoftIIC_Wait_Ack();                         /* 等待ACK */
    
    SoftIIC_Stop();
}

/**
 * @brief       在保持主模式下读取温湿度命令
 * @param       read_address:SHT2x执行读操作时的8位IIC地址
 * @param       reg:要写入的寄存器地址
 * @retval      data16:读取到的寄存器数据
 */
uint16_t SHT2x_Measure_HW(uint8_t read_address, uint8_t reg)
{
    uint8_t data8[2];
    uint8_t checksum;
    uint16_t data16;
    
    SoftIIC_Start();
    
    SoftIIC_Send_Byte(read_address & ~0x01);        /* 发送设备地址和写命令(最低位为0表示写) */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    SoftIIC_Send_Byte(reg);                         /* 发送要读取的寄存器地址 */
    SoftIIC_Wait_Ack();                             /* 等待ACK */

    SoftIIC_Start();
    
    SoftIIC_Send_Byte(read_address);                /* 发送设备地址和读命令(最低位为1表示读) */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    
    delay_ms(85);
    
    data8[0] = SoftIIC_Read_Byte(1);            
    data8[1] = SoftIIC_Read_Byte(1);            
    checksum = SoftIIC_Read_Byte(0);
    
    SoftIIC_Stop();
    
    if(SHT2x_CheckCRC(data8, 2, checksum) != 0)
    {
        printf("SHT2x_Measure_HW error:1\r\n");
        return 1;
    }
    
    data16 = (data8[0] << 8) | data8[1];
    printf("SHT2x_Measure_HW data:%X\r\n", data16);
    
    return data16;
}

/**
 * @brief       在无保持主模式下读取温湿度命令
 * @param       read_address:SHT2x执行读操作时的8位IIC地址
 * @param       reg:要写入的寄存器地址
 * @retval      data16:读取到的寄存器数据
 */
uint16_t SHT2x_Measure_POLL(uint8_t read_address, uint8_t reg)
{
    uint8_t i;
    uint8_t data8[2];
    uint8_t checksum;
    uint16_t data16;
    
    SoftIIC_Start();
    
    SoftIIC_Send_Byte(read_address & ~0x01);        /* 发送设备地址和写命令(最低位为0表示写) */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    SoftIIC_Send_Byte(reg);                         /* 发送要读取的寄存器地址 */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    
    delay_ms(1);
    SoftIIC_Stop();
    
    do
    {
        delay_ms(10);
        SoftIIC_Start();
        SoftIIC_Send_Byte(read_address);                /* 发送设备地址和读命令(最低位为1表示读) */
        if(i++ >= 20)   break;
    }while(SoftIIC_Wait_Ack() == 1);
    
    data8[0] = SoftIIC_Read_Byte(1);            
    data8[1] = SoftIIC_Read_Byte(1);            
    checksum = SoftIIC_Read_Byte(0);
    
    SoftIIC_Stop();
    
    if(SHT2x_CheckCRC(data8, 2, checksum) != 0)
    {
        printf("SHT2x_Measure_POLL error:1\r\n");
        return 1;
    }
    
    data16 = (data8[0] << 8) | data8[1];
    printf("SHT2x_Measure_POLL data:%X\r\n", data16);
    
    return data16;
}

/**
 * @brief       在保持主模式下读取温度
 * @param       无
 * @retval      temp_hw:读取到的寄存器数据
 */
uint16_t SHT2x_Measure_Temp_HW(void)
{
    uint16_t temp_hw;
    
    temp_hw = SHT2x_Measure_HW(SHT20_Address_Read, SHT2x_Trig_T_Measurement_HM);
    
    return temp_hw;
}

/**
 * @brief       在保持主模式下读取温度湿度
 * @param       无
 * @retval      humidity_hw:读取到的寄存器数据
 */
uint16_t SHT2x_Measure_Humidity_HW(void)
{
    uint16_t humidity_hw;
    
    humidity_hw = SHT2x_Measure_HW(SHT20_Address_Read, SHT2x_Trig_RH_Measurement_HM);
    
    return humidity_hw;
}

/**
 * @brief       在无保持主模式下读取温度
 * @param       无
 * @retval      temp_poll:读取到的寄存器数据
 */
uint16_t SHT2x_Measure_Temp_POLL(void)
{
    uint16_t temp_poll;
    
    temp_poll = SHT2x_Measure_POLL(SHT20_Address_Read, SHT2x_Trig_T_Measurement_POLL);
    
    return temp_poll;
}

/**
 * @brief       在无保持主模式下读取温度湿度
 * @param       无
 * @retval      humidity_poll:读取到的寄存器数据
 */
uint16_t SHT2x_Measure_Humidity_POLL(void)
{
    uint16_t humidity_poll;
    
    humidity_poll = SHT2x_Measure_POLL(SHT20_Address_Read, SHT2x_Trig_RH_Measurement_POLL);
    
    return humidity_poll;
}

/**
 * @brief       计算实际温度值
 * @param       无
 * @retval      humidity_poll:读取到的寄存器数据
 */
float SHT2x_Calclates_Temperature(uint16_t temp)
{
    double temperature;
    
    temp &= ~0x0003;  // 去除状态位
    temperature = -46.85f + 175.72f * (double)temp / 65536.0f;
    printf("temperature:%.2f\r\n", temperature);
    
    return temperature;
}

/**
 * @brief       计算实际湿度值
 * @param       无
 * @retval      humidity_poll:读取到的寄存器数据
 */
float SHT2x_Calclates_Humidity(uint16_t humi)
{
    float humidity;
    humi &= ~0x0003;  // 去除状态位
    humidity = -6.0f + 125.0f * (float)humi / 65536.0f;
    printf("humidity:%.2f\r\n", (double)humidity);
    
    return humidity;
}

4、main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"

#include "./BSP/SHT2x/sht2x.h"


int main(void)
{
    HAL_Init();                                 /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7);         /* 设置时钟,168Mhz */
    delay_init(168);                            /* 延时初始化 */
    usart_init(115200);                         /* 串口初始化为115200 */
    
    SHT2x_Init_SoftIIC();
    
    while(1)
    {
        uint8_t Initial_UserReg_Data;
        Initial_UserReg_Data = SHT2x_Read_UserReg_Data(SHT20_Address_Read);
//        SHT2x_Write_UserReg_Data(SHT20_Address_Write, (Initial_UserReg_Data &~ SHT2x_RES_MASK) |  SHT2x_RES_12_14BIT);
        SHT2x_Write_UserReg_Data(SHT20_Address_Write, (Initial_UserReg_Data &~ SHT2x_RES_MASK) |  SHT2x_RES_8_12BIT);
//        SHT2x_Write_UserReg_Data(SHT20_Address_Write, (Initial_UserReg_Data &~ SHT2x_RES_MASK) | SHT2x_RES_10_13BIT);
//        SHT2x_Write_UserReg_Data(SHT20_Address_Write, (Initial_UserReg_Data &~ SHT2x_RES_MASK) |  SHT2x_RES_11_11BIT);
        SHT2x_Read_UserReg_Data(SHT20_Address_Read);
        
        SHT2x_Calclates_Temperature(SHT2x_Measure_Temp_HW());
        SHT2x_Calclates_Humidity(SHT2x_Measure_Humidity_HW());
        SHT2x_Calclates_Temperature(SHT2x_Measure_Temp_POLL());
        SHT2x_Calclates_Humidity(SHT2x_Measure_Humidity_POLL());
        
        delay_ms(5000);
    }
}


四、功能展示

1、串口显示

  • SHT20 默认测量分辨率为 14bit(温度)/12bit(湿度)。

在这里插入图片描述

2、CRC 校验

  • CRC 校验工具

在这里插入图片描述


http://www.niftyadmin.cn/n/5711274.html

相关文章

一次彻底讲清如何处理mysql 的死锁问题

MySQL 死锁 是指两个或多个事务互相等待对方持有的锁&#xff0c;从而导致所有事务都无法继续执行的现象。在 InnoDB 存储引擎中&#xff0c;死锁是通过锁机制产生的&#xff0c;特别是在并发较高、业务逻辑复杂的情况下&#xff0c;更容易发生死锁。 一、MySQL 死锁的成因 M…

优化SpringBoot接口:异步处理提升系统吞吐量策略

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c…

深度解读 MySQL 8.0 数据字典重构:源码解析与实践

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云/阿里云/华为云/51CTO&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互…

线性可分支持向量机的原理推导 线性分隔超平面关于任意样本点 (x_i,y_i)的函数间隔 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 公式 9-1 用来表达训练集样本点 ( x i , y i ) (\mathbf{x}_i, y_i) (xi​,yi​) 到线性可分支持向量机分离超平面的距离。 d ^ i y i ( w ⋅ x i b )…

【进阶OpenCV】 (18)-- Dlib库 --人脸关键点定位

文章目录 人脸关键点定位一、作用二、原理三、代码实现1. 构造人脸检测器2. 载入模型&#xff08;加载预测器&#xff09;3. 获取关键点4. 显示图像5. 完整代码 总结 人脸关键点定位 在dlib库中&#xff0c;有shape_predictor_68_face_landmarks.dat预测器&#xff0c;这是一个…

图书管理新趋势:Spring Boot进销存系统

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了图书进销存管理系统的开发全过程。通过分析图书进销存管理系统管理的不足&#xff0c;创建了一个计算机管理图书进销存管理系统的方案。文章介绍了图书进销存管理…

关于FFmpeg【使用方法、常见问题、解决方案等】

1、提取音频 【1】提取无损高质量音频文件 问题描述 想要从视频文件中提取出无损高质量音频文件。 解决方案 ffmpeg -i input.mp4 -vn -c:a pcm_s16le -ar 44100 -ac 2 output.wav

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型,实现聊天对话

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型&#xff0c;实现聊天对话 目录 AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型&#xff0c;实现聊天对话 一、简单介绍 二、 Ollama 下载安装 三、Ollama 下载 L…