//头文件
#include "iic.h"
#include "delay.h"
#include "sht20.h"
//宏
#define SHT20ADDR 0x80 //sht写地址
#define ACK 0 //应答信号
#define NACK 1 //非应答
#define FAIL 1 //失败返回
#define READ_TEMP_COMD 0xf3 //读温度
#define READ_HUMI_COMD 0xf5 //读湿度
TempHumiValue_t temp_humi_Value;
static void SHT20_setResolution(void);
static void SHT20_setResolution(void);
void SHT20_softReset(void);
//写一个字节函数
static u8 sht20_writeOneByte(u8 dataToWrite)
{
u8 ack;
IIC_sendByte(dataToWrite);
ack = IIC_waitAck();
return ack;
}
//复位
static void SHT20_softReset(void)
{
IIC_start();
SHT20_writeOneByte(SHT20ADDR&0xfe);
SHT20_writeOneByte(0xfe);
IIC_stop();
}
//初始化
void sht20_Init(void)
{
sht20_softReset();
}
//读字节
static u8 sht20_readOneByte(u8 ack)
{
u8 temp;
temp=IIC_readByte(ack);
return temp;
}
//写寄存器
static void sht20_setResolution(void)
{
IIC_start();
if(sht20_writeOneByte(sht20ADDR&0xfe)==ACK) //80
{
if(sht20_writeOneByte(0xe6)==ACK)
{
if(SHT20_writeOneByte(0x83)==ACK);
}
}
IIC_stop();
}
//读取测量值
float SHT20_readTemOrHum(u8 commod)
{
float temp;
u8 ack=1;
u8 MSB,LSB;
float Humidity,Temperature;
SHT20_setResolution();
IIC_start();
ack = SHT20_writeOneByte(SHT20ADDR&0xfe);
if( ack == ACK )
{
if(SHT20_writeOneByte(commod)==ACK)
{
do
{
delay_ms(6);
IIC_start();
}while(SHT20_writeOneByte(SHT20ADDR|0x01)==NACK);
MSB = SHT20_readOneByte(ACK);
LSB = SHT20_readOneByte(ACK);
SHT20_readOneByte(NACK);
IIC_stop();
LSB &= 0xfc; //1111 1100
temp = MSB*256 + LSB;
if (commod==((u8)READ_HUMI_COMD))
{
Humidity =(temp*125)/65536-6;
return Humidity;
}
else if(commod==((u8)READ_TEMP_COMD))
{
/*-- calculate temperature [¡ãC] --*/
Temperature = (temp*175.72f)/65536-46.85f;
return Temperature;
}
}
}
return FAIL;
}
TempHumiValue_t * SHT20_readTemAndHum(void)
{
temp_humi_Value.humidity = SHT20_readTemOrHum(READ_HUMI_COMD);
temp_humi_Value.temperature = SHT20_readTemOrHum(READ_TEMP_COMD);
return &temp_humi_Value;
}
|