打印

MSP430控制SHT71温湿度传感器的采集程序

[复制链接]
995|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dirtwillfly|  楼主 | 2017-1-17 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;
}


相关帖子

沙发
dirtwillfly|  楼主 | 2017-1-17 19:55 | 只看该作者
SHT71.h
void delay_80ms(void);
void SHT71_write_byte(unsigned char dat);
unsigned char SHT71_read_byte(unsigned char dat);
void SHT71_start(void);
void SHT71_reset(void);
void SHT71_softreset(void);
void SHT71_read_status(unsigned char *p_value,unsigned char *p_check);
void SHT71_write_status(unsigned char *p_value);
void SHT71_measure(unsigned char *p_value,unsigned char *p_checksum,unsigned char mode);
void SHT71_calc(float *p_humidity ,float *p_temperature);
float calc_dewpoint(float h,float t);


使用特权

评论回复
板凳
kkzz| | 2017-1-18 22:37 | 只看该作者
这个传感器分辨率度多少?

使用特权

评论回复
地板
kkzz| | 2017-1-18 22:41 | 只看该作者
比起18B20这个精度怎么样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入TI MCU论坛      21ic TI技术交流1群:61549143(已满),  21ic TI技术交流2群:311421422 我的博客:http://blog.timcu.com/

1179

主题

34648

帖子

1115

粉丝