SHT71.C
/***********************************
功能模块:SHT71温湿度传感器
功能注释:重难点在无时序图
***********************************/
#include<msp430x14x.h>
#include "SHT71.h"
#include <math.h> //数据函数
typedef unsigned char uchar;
typedef unsigned int uint;
#define CLC_SCK P5OUT&=~BIT1 //SCK=P5.1
#define SET_SCK P5OUT|= BIT1
#define CLC_DATA P5OUT&=~BIT2 //DATA=P5.2
#define SET_DATA P5OUT|= BIT2
#define IN_DATA P5DIR&=~BIT2
#define OUT_DATA P5DIR|= BIT2
#define RIN_DATA (P5IN & BIT2) //用于单片机读取总线
#define NACK 0
#define ACK 1
//测量温度0x03 测量湿度0x05 软复位0x1e
//写状态寄存器0x06 读状态寄存器0x07
/***************延时函数********************/
void delay_80ms(void)
{
uint i;
for(i=64000;i>0;i--);
}
/********************************************
函数名称:SHT71_write_byte()
实现功能:向SHT71写一个字节
函数注释:dat为要写入的数据
*********************************************/
void SHT71_write_byte(uchar dat)
{
uchar i;
OUT_DATA; //DATA为输出状态
for(i=0x80;i>0;i/=2)
{
if(i&dat) SET_DATA; //最高位在前
else CLC_DATA;
_NOP();
SET_SCK; //下降沿有效
_NOP(); _NOP(); _NOP();
CLC_SCK;
_NOP();
}
SET_SCK; //检测响应信号
_NOP();
IN_DATA;
if(RIN_DATA) //检查ack(DATA被拉低)
CLC_SCK;
OUT_DATA;
SET_DATA; //释放DATA
}
/********************************************
函数名称:SHT71_read_byte()
实现功能:从SHT71读一个字节
函数注释:dat为要读取的数据
*********************************************/
uchar SHT71_read_byte(uchar dat)
{
uchar i,value;
for(i=0x80;i>0;i/=2)
{
OUT_DATA; //DATA为输出状态
SET_SCK; //下降沿有效
_NOP();
IN_DATA;
if(RIN_DATA)
value|=i;
CLC_SCK;
}
IN_DATA;
_NOP();
if(RIN_DATA!=dat) //防止dat==1,拉低DATA数据线
_NOP();
OUT_DATA;
SET_SCK;
_NOP(); _NOP(); _NOP();
CLC_SCK;
_NOP();
SET_DATA;
return value;
}
/********************************************
函数名称:SHT71_start()
实现功能:启动传输,完成数据传输初始化
函数注释:无
*********************************************/
void SHT71_start(void)
{
OUT_DATA; //DATA为输出状态
SET_DATA;
CLC_SCK;
_NOP();
SET_SCK; //SCK为高电平时DATA反转
_NOP();
CLC_DATA;
_NOP();
CLC_SCK;
_NOP();_NOP();_NOP();
SET_SCK; //SCK为高电平时DATA反转
_NOP();
CLC_DATA;
_NOP();
CLC_SCK;
}
/***************通讯复位*******************/
void SHT71_reset(void)
{
uchar i;
SET_DATA;
CLC_SCK;
for(i=0;i<9;i++)
{
SET_SCK;
_NOP();
CLC_SCK;
}
SHT71_start(); //串口复位
}
/***************软复位*******************/
void SHT71_softreset(void)
{
SHT71_reset();
SHT71_write_byte(0x1e); //软复位命令为0x1e
}
/********************************************
函数名称:SHT71_read_status()
实现功能:读状态寄存器
函数注释:p_value为状态寄存器,p_check为校验位
*********************************************/
void SHT71_read_status(uchar *p_value,uchar *p_check)
{
SHT71_start();
SHT71_write_byte(0x07); // 读状态寄存器指令
*p_value=SHT71_read_byte(ACK); //read status register (8-bit)
*p_check=SHT71_read_byte(NACK); //read checksum (8-bit)
}
/********************************************
函数名称:SHT71_write_status()
实现功能:写状态寄存器
函数注释:p_value为状态寄存器值
*********************************************/
void SHT71_write_status(uchar *p_value)
{
SHT71_start();
SHT71_write_byte(0x06); // 写状态寄存器指令
SHT71_write_byte(*p_value); //send value of status register
}
/********************************************
函数名称:SHT71_measure()
实现功能:温湿度的测量
函数注释:mode为状态指令(测量温湿度指令)
p_value为温湿度值,p_checksum为检测
*********************************************/
void SHT71_measure(uchar *p_value,uchar *p_checksum,uchar mode)
{
SHT71_start();
SHT71_write_byte(mode); //选择温湿度值
delay_80ms(); //等待80ms后等待12位湿度值测量
IN_DATA;
_NOP();
// while(RIN_DATA==0)
// if(RIN_DATA==0) break;
if(RIN_DATA)
*(p_value) =SHT71_read_byte(ACK); //read the first byte (MSB)
*(p_value+1)=SHT71_read_byte(ACK); //read the second byte (LSB)
*p_checksum =SHT71_read_byte(NACK); //read checksum
}
/********************************************
函数名称:SHT71_calc()
实现功能:温湿度的测量数据转化为响应数据
函数注释:p_humidity湿度数据[%RH],
p_temperature温度数据[°C]
rh_lin=C3*rh*rh+C2*rh+C1
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin
t_c=d1+d2*t
*********************************************/
void SHT71_calc(float *p_humidity ,float *p_temperature)
{
float rh=*p_humidity;
float t=*p_temperature;
float rh_lin; //相对湿度
float rh_true; //湿度补偿
float t_C; //温度值
t_C=t*0.01-39.6;
rh_lin=-2.0468+0.0367*rh+(-0.0000015955)*rh*rh;
rh_true=(t_C-25)*(0.01+0.00008*rh)+rh_lin;
if(rh_true>100.0)rh_true=100.0;
if(rh_true<0.1)rh_true=0.1;
*p_temperature=t_C;
*p_humidity=rh_true;
}
/********************************************
函数名称:calc_dewpoint()
实现功能:露点的测量
函数注释:h为湿度值,t为温度值
*********************************************/
float calc_dewpoint(float h,float t)
{
float k,dew_point ;
k=(log10(h)-2)/0.4343 + (17.62*t)/(243.12+t);
dew_point =243.12*k/(17.62-k);
return dew_point;
}
|