| 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;
}
 
 |