中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 消費(fèi)電子 > 設(shè)計(jì)應(yīng)用 > 基于ATmega128的DHT11溫濕度傳感器的使用

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

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

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

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

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

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

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

        進(jìn)入正題:下面我說的話可以參照下面的程序看。

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

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

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

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

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

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

        #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í)微妙子函數(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í)毫秒子函數(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); //判斷是否為高電平

        //延時(shí)50us若為高電平則為一,否則為零

        delay_us(50);

        if(DQ)

        {

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

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

        }

        }

        }

        }

        void init_dht11(void)

        {

        DDR_1; //設(shè)置主機(jī)輸出

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

        delay_ms(20);

        PORTC_1; //總線由主機(jī)拉高大約30us

        delay_us(30);

        DDR_0; //主機(jī)設(shè)置為輸入,檢測從機(jī)信號

        while(DQ);

        }

        long int dht(void)

        {

        init_dht11();

        if(!DQ)

        {

        while(!DQ);

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

        caiji();

        DDR_1;

        PORTC_1;

        //校驗(yàn)

        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)閉