本帖最后由 karlman 于 2024-6-5 22:16 编辑
在冰柜里试验了一下,又发现一个问题,SHT30_temperature不能定义成u16类型,要定义成signed int,这样才能正确显示零下的温度。
最终我把这个子程序修改为:
- signed int SHT30_temperature;
- u16 SHT30_humidity;
-
- //========================================================================
- // 函数: void SHT30_DataRead(void)
- // 描述: 温湿度数据读取
- // 参数:
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2022-15-5
- // 备注:
- //========================================================================
- void SHT30_DataRead(void)
- {
- u8 read_sht_data[6]; //数据读取缓存
- unsigned long int Data_convert; //用于数据转换
- uchar crc_result; //用于CRC校验结果存放,为判断数据准确性做准备
-
- IIC_ReadNbyte_16bitAddr(SHT30_Slave,0xE000,read_sht_data,6); //读出数据放入缓存数组等待处理>>T高八位>>T低八位>>温度T的CRC校验位>>H高八位>>H低八位>>湿度H的CRC校验位
-
- crc_result=SHT30_CRC8_Check(read_sht_data,2,read_sht_data[2]); //crc校验,crc校验要是不成功就返回1,
- //同时不会更新温度值
- if(crc_result==0)
- {
- Data_convert=(read_sht_data[0] << 8) | read_sht_data[1]; //把2个8位数据拼接为一个16位的数据
- //温度转换,将16位温度数据转化为10进制的温度数据,
- //这里保留了一位小数,SHT30_temperature这是一个全局变量,
- //计算温度值(uchar强制转换,数据在超过八位范围后会丢失)
- SHT30_temperature = (signed int)(1750 *Data_convert / 65535 - 450);
- }
-
- //crc校验
- crc_result=SHT30_CRC8_Check(&read_sht_data[3],2,read_sht_data[5]); //crc校验,crc校验要是不成功就返回1,
- //同时不会更新湿度值
- if(crc_result==0)
- {
- Data_convert=(read_sht_data[3] << 8) | read_sht_data[4]; //把2个8位数据拼接为一个16位的数据
- //湿度转换,将16位湿度数据转化为10进制的湿度数据,
- //这里保留了一位小数,SHT30_humidity这是一个全局变量,
- //计算湿度值(uchar强制转换,数据在超过八位范围后会丢失)
- SHT30_humidity = Data_convert / 65.535;
- }
- }
-
复制代码
|