• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

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

    作者: 時間:2012-08-14 來源:網絡 收藏

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

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

    還有,的數據口最好要接一個上拉電阻,或者單片機內部上拉也可以。

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

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

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

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

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

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

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

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

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

    #ifndef __DELAY_H

    #define __DELAY_H

    void delay_us(unsigned int xus);

    void delay_ms(unsigned int xms);

    #endif

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

    //這里是delay.c

    #includedelay.h

    #include

    //延時微妙子函數

    void delay_us(unsigned int xus)

    {

    unsigned int i,j;

    for(i=0;i

    {

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

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

    }

    }

    //延時毫秒子函數

    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; //數組清零

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

    {

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

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

    delay_us(50);

    if(DQ)

    {

    dht_data[i]|=BIT(7-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); //經以上兩句后開始接收信號

    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

    電磁爐相關文章:電磁爐原理


    上拉電阻相關文章:上拉電阻原理
    土壤濕度傳感器相關文章:土壤濕度傳感器原理

    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 湖州市| 休宁县| 筠连县| 海门市| 阿瓦提县| 卢氏县| 凤山市| 共和县| 北辰区| 错那县| 台北县| 凤城市| 巴林左旗| 西乡县| 乌拉特后旗| 孝昌县| 武夷山市| 东丰县| 云南省| 胶州市| 贵州省| 南康市| 临邑县| 凤台县| 齐齐哈尔市| 景泰县| 平遥县| 谢通门县| 滦南县| 泾阳县| 武宣县| 阳城县| 景谷| 香格里拉县| 黄梅县| 招远市| 青龙| 彩票| 巧家县| 西和县| 洛浦县|