在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      新聞中心

      EEPW首頁 > 消費電子 > 設計應用 > 基于ATmega128的DHT11溫濕度傳感器的使用

      基于ATmega128的DHT11溫濕度傳感器的使用

      作者: 時間:2012-08-14 來源:網(wǎng)絡 收藏

      和DS18B20一樣,都是單總線芯片,同DHT10不同,它的四根引腳中有一條是空腳,與DS18B20相似,對時序的要求比較高,不同之處在于寫程序的時候數(shù)據(jù)的采集必須間隔1s以上,不然采集會失敗。

      本文引用地址:http://www.biyoush.com/article/165058.htm

      還有,的數(shù)據(jù)口最好要接一個上拉電阻,或者單片機內(nèi)部上拉也可以。

      的數(shù)據(jù)手冊網(wǎng)上有,上面有時序操作的詳細介紹。個人建議寫這個程序的時候要一邊寫一邊檢測(比如寫完復位子程序之后就在主函數(shù)中調(diào)用它一次,看它是否執(zhí)行成功。。。),不然很可能到最后找不到錯誤出在哪里,本人就是一直寫完然后不好使,最后又重寫的!

      閑話不說了,下面幫助大家分析一下DHT11的時序圖(數(shù)據(jù)手冊上有),因為DHT11對時序的要求很高,所以很可能寫完程序不好使。本人建議:延時子函數(shù)最好自己用示波器檢測一下,自己算出來的在10us下誤差會很大的。

      進入正題:下面我說的話可以參照下面的程序看。

      數(shù)據(jù)手冊前面的一些內(nèi)容自己了解就可以了,先看數(shù)據(jù)手冊上主機復位信號和DHT11相應信號那部分。

      主機先控制總線,拉低至少18ms,然后再拉高20~40us,(這時如果硬件沒有問題的話DHT11會有響應的)所以現(xiàn)在主機釋放總線(把DDRXN 寄存器清零),等待DHT11的響應,如果成功DHT11會產(chǎn)生40~50us的低電平,和40~50us的高電平。這里可以由程序完成檢測。

      接下來在一次采集中,把總線一直交給DHT11,它會給主機傳送一個40位的二進制數(shù),前0~7位是濕度的整數(shù)部分,8~15位是濕度的小數(shù)部分;16~23位是溫度的整數(shù)部分,24~31位是溫度的小數(shù)部分;最后八位是校驗位。這些數(shù)據(jù)要通過程序進行處理,轉(zhuǎn)換成的實際值,并由顯示部分顯示出來。(本人用的是數(shù)碼管,建議用1602顯示會更方便一些)。

      后面的處理部分我就不一一講解了,我在程序中是有注釋的,自己把程序加入到工程中看效果會好很多的,也可以用專門的閱讀軟件來看(source insignte),不然字體都一個顏色非常亂。

      ================================================

      //這里是delay.h /*************我開發(fā)板的晶振是16M的,具體的延時子函數(shù)要自己仔細寫*************/

      #ifndef __DELAY_H

      #define __DELAY_H

      void delay_us(unsigned int xus);

      void delay_ms(unsigned int xms);

      #endif

      ================================================

      //這里是delay.c

      #includedelay.h

      #include

      //延時微妙子函數(shù)

      void delay_us(unsigned int xus)

      {

      unsigned int i,j;

      for(i=0;i

      {

      NOP();NOP();NOP();NOP();NOP();NOP();

      NOP();NOP();NOP();NOP();

      }

      }

      //延時毫秒子函數(shù)

      void delay_ms(unsigned int xms)

      {

      unsigned int i,j;

      for(i=0;i

      {

      for(j=0;j2288;j++);

      }

      }

      ================================================

      //這里是dht11.h

      #ifndef __DHT11_H

      #define __DHT11_H

      #ifndef __IOM128V_H

      #include

      #endif

      #ifndef __MACROS_H

      #include

      #endif

      #define DDR_1 DDRC|=BIT(PC0)

      #define DDR_0 DDRC=~BIT(PC0)

      #define PORTC_1 PORTC|=BIT(PC0)

      #define PORTC_0 PORTC=~BIT(PC0)

      #define DQ (PINC0x01)

      void caiji(void);

      long int dht(void);

      void init_dht11(void);

      //void ceshi(void);

      #endif

      ================================================

      //這里是dht11.c

      #includedht11.h

      unsigned char dht_data[5],a,b;

      unsigned int s1,s0,t1,t0,sd,wd,wsd;

      void caiji(void)

      {

      unsigned char i,j;

      //delay_ms(900);

      for(i=0;i5;i++)

      {

      dht_data[i]=0x00; //數(shù)組清零

      for(j=0;j8;j++)

      {

      while(!DQ); //判斷是否為高電平

      //延時50us若為高電平則為一,否則為零

      delay_us(50);

      if(DQ)

      {

      dht_data[i]|=BIT(7-j); //保存數(shù)據(jù)

      while(DQ);//低電平檢測

      }

      }

      }

      }

      void init_dht11(void)

      {

      DDR_1; //設置主機輸出

      PORTC_0; //總線拉低至少18ms

      delay_ms(20);

      PORTC_1; //總線由主機拉高大約30us

      delay_us(30);

      DDR_0; //主機設置為輸入,檢測從機信號

      while(DQ);

      }

      long int dht(void)

      {

      init_dht11();

      if(!DQ)

      {

      while(!DQ);

      while(DQ); //經(jīng)以上兩句后開始接收信號

      caiji();

      DDR_1;

      PORTC_1;

      //校驗

      a=

      (

      dht_data[0]+dht_data[1]+dht_data[2]+dht_data[3]

      );

      if(a==dht_data[4])

      {

      s1=dht_data[0];

      s0=dht_data[1];

      t1=dht_data[2];

      t0=dht_data[3];

      }

      //s為濕度,t為溫度

      sd=s1;

      sd=8;

      sd|=s0;

      wd=t1;

      wd=8;

      wd|=t0;

      wsd=sd16;

      wsd|=wd;

      }

      return wsd;

      }

      ================================================

      //這里是xianshi.h

      #ifndef __XIANSHI_H

      #define __XIANSHI_H

      #ifndef __IOM128V_H

      #include

      #endif

      #define SCK_0 PORTB=~(1

      #define SCK_1 PORTB|=(1

      #define LCK_0 PORTB=~(1

      電磁爐相關(guān)文章:電磁爐原理


      上拉電阻相關(guān)文章:上拉電阻原理
      土壤濕度傳感器相關(guān)文章:土壤濕度傳感器原理

      上一頁 1 2 下一頁

      評論


      相關(guān)推薦

      技術(shù)專區(qū)

      關(guān)閉