搜索
bottom↓
回复: 11

求助SHT11温湿度传感器问题

[复制链接]

出0入0汤圆

发表于 2009-2-21 15:00:42 | 显示全部楼层 |阅读模式
是否有那位大侠写过SHT11温湿度传感器的CC2430接口程序?我搞了快5天了。是否SHT11的VDD一定要5V,因为官方说的是2.4-5.5V的电压.

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-2-21 18:53:34 | 显示全部楼层
/**************************************************
* Copyright (c) 2007,杭州xxxxxx有限公司
* All rights reserved.
*
* 文件名称:sht.c
* 文件标识:
* 摘    要:温湿度 SHT 读写接口函数
*
* 当前版本:1.0
* 作    者:GanYuanFeng
* 完成日期:2007年7月30日
**************************************************/

#include "sht.h"

/**************************************************
* 函数名称:WriteSHTByte()
* 函数介绍:writes a byte on the Sensibus and checks the acknowledge        
* 输入参数:write data
* 输出参数:
* 返回值  :0:OK  1:ERROR
**************************************************/
INT8U WriteSHTByte(INT8U data)
{
  INT8U i;
  INT8U error = 0;
  
  SHT_SCK_OUT;
  SHT_SDA_OUT;                           // Set to output
  for(i=0x80; i>0; i>>=1)                //shift bit for masking
  {
    if(i & data)                         //masking value with i , write to SENSI-BUS
    {
      SHT_SDA_H;
    }
    else
    {
      SHT_SDA_L;
    }
    SHT_SCK_H;                           //clk for SENSI-BUS
    _NOP();_NOP();_NOP();_NOP();         //pulswith approx. 5 us
    SHT_SCK_L;
  }
  SHT_SDA_H;                             //release DATA-line
  SHT_SCK_H;                             //clk #9 for ack
  SHT_SDA_IN;
  error = SHT_SDA;                       //check ack (DATA will be pulled down by SHT11)
  SHT_SCK_L;
  
  return (error);                        //error=1 in case of no acknowledge
}

/**************************************************
* 函数名称:ReadSHTByte()
* 函数介绍:reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"        
* 输入参数:acknowledge
* 输出参数:
* 返回值  :value
**************************************************/
INT8U ReadSHTByte(INT8U ack)
{
  INT8U i;
  INT8U value = 0;
  
  SHT_SCK_OUT;
  SHT_SDA_OUT;                          // Set to output
  SHT_SDA_H;                            //release DATA-line
  _NOP();
  SHT_SDA_IN;
  for(i=0x80; i>0; i>>=1)               //shift bit for masking
  {
    SHT_SCK_H;                          //clk for SENSI-BUS
    _NOP();
    if(SHT_SDA)
    {
      value |= i;                       //read bit
    }
    SHT_SCK_L;                         
  }
  SHT_SDA_OUT;
  if(ack)                               //in case of "ack==1" pull down DATA-Line
  {
    SHT_SDA_L;
  }
  else
  {
    SHT_SDA_H;
  }
  SHT_SCK_H;
  _NOP();_NOP();_NOP();_NOP();         //pulswith approx. 5 us
  SHT_SCK_L;
  SHT_SDA_H;                           //release DATA-line
  
  return (value);
}

/**************************************************
* 函数名称:StartSHTTrans()
* 函数介绍:generates a transmission start        
* 输入参数:
* 输出参数:
* 返回值  :
**************************************************/
void StartSHTTrans(void)
{
  SHT_SCK_OUT;
  SHT_SDA_OUT;                          // Set to output
  SHT_SDA_H;
  SHT_SCK_L;
  _NOP();
  SHT_SCK_H;
  _NOP();
  SHT_SDA_L;
  _NOP();
  SHT_SCK_L;
  _NOP();_NOP();_NOP();_NOP();
  SHT_SCK_H;
  _NOP();
  SHT_SDA_H;
  _NOP();
  SHT_SCK_L;
}

/**************************************************
* 函数名称:ResetSHTConnection()
* 函数介绍:communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart        
* 输入参数:
* 输出参数:
* 返回值  :
**************************************************/
void ResetSHTConnection(void)
{
  INT8U i;
  
  SHT_SCK_OUT;
  SHT_SDA_OUT;                          // Set to output
  SHT_SDA_H;
  SHT_SCK_L;
  for(i=9; i>0; i--)                    //9 SCK cycles
  {
    _NOP();
    SHT_SCK_H;
    _NOP();
    SHT_SCK_L;
  }
  StartSHTTrans();                      //transmission start
}

/**************************************************
* 函数名称:ResetSHT()
* 函数介绍:resets the sensor by a softreset        
* 输入参数:
* 输出参数:
* 返回值  :0:OK  1:ERROR
**************************************************/
INT8U ResetSHT(void)
{
  INT8U error;
  
  ResetSHTConnection();                //reset communication
  error = WriteSHTByte(SHT_RESET);     //send RESET-command to sensor
  
  return (error);                      //error=1 in case of no response form the sensor
}

/**************************************************
* 函数名称:ReadSHTStatusReg()
* 函数介绍:reads the status register with checksum (8-bit)        
* 输入参数:
* 输出参数:
* 返回值  :0:OK  1:ERROR
**************************************************/
INT8U ReadSHTStatusReg(INT8U *p_value, INT8U *p_checksum)
{
  INT8U error;
  
  StartSHTTrans();                        //transmission start
  error = WriteSHTByte(SHT_STATUS_REG_R); //send command to sensor
  *p_value = ReadSHTByte(SHT_ACK);        //read status register (8-bit)
  *p_checksum = ReadSHTByte(SHT_noACK);   //read checksum (8-bit)  
  
  return (error);                         //error=1 in case of no response form the sensor
}

/**************************************************
* 函数名称:WriteSHTStatusReg()
* 函数介绍:writes the status register with checksum (8-bit)      
* 输入参数:
* 输出参数:
* 返回值  :0:OK  1:ERROR
**************************************************/
INT8U WriteSHTStatusReg(INT8U value)
{
  INT8U error = 0;
  
  StartSHTTrans();                          //transmission start
  error += WriteSHTByte(SHT_STATUS_REG_W);  //send command to sensor
  error += WriteSHTByte(value);             //send value of status register
  
  return (error);                           //error>=1 in case of no response form the sensor
}

/**************************************************
* 函数名称:MeasureSHT()
* 函数介绍:makes a measurement (humidity/temperature) with checksum      
* 输入参数:
* 输出参数:
* 返回值  :0:OK  1:ERROR
**************************************************/
INT8U MeasureSHT(INT8U mode, INT16U *p_value, INT8U *p_checksum)
{
  INT16U i;
  INT8U error = 0;
  
  StartSHTTrans();                          //transmission start
  switch(mode)                              //send command to sensor
  {                     
  case 0:
    error += WriteSHTByte(SHT_MEASURE_TEMP);
    break;
  case 1:
    error += WriteSHTByte(SHT_MEASURE_HUMI);
    break;
  default:
    break;         
  }
  SHT_SDA_IN;
  if(!error)
  {
    //Delay15Ms();
    for(i=0; i<65535; i++)
    {
      if(!SHT_SDA)
      {
        break;                                //wait until sensor has finished the measurement
      }
    }
    if(SHT_SDA)
    {
      return (1);                             // or timeout is reached
    }
    else
    {
      *p_value = ((INT16U)(ReadSHTByte(SHT_ACK))<<8)|ReadSHTByte(SHT_ACK);      // MSB first
      *p_checksum = ReadSHTByte(SHT_noACK);   //read checksum
    }
  }
  
  return (error);
}

/**************************************************
* 函数名称:CalcSHT()
* 函数介绍:calculates temperature [C] and humidity [%RH]      
* 输入参数:humi [Ticks] (12 or 8 bit)
*           temp [Ticks] (14 or 12 bit)
* 输出参数:humi [%RH]
*           temp [C]
* 返回值  :
**************************************************/
/*
void CalcSHT(FP32 *p_humidity ,FP32 *p_temperature)
{
#ifdef HighSO
  const FP32 C1=-4.0;              // for 12 Bit
  const FP32 C2=+0.0405;           // for 12 Bit
  const FP32 C3=-0.0000028;        // for 12 Bit
  const FP32 T1=+0.01;             // for 14 Bit @ 3.3V
  const FP32 T2=+0.00008;          // for 14 Bit @ 3.3V
  const FP32 D1=-39.63;            // for 14 Bit @ 3.3V
  const FP32 D2=+0.01;             // for 14 Bit @ 3.3V
#else
  const FP32 C1=-4.0;              // for 8 Bit
  const FP32 C2=+0.648;            // for 8 Bit
  const FP32 C3=-0.00072;          // for 8 Bit
  const FP32 T1=+0.01;             // for 12 Bit @ 3.3V
  const FP32 T2=+0.00128;          // for 12 Bit @ 3.3V
  const FP32 D1=-39.63;            // for 12 Bit @ 3.3V
  const FP32 D2=+0.04;             // for 12 Bit @ 3.3V
#endif

  FP32 rh=*p_humidity;             // rh:      Humidity [Ticks] 12 Bit
  FP32 t=*p_temperature;           // t:       Temperature [Ticks] 14 Bit
  FP32 rh_lin;                     // rh_lin:  Humidity linear
  FP32 rh_true;                    // rh_true: Temperature compensated humidity
  FP32 t_C;                        // t_C   :  Temperature [C]

  t_C=t*D2 + D1;                   //calc. temperature from ticks to [C]
  rh_lin=C3*rh*rh + C2*rh + C1;    //calc. humidity from ticks to [%RH]
  rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //calc. temperature compensated humidity [%RH]
  if(rh_true>100)rh_true=100;      //cut if the value is outside of
  if(rh_true<0.1)rh_true=0.1;      //the physical possible range

  *p_temperature=t_C;              //return temperature [C]
  *p_humidity=rh_true;             //return humidity[%RH]
}
*/

/**************************************************
* 函数名称:GetHumiTemp()
* 函数介绍:      
* 输入参数:
* 输出参数:humi [%RH]
*           temp [C]
* 返回值  :
**************************************************/
void GetHumiTemp(void)
{
  INT8U i = 0;
  INT8U error = 0;
  INT8U checksum;
  
  //SHT_VCC_OUT;
  //SHT_VCC_ON;
  do
  {
    i++;
    //Delay15Ms();
    ResetSHTConnection();
    error += MeasureSHT(1, (INT16U *)&SHT_HumiADVal, &checksum); //measure humidity
    error += MeasureSHT(0, (INT16U *)&SHT_TempADVal, &checksum); //measure temperature
#ifndef HighSO
    if((SHT_HumiADVal>0xff) || (SHT_TempADVal>0xfff))
    {
      error += 1;
    }
#else
    if((SHT_HumiADVal>0xfff) || (SHT_TempADVal>0x3fff))
    {
      error += 1;
    }
#endif
   
    if(error)
    {
      //ResetSHTConnection();                 //in case of an error: connection reset
      SetupSHTDevice();
    }
    else
    {
      break;
    }
  }while(i<3);
  //now_temp[0]=0xff00;
  //now_temp[1]=0x5555;
  SHT_SDA_IN;
  SHT_SCK_IN;
  //SHT_VCC_OFF;
}

/**************************************************
* 函数名称:SetupSHTDevice()
* 函数介绍:      
* 输入参数:
* 输出参数:
* 返回值  :0:OK  1:ERROR
**************************************************/
INT8U SetupSHTDevice(void)
{
  INT8U error = 0;
  INT8U regval,checksum;
  
  //SHT_VCC_OUT;
  //SHT_VCC_ON;
  //Delay15Ms();
  ResetSHTConnection();
  error += WriteSHTByte(SHT_RESET);
  Delay15Ms();
  ResetSHTConnection();
  error += WriteSHTStatusReg(0x01); // 8bit RH / 12bit Temperature resolution
  if(!error)
  {
    error += ReadSHTStatusReg(&regval, &checksum);
    if(regval==0x01)
    {
      error = 0;
    }
    else
    {
      error = 1;
    }
  }
  SHT_SDA_IN;
  SHT_SCK_IN;
  //SHT_VCC_OFF;
  
  return (error);
}

出0入0汤圆

发表于 2009-2-21 18:54:59 | 显示全部楼层
/**************************************************
* Copyright (c) 2007,杭州xxxxxxx有限公司
* All rights reserved.
*
* 文件名称:SHT.h
* 文件标识:
* 摘    要:温湿度 SHT 读写接口函数
*
* 当前版本:1.0
* 作    者:GanYuanFeng
* 完成日期:2007年7月30日
**************************************************/

#ifndef __SHT_H
#define __SHT_H

#include "MyTypeDef.h"
//#include <msp430x12x.h>

#if 0 // sck=P2.5 sda=P3.3

#define SHT_SCK_DIR    P2DIR
#define SHT_SCK_O      P2OUT
#define SHT_SCK_I      P2IN
#define SHT_SCK_BIT    BIT5

#define SHT_SDA_DIR    P3DIR
#define SHT_SDA_O      P3OUT
#define SHT_SDA_I      P3IN
#define SHT_SDA_BIT    BIT3

#else // sck=P3.3 sda=P2.5

#define SHT_SCK_DIR    P3DIR
#define SHT_SCK_O      P3OUT
#define SHT_SCK_I      P3IN
#define SHT_SCK_BIT    BIT3

#define SHT_SDA_DIR    P2DIR
#define SHT_SDA_O      P2OUT
#define SHT_SDA_I      P2IN
#define SHT_SDA_BIT    BIT5

#endif /* 0 */

#define SHT_VCC_DIR    P3DIR
#define SHT_VCC_O      P3OUT
#define SHT_VCC_I      P3IN
#define SHT_VCC_BIT    BIT0

#define SHT_SDA_OUT    (SHT_SDA_DIR |= SHT_SDA_BIT)
#define SHT_SDA_H      (SHT_SDA_O |= SHT_SDA_BIT)
#define SHT_SDA_L      (SHT_SDA_O &= ~SHT_SDA_BIT)
#define SHT_SDA_IN     (SHT_SDA_DIR &= ~SHT_SDA_BIT)
#define SHT_SDA        (SHT_SDA_I & SHT_SDA_BIT)

#define SHT_SCK_OUT    (SHT_SCK_DIR |= SHT_SCK_BIT)
#define SHT_SCK_H      (SHT_SCK_O |= SHT_SCK_BIT)
#define SHT_SCK_L      (SHT_SCK_O &= ~SHT_SCK_BIT)
#define SHT_SCK_IN     (SHT_SCK_DIR &= ~SHT_SCK_BIT)
#define SHT_SCK        (SHT_SCK_I & SHT_SCK_BIT)

#define SHT_VCC_OUT    (SHT_VCC_DIR |= SHT_VCC_BIT)
#define SHT_VCC_ON     (SHT_VCC_O &= ~SHT_VCC_BIT)
#define SHT_VCC_OFF    (SHT_VCC_O |= SHT_VCC_BIT)

#define SHT_noACK 0
#define SHT_ACK   1
                                //adr  command  r/w
#define SHT_STATUS_REG_W 0x06   //000   0011    0
#define SHT_STATUS_REG_R 0x07   //000   0011    1
#define SHT_MEASURE_TEMP 0x03   //000   0001    1
#define SHT_MEASURE_HUMI 0x05   //000   0010    1
#define SHT_RESET        0x1e   //000   1111    0

INT8U WriteSHTByte(INT8U data);
INT8U ReadSHTByte(INT8U ack);
void StartSHTTrans(void);
void ResetSHTConnection(void);
INT8U ResetSHT(void);
INT8U ReadSHTStatusReg(INT8U *p_value, INT8U *p_checksum);
INT8U WriteSHTStatusReg(INT8U value);
INT8U MeasureSHT(INT8U mode, INT16U *p_value, INT8U *p_checksum);
//void CalcSHT(FP32 *p_humidity ,FP32 *p_temperature);
void GetHumiTemp(void);
INT8U SetupSHTDevice(void);

#define Delay15Ms() TimeDelay(1500)
#define SHT_HumiADVal  now_temp[0]
#define SHT_TempADVal  now_temp[1]

#endif /* __SHT_H */

出0入0汤圆

 楼主| 发表于 2009-2-21 20:12:25 | 显示全部楼层
哇,谢谢了。我要找的也许就是3.3V的补偿函数。我先看看你给的程序先。因为我读出的数字都是错误的。

出0入0汤圆

发表于 2009-2-22 21:23:23 | 显示全部楼层

出0入0汤圆

发表于 2009-2-22 21:25:17 | 显示全部楼层
调出来没有,我现在也在调CC2510和STH11,只有单步调试读数正确。

出0入0汤圆

发表于 2011-9-29 13:20:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-10-16 13:49:11 | 显示全部楼层
谢谢了!

出0入0汤圆

发表于 2012-12-3 18:33:37 | 显示全部楼层
mark!!以后会用的到

出0入0汤圆

发表于 2012-12-13 14:55:03 | 显示全部楼层
marik!!!!!

出0入0汤圆

发表于 2013-3-18 23:21:02 | 显示全部楼层
没找到我用的

出0入0汤圆

发表于 2014-4-23 09:16:55 | 显示全部楼层
MARK!!!!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 07:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表