2990|5

27

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

用PROTENS V7.8SP2 仿真SHT75,数据为何差很远? [复制链接]



最新回复

我之前有用过SHT10,挺贵的,三四十块一个火柴头那么大的东西  详情 回复 发表于 2014-2-24 09:01
点赞 关注
 

回复
举报

27

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
#define SHT75_SCK          GPIO1                                      //定义通讯时钟端口
#define SHT75_SDA        GPIO0                                      //定义通讯数据端口

#define NOP_1uS()                NOP()
//*********************第二部分DHT90设置   START****************************************
#define noACK 0             //用于判断是否结束通讯
#define ACK   1             //结束数据传输
                            //adr  command  r/w
#define STATUS_REG_W 0x06   //000   0011    0
#define STATUS_REG_R 0x07   //000   0011    1
#define MEASURE_TEMP 0x03   //000   0001    1
#define MEASURE_HUMI 0x05   //000   0010    1
#define RESET        0x1e   //000   1111    0

#define TEMP                        0
#define HUMI                        1

/****************定义函数****************/
void SHT75_transstart(void);               //启动传输函数
void SHT75_connectionreset(void);          //连接复位函数
char SHT75_write_byte(unsigned char value);//DHT90写函数
char SHT75_read_byte(unsigned char ack);   //DHT90读函数
char SHT75_measure(unsigned char *p_value,unsigned char mode);//测量温湿度函数
//void calc_dht90(float *p_humidity ,float *p_temperature);//温湿度补偿
/*--------------------------------------
;模块名称:SHT75_transstart();
;功    能:启动传输函数
;占用资源:--
;参数说明:--
;创建日期:2008.08.15
;版    本:FV1.0(函数版本Function Version)
;修改日期:--
;修改说明:--
;-------------------------------------*/  
void SHT75_transstart(void){
// generates a transmission start  
//       _____         ________
// SHT75_SDA:      |_______|
//           ___     ___
// SHT75_SCK : ___|   |___|   |______

        SHT75_SDA=1;
        SHT75_SCK=0;                   //Initial state
        NOP_1uS();
        SHT75_SCK=1;
        NOP_1uS();
        SHT75_SDA=0;
        NOP_1uS();
        SHT75_SCK=0;   
        NOP_1uS();NOP_1uS();NOP_1uS();
        SHT75_SCK=1;
        NOP_1uS();
        SHT75_SDA=1;        
        NOP_1uS();
        SHT75_SCK=0;        
}

/*--------------------------------------
;模块名称:SHT75_connectionreset();
;功    能:连接复位函数
;占用资源:--
;参数说明:--
;创建日期:2008.08.15
;版    本:FV1.0(函数版本Function Version)
;修改日期:--
;修改说明:--
;-------------------------------------*/
void SHT75_connectionreset(void){
// communication reset: SHT75_SDA-line=1 and at least 9 SHT75_SCK cycles followed by transstart
//       _____________________________________________________         ________
// SHT75_SDA:                                                      |_______|
//          _    _    _    _    _    _    _    _    _        ___     ___
// SHT75_SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______
   
  unsigned char i;  
  
  SHT75_SDA=1;
  SHT75_SCK=0;           //Initial state
  for(i=0;i<9;i++){                  //9 SHT75_SCK cycles
    SHT75_SCK=1;
          SHT75_SCK=0;
  }
  SHT75_transstart();                   //transmission start
}
/*--------------------------------------
;模块名称:SHT75_write_byte();
;功    能:DHT90写函数
;占用资源:--
;参数说明:--
;创建日期:2008.08.15
;版    本:FV1.0(函数版本Function Version)
;修改日期:--
;修改说明:--
;-------------------------------------*/
char SHT75_write_byte(unsigned char value){
//----------------------------------------------------------------------------------
// writes a byte on the Sensibus and checks the acknowledge  
  unsigned char i,error=0;   

  for (i=0;i<8;i++){             //shift bit for masking
    if (0x80 & value) SHT75_SDA=1;          //masking value with i , write to SENSI-BUS
    else SHT75_SDA=0;   
    SHT75_SCK=1;                          //clk for SENSI-BUS
        value <<=1;
  //  NOP_1uS();NOP_1uS();        //pulswith approx. 3 us     
    SHT75_SCK=0;
  }
  SHT75_SDA=1;                           //release SHT75_SDA-line
  SHT75_SCK=1;                            //clk #9 for ack  
  TRISIO0 =1;
  NOP_1uS();                                //pulswith approx. 3 us
  error = SHT75_SDA;                       //check ack (SHT75_SDA will be pulled down by DHT90),SHT75_SDA在第9个上升沿将被DHT90自动下拉为低电平。
  TRISIO0 =0;
  NOP_1uS();NOP_1uS();NOP_1uS();
  SHT75_SCK=0;
  SHT75_SDA=1;                           //release SHT75_SDA-line
  return error;                     //error=1 in case of no acknowledge //返回:0成功,1失败
}
/*--------------------------------------
;模块名称:SHT75_read_byte();
;功    能:DHT90读函数
;占用资源:--
;参数说明:--
;创建日期:2008.08.15
;版    本:FV1.0(函数版本Function Version)
;修改日期:--
;修改说明:--
;-------------------------------------*/
char SHT75_read_byte(unsigned char ack){  
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"  
  
  unsigned char i,val;

  SHT75_SDA=1;  
  val=0;                         //release SHT75_SDA-line
  TRISIO0 =1;
  for (i=0;i<8;i++){                                             //shift bit for masking
          val<<=1;                 
          SHT75_SCK=1;                                                  //clk for SENSI-BUS
    if (SHT75_SDA) val++;                //read bit   
        NOP_1uS();NOP_1uS();NOP_1uS();                                //pulswith approx. 3 us
    SHT75_SCK=0;              
  }   //**********************************************************************
  TRISIO0 =0;
  if(ack) SHT75_SDA=0;                 //in case of "ack==1" pull down SHT75_SDA-Line
  else  SHT75_SDA=1;                      //如果是校验(ack==0),读取完后结束通讯
  NOP_1uS();NOP_1uS();NOP_1uS();          //pulswith approx. 3 us
  SHT75_SCK=1;                            //clk #9 for ack
  NOP_1uS();NOP_1uS();NOP_1uS();          //pulswith approx. 3 us  
  SHT75_SCK=0;                 
  NOP_1uS();NOP_1uS();NOP_1uS();          //pulswith approx. 3 us
  SHT75_SDA=1;                     //release SHT75_SDA-line
  return val;
}
//----------------------------------------------------------------------------------
char SHT75_softreset(void){
//----------------------------------------------------------------------------------
// resets the sensor by a softreset
  unsigned char error=0;  
  SHT75_connectionreset();              //reset communication
  error+=SHT75_write_byte(RESET);       //send RESET-command to sensor
  return error;                     //error=1 in case of no response form the sensor
}
/*--------------------------------------
;模块名称:SHT75_measure();
;功    能:测量温湿度函数
;占用资源:--
;参数说明:--
;创建日期:2008.08.15
;版    本:FV1.0(函数版本Function Version)
;修改日期:--
;修改说明:--
;-------------------------------------*/
char SHT75_measure(unsigned char *p_value,unsigned char mode){
// makes a measurement (humidity/temperature) with checksum
       
        unsigned char error;
        unsigned int i;
       
        SHT75_transstart();                   //transmission start
        error =SHT75_write_byte(mode);
        //************************************************************
        TRISIO0 =1;
        for (i=0;i<65535;i++){
                CLRWDT();
                if(SHT75_SDA==0) break; //wait until sensor has finished the measurement
        }
        if(SHT75_SDA) error +=1;                        // or timeout (~2 sec.) is reached
        TRISIO0 =0;
        *(p_value)   = SHT75_read_byte(ACK);            //read the first byte (MSB)
        *(p_value+1) = SHT75_read_byte(ACK);            //read the second byte (LSB)
        SHT75_read_byte(noACK);                                          //read checksum
        return error;
}
/*******************************************************************************
函数说明;经过温度校准的湿度获取函数
输入数据:温度(X10^2)
输出数据:校准后湿度(X10^7)

特殊说明:为了避免浮点数的计算 采用将湿度放大X10^7 这样的计算都是整数
返回的湿度放大了10倍!!
*******************************************************************************/
unsigned int GetRH(unsigned int hum1,unsigned int temper){
    const unsigned long c1=40000000,c2=405000,c3=28;
        unsigned long hum;

    hum =(unsigned long)hum1*c2-(unsigned long)hum1*hum1*c3-(unsigned long)c1;                //利用温度校准湿度
    hum =(unsigned long)(temper*10-2500)*(1000+(unsigned long)hum1*8)+hum;
        hum =hum/1000/1000;
        if(hum>1000) hum=1000;
        if(hum<10) hum=10;
    return(hum);
}
//********************************************
//unsigned char getBuf[15];
//*********主函数*****************
void Get_RH_WenDu(void){
        unsigned char error;
        unsigned char w[2],r[2];
        unsigned int ww,rr;

        SHT75_connectionreset();
        error  = SHT75_measure(r,MEASURE_HUMI);  //measure humidity
        error  += SHT75_measure(w,MEASURE_TEMP);  //measure temperature
        if(error!=0){
                SHT75_connectionreset();                 //in case of an error: connection reset
        //        error=sprintf(getBuf,"BAD!! \r\n");
        }else{
                ww =(w[0]<<8 | w[1])/10-400;  //放大了10倍!
                rr =(r[0]<<8 | r[1]);
                rr=GetRH(rr,ww);
                Humi=rr;
                Temp=ww;
        //        error=sprintf(getBuf,"T:%3d rH:%3d \r\n",(int)ww,(int)rr);
        }
        //SendOut(getBuf,error);//数据回发,检验是否正确!
}

 
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
不知道实际使用会差多远?
 
 
 

回复

287

帖子

77

TA的资源

纯净的硅(中级)

4
 
SHTxx,温湿度传感器精度是很高的,
 
个人签名i miss you!
新浪微博http://weibo.com/u/3178116863
一切都是最好的安排!感恩,毋需抱怨!
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

5
 
希望如此!
 
 
 

回复

1632

帖子

4

TA的资源

纯净的硅(高级)

6
 
我之前有用过SHT10,挺贵的,三四十块一个火柴头那么大的东西
 
个人签名科技改变生活
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表