#include "main.h"
#include "HTU21D.h"
#include "delay.h"
#include <math.h>
u16 gtemper_max, gtemper_min;
u8 ghum_max, ghum_min;
u8 fuhaoflag;
/*----------------------------------------------------------------------
函数: void I2CDelay(uint8_t t)
功能: I2C延时
输入:
返回:
说明:
-----------------------------------------------------------------------*/
void I2CDelay(uint32_t t)
{
while(t--);
}
/*----------------------------------------------------------------------
函数: void I2C_Config(void)
功能: I2C初始化
输入:
返回:
说明:
-----------------------------------------------------------------------*/
void I2C_Config(void)
{
I2CCLK_INIT();
I2CDAT_INIT();
I2CDAT_SET();
I2CDelay(20);
I2CCLK_SET();
I2CDelay(20);
}
/*----------------------------------------------------------------------
函数: void I2CStart(void)
功能: I2C启动信号
输入:
返回:
说明:
-----------------------------------------------------------------------*/
void I2CStart( void )
{
HTU_SDA_OUTPUT();
I2CDAT_SET();
I2CCLK_SET();
I2CDelay(20);
I2CDAT_RESET();
I2CDelay(20);
I2CCLK_RESET();
I2CDelay(20);
}
/*----------------------------------------------------------------------
函数: void I2CStop(void)
功能: I2C停止信号
输入:
返回:
说明:
-----------------------------------------------------------------------*/
void I2CStop(void)
{
HTU_SDA_OUTPUT();
I2CDAT_RESET();
I2CCLK_RESET();
I2CDelay(20);
I2CCLK_SET();
I2CDelay(20);
I2CDAT_SET();
I2CDelay(20);
}
/*----------------------------------------------------------------------
函数: uint8_t I2CWriteByte(uint8_t dat)
功能: I2C写数据
输入:
返回:
说明:
-----------------------------------------------------------------------*/
uint8_t I2CWriteByte(uint8_t dat)
{
uint8_t ack = 0;
uint8_t mask;
HTU_SDA_OUTPUT();
for(mask=0x80;mask!=0;mask>>=1)
{
if(mask&dat)
{
I2CDAT_SET();
}
else
{
I2CDAT_RESET();
}
I2CDelay(2);
I2CCLK_SET();
I2CDelay(80);
I2CCLK_RESET();
I2CDelay(40);
}
I2CDelay(2);
I2CDAT_SET(); //释放SDA,检测从机应答
HTU_SDA_INPUT();
I2CCLK_SET();
//delay_ms(1);
I2CDelay(150);
ack = HTU_SDAPIN_READ();
I2CCLK_RESET(); //保证CLK的时序保持完整
return ack&0x01;
}
/*----------------------------------------------------------------------
函数: uint8_t I2CWrite(uint8_t dat)
功能: I2C写数据
输入:
返回:
说明:
-----------------------------------------------------------------------*/
uint8_t I2CReadByte(uint8_t AckValue)
{
uint8_t i,ReadData = 0;
I2CCLK_RESET();
I2CDAT_SET();
HTU_SDA_INPUT();
for(i = 0;i < 8;i++)
{
I2CCLK_SET(); //给出上升沿
I2CDelay(60); //延时等待信号稳定
ReadData <<= 1;
if(HTU_SDAPIN_READ() == 1) //采样获取数据
{
ReadData |= 0x01;
}
else
{
ReadData &= 0xfe;
}
I2CDelay(20);
I2CCLK_RESET(); //下降沿,从机给出下一位值
I2CDelay(40);
}
HTU_SDA_OUTPUT();
if(AckValue)
I2CDAT_SET();
else
I2CDAT_RESET();
I2CDelay(20);
I2CCLK_SET();
I2CDelay(100);
I2CCLK_RESET();
I2CDelay(100);
return ReadData;
}
/*----------------------------------------------------------------------
函数: void HTU21DInit(void)
功能: HTU21D初始化
输入:
返回:
说明:
-----------------------------------------------------------------------*/
void HTU21DInit(void)
{
I2C_Config(); //I2C初始化
I2CStart(); //启动I2C
I2CWriteByte(HTU21DADDR&0xfe); //写SHT21的I2C地址
I2CWriteByte(0xfe);
I2CStop(); //停止I2C
delay_ms(600); //短延时
}
/*----------------------------------------------------------------------
函数: int HTU21DWork(uint8_t order)
功能: HTU21D初始化
输入: order:命令或者温度,湿度命令码
返回:
说明:
-----------------------------------------------------------------------*/
int HTU21DWork(uint8_t order)
{
float temp = 0,TH = 0;
uint8_t MSB,LSB;
unsigned int shidu,wendu;
//printf("order=%02x\r\n", order);
I2CStart();
if(I2CWriteByte(HTU21DADDR & 0xfe) == ACK)
{
if(I2CWriteByte(order) == ACK)
{
do
{
delay_ms(22);
I2CStart();
}
while(I2CWriteByte(HTU21DADDR | 0x01) == NACK);
MSB = I2CReadByte(ACK);
delay_ms(30);
LSB = I2CReadByte(ACK);
I2CReadByte(NACK);
I2CStop();
LSB &= 0xfc;
temp = MSB*256+LSB;
if(order == 0xf3)//触发开启温度检测
{
TH=(175.72)*temp/65536-46.85;//温度:T= -46.85 + 175.72 * ST/2^16
wendu =(unsigned int)(fabs(TH)*100);
if(TH >= 0)
fuhaoflag = 0;
else
fuhaoflag = 1;
printf("tm=%d\r\n",wendu);
return wendu;
}
else
{
TH = (temp*125)/65536-6;
shidu = (unsigned int)(fabs(TH)*100);//湿度: RH%= -6 + 125 * SRH/2^16
printf("th=%d\r\n",shidu);
return shidu;
}
}
}
return 0;
}
void HTU21D_REG(void)
{
I2CStart();
if(I2CWriteByte(HTU21DADDR & 0xfe) == ACK)
{
if(I2CWriteByte(0xe7) == ACK)
{
I2CStart();
if(I2CWriteByte(0x81) == ACK)
I2CReadByte(NACK);
}
}
}