音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

有誰用過SHT7X系列溫濕度傳感器

作者:highhand 欄目:單片機
有誰用過SHT7X系列溫濕度傳感器
感覺好像讀寫存儲芯片那樣,但是就是不能正常讀取,哪位讀取SHT7X系列的,能否提供一份參考程序,謝謝!有酬

* - 本貼最后修改時間:2007-3-31 0:58:06 修改者:highhand

2樓: >>參與討論
mohanwei
廠家就給出了例程……
用起來感覺非常方便。
注意它的接口只是看起來很想I2C而已,實際不是的……好好閱讀一下手冊。

3樓: >>參與討論
highhand
我按照例程,但是出不來
廠家給出的是基于51的程序,我用的是PIC16F819,不知道哪里有問題。樓上的兄臺,能否指點一下,或者加我QQ(86025230)指導(dǎo)一下,因為我們時間比較急。謝謝你了!我并不是一遇到困難就到處求助的,雖然沒有弄出來,也弄了好幾天了,因為我們做項目,現(xiàn)在時間比較急,手冊我看了很多次了,包括IO的方向、上拉電阻等都注意到了。如果可以的話請你幫幫忙,不勝感激!

* - 本貼最后修改時間:2007-3-29 8:10:08 修改者:highhand

4樓: >>參與討論
yewuyi
怎么個有酬法子?
呵呵,自己看看就知道了啊,也可以聯(lián)系代理商,需要提醒你的是,這個東西精度確實不錯,但因為要求功耗的原因,傳輸距離要注意

5樓: >>參與討論
highhand
聯(lián)系過了,還是沒有解決
代理商只提供51的參考程序,存在的可能是IO方向問題,我也試過了,還是出不來,樓上的兄弟們?nèi)绻鲞^的話就指點指點吧,謝謝你們了!

6樓: >>參與討論
chenlung
能不能把你的CPU連接和程序搞出來看下
只見你說有問題,這樣哪里看得出來。

7樓: >>參與討論
highhand
原參考程序(51)
/***********************************************************************************
Project:          SHTxx DEMO program (V2.1)
Filename:         SHTxx_Sample_Code.c    

Prozessor:        80C51 family
Compiler:         Keil Version 6.14

Autor:            MST
Copyrigth:        (c) Sensirion AG      
***********************************************************************************/

#include <AT89s53.h> //Microcontroller specific library, e.g. PORT definitions
#include <intrins.h> //Keil library (is used for _nop()_ operation)  
#include <math.h>    //Keil library  
#include <stdio.h>   //Keil library

typedef union
{ unsigned int i;
  float f;
} VALUE;

//----------------------------------------------------------------------------------
// modul-var
//----------------------------------------------------------------------------------
enum {TEMP,HUMI};

#define    DATA       P1_1
#define    SCK       P1_0

#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

//----------------------------------------------------------------------------------
CHAR s_write_byte(unsigned CHAR VALUE)
//----------------------------------------------------------------------------------
// writes a byte on the Sensibus and checks the acknowledge
{
  unsigned CHAR i,error=0;  
  for (i=0x80;i>0;i/=2)             //shift bit for masking
  { if (i & VALUE) DATA=1;          //masking VALUE with i , write to SENSI-BUS
    else DATA=0;                        
    SCK=1;                          //clk for SENSI-BUS
    _nop_();_nop_();_nop_();        //pulswith approx. 5 us      
    SCK=0;
  }
  DATA=1;                           //release DATA-line
  SCK=1;                            //clk #9 for ack
  error=DATA;                       //check ack (DATA will be pulled down by SHT11)
  SCK=0;        
  return error;                     //error=1 in case of no acknowledge
}

//----------------------------------------------------------------------------------
CHAR s_read_byte(unsigned CHAR ack)
//----------------------------------------------------------------------------------
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
{
  unsigned CHAR i,val=0;
  DATA=1;                           //release DATA-line
  for (i=0x80;i>0;i/=2)             //shift bit for masking
  { SCK=1;                          //clk for SENSI-BUS
    if (DATA) val=(val | i);        //read bit  
    SCK=0;                       
  }
  DATA=!ack;                        //in case of "ack==1" pull down DATA-Line
  SCK=1;                            //clk #9 for ack
  _nop_();_nop_();_nop_();          //pulswith approx. 5 us
  SCK=0;                            
  DATA=1;                           //release DATA-line
  return val;
}

//----------------------------------------------------------------------------------
void s_transstart(void)
//----------------------------------------------------------------------------------
// generates a transmission start
//       _____         ________
// DATA:      |_______|
//           ___     ___
// SCK : ___|   |___|   |______
{  
   DATA=1; SCK=0;                   //Initial state
   _nop_();
   SCK=1;
   _nop_();
   DATA=0;
   _nop_();
   SCK=0;  
   _nop_();_nop_();_nop_();
   SCK=1;
   _nop_();
   DATA=1;           
   _nop_();
   SCK=0;           
}

//---------------------------------------
8樓: >>參與討論
highhand
自己程序
PA2作為時鐘線,PA3作為數(shù)據(jù)線。因為要用作定時輸出,所以用到了定時中斷程序,請各位幫我看看,程序可能亂了點,主要是看看SHT部分,PWM、定時那些都沒有問題的了。不勝感激。



#include  <pic.h>
#include  <pic16f81x.h>
#include  <math.h>
#include  <stdio.h>

CHAR s_write_byte(unsigned CHAR VALUE);
CHAR s_read_byte(unsigned CHAR ack);
void s_transstart(void);
void s_connectionreset(void);
CHAR s_softreset(void);
CHAR s_read_statusreg(unsigned CHAR *p_VALUE, unsigned CHAR *p_checksum);
CHAR s_write_statusreg(unsigned CHAR *p_VALUE);
CHAR s_measure(unsigned CHAR *p_VALUE, unsigned CHAR *p_checksum, unsigned CHAR mode);
void calc_sth11(float *p_HUMIDITY ,float *p_temperature);
float calc_dewpoint(float h,float t);
void PWM_Initial(void);
void PWM_Display(int PWMOut92, int PWMOut10);
void Timer1_Initial(void);
void interrupt isr(void);

static bit      SCK      @ (unsigned)&PORTA*8+2;
static bit      DATA     @ (unsigned)&PORTA*8+3;

//------------------------------------------------------------------------------
// modul-var
//------------------------------------------------------------------------------
enum {TEMP,HUMI};

#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

CHAR PWM92,PWM10;
unsigned int n_Scan=0,pwm=0;
float dew_point;
unsigned CHAR err,chksum;
unsigned int humi_vali=0,temp_vali=0;
float humi_valf,temp_valf;

main()
{
      TRISA = 0x00;            
    TRISB = 0x00;
    PORTB = 0x0FF;        
          
     PWM_Initial();       //  PWM Initial
     Timer1_Initial();    //  Timer1 Initial
    PEIE=1;              //  Enable Peripheral Interupts
    GIE =1;              //  Enable GLOBAL Interrupt
    
    s_connectionreset();
    while(1)
    {
    //
    }
}


void PWM_Initial(void)
{
    PR2=0x0F9;
    CCPR1L=0x7F;
    CCP1CON=0x20;
    TRISB=0x00;
    T2CON=0x05;
    CCP1CON|=0x0F;
}


void PWM_Display(int PWMOut92, int PWMOut10)
{
    CCPR1L=PWMOut92;
    CCP1CON&=0x0CF;
    CCP1CON|=PWMOut10;    
}    


void Timer1_Initial(void)
{
    OPTION=0x87;     //    Falling Edge of INT Pin,WDT Fosc/128
    PSA=1;            //    WDT Fosc/128
    T1CON=0x00;      //    Internal Clock(Fosc/4)
    TMR1H=0x0FC;     
    TMR1L=0x2E;      //    1ms
    TMR1IF=0;        //    Clear TIMER1 Interrupt Flag
    TMR1IE=1;        //    Enable TIMER1 Interrupt
    TMR1ON=1;        //    Start Timing
}


void interrupt isr(void)
{
    if (TMR1IF==1)       //  TIMER1 Interrupt Subroutine
    {
    TMR1IF=0;
    TMR1H=0x0FC;
    TMR1L=0x2E;
    n_Scan+=1;
    CLRWDT();            //  WDT Clear
    
    if (n_Scan==1000)      
    {
    PORTB=0x0FF;
    CLRWDT();            //  WDT Clear
    }
    
    if (n_Scan==1500)      
    {
    PORTB=0x01;
    //pwm=200;
    if(pwm==1000)
    {
    pwm=0;
    }
    PWM10=(CHAR)(pwm&(0x03));
    PWM10=PWM10<<4;
    PWM92=pwm>>2;
    PWM_Display(PWM92,PWM10);
    }
    
    if (n_Scan==2000)      
    {
    PORTB=0x02;
    err=0;
    err+=s_measure((unsigned CHAR*) &humi_vali,&chksum,HUMI);  //measure HUMIDITY
    //err+=s_measure((unsigned CHAR*) &temp_vali,&chksum,TEMP);  //measure temperature
    //if(err!=0)
    //{s_connectionreset();}
    if(err==0)
        {
        //humi_vali=1500;
        //temp_vali=10000;
        humi_valf=(float)humi_vali;                   //converts integer to float
        temp_valf=(float)temp_vali;                   //converts integer to float
        calc_sth11(&humi_valf,&temp_valf);            //calculate HUMIDITY, temperature
        pwm=(unsigned int) (humi_valf*10);
    }
    }
9樓: >>參與討論
lehao
不懂c語言
  用匯編做過,我做的時候有個問題,一個是等待是否檢測到變低的信號.得到這個信號了就說明通訊工作對了. 你要是迷惑,先做個程序檢測這個低信號好了.

  沒學(xué)過c語言,只能這么說下了.

  工作過程是容易:先發(fā)啟動信號,在發(fā)命令,等待低信號,在就讀數(shù)據(jù)好了.sht工作有周期,你的時間間隔不能太短,他本身的檢測時間較長.

  希望能幫到你!

10樓: >>參與討論
mohanwei
今天太晚了,我明天再看看程序……
一般說來這種接口的驅(qū)動是最好寫的,先按照手冊上的讀寫流程圖編寫出程序框架,然后往下細化到read和write函數(shù),最后參照讀寫時序圖編寫read和write的實現(xiàn)。

調(diào)試的時候不要急著直接編譯整個項目,要先單獨編幾個測試函數(shù)先把接口完全調(diào)通。調(diào)試的時候最好能有硬件仿真器(其實我一般是用keil先進行軟件仿真的……),結(jié)合萬用表和示波器觀察管腳電平變化,有一點不對也要分析清楚。

雖然這段文字看起來是紙上談兵,但的確是我多年調(diào)程序總結(jié)出來的部分經(jīng)驗,我按照這個步驟來調(diào)接口,幾乎沒有浪費過時間。

11樓: >>參與討論
highhand
非常感謝樓上的兄臺
真心感謝你,我會再努力的,如果你又時間,也希望你幫幫忙看看,指點一下。

12樓: >>參與討論
highhand
問題已經(jīng)解決,謝謝大家提示
謝謝大家?guī)兔!非常感謝!

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
PIC16F877A程序自動重啟
初學(xué)PIC,有些問題請大俠指教
單片機燒不進去程序
banlsel怎么用啊
用18F8722擴展SRAM,讀取的數(shù)據(jù)老師出錯,大家?guī)蛶兔?/a>
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號