温湿度传感器-SHT20

温湿度传感器-SHT20

由瑞士推出的 SHT20数字温湿度传感器,基于领先世界的CMOSens ® 数字传感技术,具有极高的可靠性和卓越的长期稳定性。全量程标定,两线数字接口,可与单片机直接相连,大大缩短研发时间、简化外围电路并降低费用。此外,体积微小、响应迅速、低能耗、可浸没、抗干扰能力强、温湿一体,兼有露点测量,性价比高,使该产品能够适于多种场合的应用。

技术参数:

  1. 湿度测量范围:0~100%RH
  1. 湿度测量精度:±3%RH
  1. 温度测量范围:-40~125℃
  1. 温度测量精度:±0.3℃
  1. 工作电压:2.1~3.6VDC(请注意:请勿使用5V供电!!!)
  1. I2C接口输出

通讯规则

下发命令集合

测量时间

软复位

用户配置寄存器

代码实现

SHT20_ADDRESS = 0x40;

u16 SHT20_Get_Data(u8 Cmd)
{
u16 data;
u8 addr, checksum;
u8 buf[2];

addr = SHT20_ADDRESS << 1; //IIC地址是7bit,这里需要左移1位,bit0:1-读 0-写

IIC_Start(); //起始信号

IIC_Write_Byte(addr); //发送设备地址(写)
IIC_Wait_Ack(); //等待应答

IIC_Write_Byte(Cmd); //发送命令
IIC_Wait_Ack();

IIC_Start(); //重启信号

IIC_Write_Byte(addr + 1); //发送设备地址(读)
IIC_Wait_Ack();

delay_ms(70); //等待测量

buf[0] = IIC_Read_Byte(); //数据高位
IIC_Ack(); //产生ACK应答
buf[1] = IIC_Read_Byte(); //数据低位
IIC_Ack(); //产生ACK应答 如果这里不应答 则不传送校验位

checksum = IIC_Read_Byte(); //校验位
IIC_NAck(); //不应答

IIC_Stop(); //结束信号

data = (buf[0] << 8) + buf[1];

if(CRC_Check(buf, 2, checksum) == 0) //校验
{
if(Cmd == SHT20_Measurement_T_HM)
{
data = (175.72 * data / 65536 - 46.85) * 10; //温度计算公式
}
else data = (125.0 * data / 65536 - 6.0) * 10; //湿度计算公式

return data;
}
else return 0xFFFF; //校验不通过返回0xFFFF
}

#define CRC_MODEL 0x131

u8 CRC_Check(u8 *ptr, u8 len, u8 checksum)
{
u8 i;
u8 crc = 0x00; //计算的初始crc值

while(len--)
{
crc ^= *ptr++; //每次先与需要计算的数据异或,计算完指向下一数据

for (i = 8; i > 0; --i) //下面这段计算过程与计算一个字节crc一样
{
if (crc & 0x80)
{
crc = (crc << 1) ^ CRC_MODEL;
}
else
crc = (crc << 1);
}
}

if(checksum == crc)
{
return 0;
}
else return 1;
}

posted @ 2025-11-05 15:19  张大帅哥  阅读(9)  评论(0)    收藏  举报