新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機 溫濕度傳感器DHT11

        51單片機 溫濕度傳感器DHT11

        作者: 時間:2016-11-24 來源:網絡 收藏
        //硬件連接: P2.0口為通訊口連接DHT1
        #include
        #include

        typedef unsigned char U8;
        typedef signed char S8;
        typedef unsigned int U16;

        #define uchar unsigned char
        #define uint unsigned int

        sbit P2_0 = P2^0 ;
        sbit P2_1 = P2^1 ;
        //----------------------------------------------//
        //----------------定義區--------------------//
        //----------------------------------------------//
        U8 U8FLAG;
        U8 U8count,U8temp;
        U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
        U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
        U8 U8comdata;
        U8 indata[5];
        U8 count, count_r=0;
        U16 U16temp1,U16temp2;

        sbit d1=P2^4;
        sbit d2=P2^5;
        sbit d3=P2^6;
        sbit d4=P2^7;
        uchar code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
        0x80,0x90,0xff};
        uchar data display[5] = {0x00,0x00,0x00,0x00,0x00};

        void Delay(U16 j)
        {
        U8 i;
        for(;j>0;j--)
        {
        for(i=0;i<27;i++);
        }
        }
        void delay(unsigned int num)//延時函數
        {
        while( --num );
        }
        void Delay_10us(void)
        {
        U8 i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
        }
        //串行總線
        void COM(void)
        {

        U8 i;
        for(i=0;i<8;i++)
        {

        U8FLAG=2;
        //----------------------
        P2_1=0 ; //T
        P2_1=1 ; //T
        //----------------------

        while((!P2_0)&&U8FLAG++);
        Delay_10us();
        Delay_10us();
        // Delay_10us();
        U8temp=0;
        if(P2_0)U8temp=1;
        U8FLAG=2;
        while((P2_0)&&U8FLAG++);

        //----------------------
        P2_1=0 ; //T
        P2_1=1 ; //T
        //----------------------
        //超時則跳出for循環
        if(U8FLAG==1)break;
        //判斷數據位是0還是1

        // 如果高電平高過預定0高電平值則數據位為 1

        U8comdata<<=1;
        U8comdata|=U8temp; //0
        }//rof

        }

        //--------------------------------
        //-----濕度讀取子程序 ------------
        //--------------------------------
        //----以下變量均為全局變量--------
        //----溫度高8位== U8T_data_H------
        //----溫度低8位== U8T_data_L------
        //----濕度高8位== U8RH_data_H-----
        //----濕度低8位== U8RH_data_L-----
        //----校驗 8位 == U8checkdata-----
        //----調用相關子程序如下----------
        //---- Delay();, Delay_10us();,COM();
        //--------------------------------

        void RH(void)
        {
        //主機拉低18ms
        P2_0=0;
        Delay(180);
        P2_0=1;
        //總線由上拉電阻拉高 主機延時20us
        Delay_10us();
        Delay_10us();
        Delay_10us();
        Delay_10us();
        //主機設為輸入 判斷從機響應信號
        P2_0=1;
        //判斷從機是否有低電平響應信號如不響應則跳出,響應則向下運行
        if(!P2_0) //T !
        {
        U8FLAG=2;////////////////////////////////////////////////////
        //判斷從機是否發出 80us 的低電平響應信號是否結束
        while((!P2_0)&&U8FLAG++);
        U8FLAG=2;
        //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
        while((P2_0)&&U8FLAG++);
        //數據接收狀態
        COM();
        U8RH_data_H_temp=U8comdata;
        COM();
        U8RH_data_L_temp=U8comdata;
        COM();
        U8T_data_H_temp=U8comdata;
        COM();
        U8T_data_L_temp=U8comdata;
        COM();
        U8checkdata_temp=U8comdata;
        P2_0=1;
        //數據校驗

        U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
        if(U8temp==U8checkdata_temp)
        {
        U8RH_data_H=U8RH_data_H_temp;
        U8RH_data_L=U8RH_data_L_temp;
        U8T_data_H=U8T_data_H_temp;
        U8T_data_L=U8T_data_L_temp;
        U8checkdata=U8checkdata_temp;
        }//fi
        }//fi

        }

        Disp_Temperature()//顯示溫度
        {
        unsigned char n=0;

        // display[4]=temp_data[0]&0x0f;
        // display[0]=ditab[display[4]]; //查表得小數位的值

        // display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);

        display[4]=U8RH_data_H;
        display[4]=display[4]%100;
        display[3]=display[4]/10;
        display[2]=display[1]%10;

        display[4]=U8T_data_H;
        display[4]=display[4]%100;
        display[1]=display[4]/10;
        display[0]=display[4]%10;

        if(!display[3]) //高位為0,不顯示
        {
        display[3]=0x0a;
        if(!display[1]) //次次高位為0,不顯示
        display[1]=0x0a;
        }

        d1=1;
        P0=LEDData[display[0]];
        delay(5);d1=0;

        d2=1;
        P0=LEDData[display[1]];
        delay(5);d2=0;

        d3=1;
        P0=LEDData[display[2]];
        delay(5);d3=0;

        d4=1;
        P0=LEDData[display[3]];
        delay(5);d4=0;
        }

        void main(void)
        {
        while(1)
        {
        RH();
        Disp_Temperature();
        //讀取模塊數據周期不易小于 2S
        Delay(20000);
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 邢台县| 万全县| 吴堡县| 崇文区| 大兴区| 汶川县| 庄浪县| 东莞市| 南通市| 宁陕县| 宝坻区| 永州市| 黔东| 鲜城| 崇礼县| 寻甸| 千阳县| 新巴尔虎右旗| 邢台市| 镇安县| 斗六市| 云南省| 镇平县| 肇州县| 阿拉尔市| 民勤县| 特克斯县| 信阳市| 东城区| 湖北省| 环江| 宜丰县| 海晏县| 连城县| 贵州省| 绍兴市| 永州市| 大新县| 扎鲁特旗| 无为县| 英山县|