sht10温湿度传感器
发表于 2007-11-8 14:18:35
最近在用瑞士的SENSIRION的SHT10温湿度传感器,感觉用起来还不错,挺方便的。就是价格高一些。也有人建议用湿敏电阻,有机会试一下。下面是51的c语言代码。参考一下。后面附有原厂提供的c代码的pdf文件
/******************************************************************************************
* 函数名称 :Transstart
* 功能描述 :
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void Transstart(void)
{
DQ=1;
SCK=0;
NOP();
SCK="1";
NOP();
DQ="0";
NOP();
SCK="0";
NOP();
NOP();
NOP();
SCK="1";
NOP();
DQ="1";
NOP();
SCK="0";
}
/******************************************************************************************
* 函数名称 :Hum_write_byte
* 功能描述 :写字节函数
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
char Hum_write_byte(unsigned char value)
{
unsigned char i,error=0;
for (i=0x80;i>0;i/=2) //高位为1,循环右移
{ if (i & value) DQ="1"; //和要发送的数相与,结果为发送的位
else DQ="0";
SCK=1;
NOP();NOP();NOP();
SCK=0;
}
DQ="1"; //释放数据线
SCK="1";
error="DQ"; //检查应答信号,确认通讯正常
SCK="0";
return error; //error=1 通讯错误
}
/******************************************************************************************
* 函数名称 :Hum_read_byte
* 功能描述 :读数据
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
char Hum_read_byte(unsigned char ack)
{
unsigned char i,val=0;
DQ=1; //数据线为高
for (i=0x80;i>0;i/=2) //右移位
{
SCK=1;
if (DQ) val=(val | i); //读数据线的值
SCK=0;
}
DQ=!ack; //如果是校验,读取完后结束通讯;
SCK=1;
NOP();NOP();NOP();
SCK=0;
DQ=1; //释放数据线
return val;
}
/******************************************************************************************
* 函数名称 :RESET_SHT10
* 功能描述 :复位湿度传感器
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void RESET_SHT10(void)
{
unsigned char i;
DQ = 1;
SCK = 0; //准备
for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
{
SCK=1;
SCK=0;
}
Transstart(); //启动传输
}
/******************************************************************************************
* 函数名称 :Hum_measure
* 功能描述 :进行温度或者湿度转换,由参数mode决定转换内容;
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
char Hum_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
{
unsigned error="0";
unsigned char i;
Transstart(); //启动传输
switch(mode){
case TEMP: error+=Hum_write_byte(MEASURE_TEMP); break;
case HUMI : error+=Hum_write_byte(MEASURE_HUMI); break;
default : break;
}
for (i=0;i<65535;i++)
{
if(DQ==0) break; //等待测量结束;
}
if(DQ) error+=1; // 如果长时间数据线没有拉低,说明测量错误
*(p_value) =Hum_read_byte(ACK); //读第一个字节,高字节 (MSB)
*(p_value+1)= Hum_read_byte(ACK); //读第二个字节,低字节 (LSB)
*p_checksum =Hum_read_byte(noACK); //read CRC校验码
return error;
}
/******************************************************************************************
* 函数名称 :calc_sth10
* 功能描述 :补偿及输出温度和相对湿度
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void calc_sth10(float *p_humidity ,float *p_temperature)
{
const float C1=-4.0; // for 12 Bit 湿度修正公式
const float C2=+0.0405; // for 12 Bit 湿度修正公式
const float C3=-0.0000028; // for 12 Bit 湿度修正公式
const float T1=+0.01; // for 14 Bit @ 5V 温度修正公式
const float T2=+0.00008; // for 14 Bit @ 5V 温度修正公式
float rh=*p_humidity;
float t=*p_temperature;
float rh_lin;
float rh_true;
float t_C;
t_C=t*0.01 - 40; //补偿温度
rh_lin=C3*rh*rh + C2*rh + C1; //相对湿度非线性补偿
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相对湿度对于温度依赖性补偿
if(rh_true>100)rh_true=100; //湿度最大修正
if(rh_true<0.1)rh_true=0.1; //湿度最小修正
*p_temperature=t_C; //返回温度结果
*p_humidity=rh_true; //返回湿度结果
}
/******************************************************************************************
* 函数名称 : calc_dewpoint
* 功能描述 :计算绝对湿度值
* 参数 : 参数名称: 输入/输出? 类型 描述
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
float calc_dewpoint(float h,float t)
{
float logEx,dew_point;
logEx="0".66077+7.5*t/(237.3+t)+(log10(h)-2);
dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
return dew_point;
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |