if(HTU20_SDA == 1 {
RDByte |= 0x01; } else {
RDByte&= 0xfe; }
I2CDelay(1;
HTU20_SCL_0(; //下降沿告知从机发送下一位 I2CDelay(6; }
HTU20_SDA_OUT(; //接受完一个字节,发送ACK or NACK if(AckValue == 1 {
HTU20_SDA_1(; } else {
HTU20_SDA_0(;
}
I2CDelay(3; HTU20_SCL_1(; I2CDelay(5;
HTU20_SCL_0(; //清时钟线 I2CDelay(15; //HTU20_SDA_1(; returnRDByte; } /**
* @brief soft reset by transmit reset command * @retvalNone */
voidSoftReset(void { I2CInit(; I2CStart(;
I2C_Write_Byte(SHT20ADDR & 0xfe; //I2C address + write I2C_Write_Byte(SOFT_RESET; //soft reset
I2CStop(; } /**
* @brief SET HTU20D resolution by write register * @retvalNone */
voidSET_Resolution(void { I2CStart(;
if(I2C_Write_Byte(SHT20ADDR & 0xfe == ACK //I2C address + write + ACK {
if(I2C_Write_Byte(WRITE_REGISTER==ACK //写用户寄存器 {
if(I2C_Write_Byte(0x83==ACK; //设置分辨率11bit RH% 测量时间: 12ms(typ. } // 11bit T℃测量时间: 9ms(typ. } I2CStop(; } /**
* @brief read sht20's converted result
* @paramTempOrHumiCMD: operation command for temperature or humidity * @retvalNone */
float ReadSht20(char TempOrHumiCMD { float temp; BYTE MSB,LSB;
float Humidity, Temperature; SET_Resolution(; I2CStart(;
if(I2C_Write_Byte(SHT20ADDR & 0xfe == ACK //I2C address + write + ACK {
if(I2C_Write_Byte(TempOrHumiCMD == ACK //command {
// delayms(MeasureDelay; /*这两行由下面屏蔽了的两行改到上面来的*/ // I2CStart(; do {
delayms(MeasureDelay; I2CStart(;
} while(I2C_Write_Byte(SHT20ADDR | 0x01 == NACK; //I2C address + read + NACK
MSB = I2C_Read_Byte(ACK; LSB = I2C_Read_Byte(ACK;
I2C_Read_Byte(NACK; //Checksum + NACK I2CStop(;
LSB &= 0xfc; //Data (LSB 的后两位在进行物理计算前前须置0 temp = (MSB << 8 + LSB;
if (TempOrHumiCMD == ((charTRIGGER_HUMI {
/*-- calculate relative humidity [%RH] --*/ //equation: RH% = -6 + 125 * SRH/2^RESh Humidity = (temp * 125 / 65536 - 6; return Humidity; } else {
/*-- calculate temperature [°C] --*/ //equation:T = -46.85 + 175.72 * ST/2^RESt Temperature = (temp * 175.72 / 65536 - 46.85; return Temperature; } } } return 0; }
voiddelayms(BYTE ms { BYTE t; for(t=0;t<100;t++
{ I2CDelay(10; // // } } Delayms = ms; while(Delayms;
//////////////////////////////////////////////////////////////////////////////////////////////////// #define TRIGGER_TEMP #define TRIGGER_HUMI 0xf3 0xf5 void I2CInit(void; voidSoftReset(void; voidSET_Resolution(void; float ReadSht20(char TempOrHumiCMD;