久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1274|回復: 0
打印 上一主題 下一主題
收起左側

溫濕度傳感器驅動源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:395175 發表于 2018-9-7 23:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
//****************************************************************//
//           DHT21使用范例
//單片機 AT89S52 或 STC89C52RC
//功能   串口發送溫濕度數據 晶振 11.0592M 波特率 9600
//硬件   P2.0口為通訊口連接DHT11,DHT11的電源和地連接單片機的電源和地,單片機串口加MAX232連接電腦
//公司  雁凌電子   
//****************************************************************//

#include <reg51.h>
#include <intrins.h>
//
typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable           無符號8位整型變量  */
typedef signed   char  S8;       /* defined for signed 8-bits integer variable                  有符號8位整型變量  */
typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable           無符號16位整型變量 */
typedef signed   int   S16;      /* defined for signed 16-bits integer variable           有符號16位整型變量 */
typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable           無符號32位整型變量 */
typedef signed   long  S32;      /* defined for signed 32-bits integer variable           有符號32位整型變量 */
typedef float          F32;      /* single precision floating point variable (32bits) 單精度浮點數(32位長度) */
typedef double         F64;      /* double precision floating point variable (64bits) 雙精度浮點數(64位長度) */
//
#define uchar unsigned char
#define uint unsigned int
#define   Data_0_time    4

//----------------------------------------------//
//----------------IO口定義區--------------------//
//----------------------------------------------//
sbit  P2_0  = P1^0 ;

//----------------------------------------------//
//----------------定義區--------------------//
//----------------------------------------------//
U8  U8FLAG,k;
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  outdata[5];  //定義發送的字節數          
U8  indata[5];
U8  count, count_r=0;
U8  str[5]={"RS232"};
U16 U16temp1,U16temp2;
SendData(U8 *a)
{
        U8 i=0,j=0,sum=0;
       
       
       
        ES=0;
        for(i=0;i<5;i++)
        {
                SBUF = a[i];
                while(!TI);
                TI=0;
        }

       
        TI=0;
        ES=1;
}

void Delay(U16 j)
{     
                U8 i;
                for(;j>0;j--)
                {        
                        for(i=0;i<27;i++);
                }
}      
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;       
                                                while((!P2_0)&&U8FLAG++);//等待高電平
                                                Delay_10us();
                                                Delay_10us();
                                                Delay_10us();
                                                U8temp=0;   //判斷數據位是0還是1
                                                if(P2_0)    // 如果高電平時間超過預定0的高電平時間則為數據1
                                                        U8temp=1;
                                                U8FLAG=2;
                                                while((P2_0)&&U8FLAG++);//等待低電平
                                                //超時則跳出for循環                  
                                                if(U8FLAG==1)
                                                        break;                                                                              
                                                U8comdata<<=1;
                                                U8comdata|=U8temp;        //0
                                        }
                        }

        //--------------------------------
        //-----濕度讀取子程序 ------------
        //--------------------------------
        //----以下變量均為全局變量--------
        //----溫度高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;
                         }
           }

        }
       
//----------------------------------------------
//main()功能描述:  AT89C51  11.0592MHz         串口發
//送溫濕度數據,波特率 9600
//----------------------------------------------
void Init_com()
{
        /* 系統初始化 */
        TMOD = 0x20;          //定時器T1使用工作方式2
        TH1 = 253;        // 設置初值
        TL1 = 253;
        TR1 = 1;          // 開始計時
        SCON = 0x50;          //工作方式1,波特率9600bps,允許接收   
        ES = 1;
        EA = 1;           // 打開所以中斷   
        TI = 0;
        RI = 0;
        SendData(str) ;   //發送到串口
//        P0=0x00;
//        Delay(1);         //延時100US(12M晶振)
}
void main()
{
        Init_com();                                 //串口初始化
        while(1)
        {  
           //------------------------  
           RH();//調用溫濕度讀取子程序
           //串口顯示程序
           //--------------------------
           str[0]=U8RH_data_H;//濕度高八位
           str[1]=U8RH_data_L;//濕度低八位
           str[2]=U8T_data_H;//溫度高八位
           str[3]=U8T_data_L;
           str[4]=U8checkdata;//校驗
           SendData(str) ;  //發送到串口  
           //讀取模塊數據周期不易小于 2S
           Delay(20000);
        }
}

void RSINTR() interrupt 4 using 2
{
        U8 InPut3;
        if(TI==1) //發送中斷          
        {
                TI=0;
                if(count!=5) //發送完5位數據         
                {
                        SBUF= outdata[count];
                        count++;
                }
        }

        if(RI==1)         //接收中斷                  
        {       
                InPut3=SBUF;
                indata[count_r]=InPut3;
                count_r++;
                RI=0;                                                                 
                if (count_r==5)//接收完4位數據
                {
                //數據接收完畢處理。
                        count_r=0;                               
                }
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠干美女 | 奇米四色在线观看 | 91亚洲精品在线 | 成人国产精品色哟哟 | 嫩草一区二区三区 | 亚卅毛片 | 日韩欧美一级精品久久 | 午夜视频在线观看视频 | 在线观看亚洲一区二区 | 亚洲免费婷婷 | 黄色一级大片视频 | 羞羞视频在线观看网站 | 亚洲视频网 | 天天射影院 | 色性av| 欧美男人天堂 | 一级女毛片 | 日韩免费视频一区二区 | 成人精品网 | 日本午夜网站 | 拍真实国产伦偷精品 | 日韩欧美三区 | 黄色在线免费观看 | 国产高潮av | 久久精品毛片 | 国产一区二区视频在线 | www国产成人免费观看视频,深夜成人网 | 精品久久九九 | 国产精品久久久久久久午夜片 | 国产精品揄拍一区二区 | 亚洲欧美一区二区三区国产精品 | 国产一区二区久久 | 天天射色综合 | 久久成人精品视频 | 国产精品毛片无码 | 久久久中文 | 亚洲永久免费 | 国产精华一区 | 亚洲欧美日韩精品久久亚洲区 | 色婷婷久久久亚洲一区二区三区 | 91视频在线看 |