找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3157|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

關(guān)于DHT11溫濕度傳感器的問題。

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:114626 發(fā)表于 2016-4-18 10:53 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <reg51.h>
#include <intrins.h>   
typedef unsigned char  U8;  /* defined for unsigned 8-bits integer variable 無符號(hào)8位整型變量  */      
typedef signed   char  S8;  /* defined for signed 8-bits integer variable    有符號(hào)8位整型變量  */
typedef unsigned int   U16; /* defined for unsigned 16-bits integer variable 無符號(hào)16位整型變量 */
typedef signed   int   S16; /* defined for signed 16-bits integer variable    有符號(hào)16位整型變量 */
typedef unsigned long  U32; /* defined for unsigned 32-bits integer variable  無符號(hào)32位整型變量 */  
typedef signed   long  S32; /* defined for signed 32-bits integer variable    有符號(hào)32位整型變量 */  
typedef float          F32; /* single precision floating point variable (32bits) 單精度浮點(diǎn)數(shù)(32位長(zhǎng)度) */  
typedef double         F64; /* double precision floating point variable (64bits) 雙精度浮點(diǎn)數(shù)(64位長(zhǎng)度) */   
#define uchar unsigned char
#define uint unsigned int
#define   Data_0_time    4   // 這個(gè)宏定義是什么意思,有什么用?
//----------------------------------------------//
//----------------IO口定義區(qū)--------------------//
//----------------------------------------------//
sbit  P2_0  = P2^0   
//----------------------------------------------//
//----------------定義區(qū)------------------    --//  
//----------------------------------------------//
U8  U8FLAG,k; //這里定義的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];  //定義發(fā)送的字節(jié)數(shù)  
U8  indata[5];
U8  count, count_r=0;
U8  str[5]={"RS232"};
U16 U16temp1,U16temp2;
SendData(U8 *a)
{   
  outdata[0] = a[0];   
  outdata[1] = a[1];  
  outdata[2] = a[2];  
  outdata[3] = a[3];  
  outdata[4] = a[4];  
  count = 1;   
  SBUF=outdata[0];
}          //這里用keil編譯,提示missing return valve 沒有返回值怎么能把數(shù)據(jù)傳輸給高速寄存器?
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;        
       if(P2_0)
       U8temp=1;                  //判斷數(shù)據(jù)位是0還是1      
       U8FLAG=2;     
       while((P2_0)&&U8FLAG++);   //超時(shí)則跳出for循環(huán)     
       if(U8FLAG==1)break;        // 如果高電平高過預(yù)定0高電平值則數(shù)據(jù)位為 1         
       U8comdata<<=1;      
       U8comdata|=U8temp;              
      }  
}   
//--------------------------------  
//-----濕度讀取子程序 ------------
//--------------------------------  
//----以下變量均為全局變量--------  
//----溫度高8位== U8T_data_H------  
//----溫度低8位== U8T_data_L------  
//----濕度高8位== U8RH_data_H-----  
//----濕度低8位== U8RH_data_L-----  
//----校驗(yàn) 8位 == U8checkdata-----  
//----調(diào)用相關(guān)子程序如下----------
//---- Delay();
Delay_10us();
COM();  
//--------------------------------   
void RH(void)  
{        
  P2_0=0;     
  Delay(180); //主機(jī)拉低18ms         
  P2_0=1;        
  Delay_10us();     
  Delay_10us();   
  Delay_10us();     
  Delay_10us(); //總線由上拉電阻拉高 主機(jī)延時(shí)20us   
                //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)     
  P2_0=1;      //判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行   
  if(!P2_0)   //T !  
  {   
    U8FLAG=2;      
    while((!P2_0)&&U8FLAG++);   //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束   
    U8FLAG=2;   
    while((P2_0)&&U8FLAG++); //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)           
    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; //數(shù)據(jù)接收狀態(tài)     
    P2_0=1;   //數(shù)據(jù)校驗(yàn)        
    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  串口發(fā)  
//送溫濕度數(shù)據(jù),波特率 9600   
//----------------------------------------------
void main()
{  
// U8  i,j;   
//uchar str[6]={"RS232"};  /* 系統(tǒng)初始化 */   
  TMOD = 0x20;       //定時(shí)器T1使用工作方式2
  TH1 = 253;         
  TL1 = 253;         // 設(shè)置初值
  TR1 = 1;           // 開始計(jì)時(shí)         
  SCON = 0x50;       //工作方式1,波特率9600bps,允許接收     
  ES = 1;  
  EA = 1;            // 打開所用中斷   
  TI = 0;  
  RI = 0;   
  SendData(str)     //發(fā)送到串口   
  Delay(1);         //延時(shí)100US(12M晶振)        
while(1)
   {        
   //------------------------     
   //調(diào)用溫濕度讀取子程序      
   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)       //發(fā)送到串口            
Delay(20000);        //讀取模塊數(shù)據(jù)周期不易小于 2S
    }
}
void RSINTR() interrupt 4 using 2
{ U8 InPut3;   
  if(TI==1) //發(fā)送中斷  
  {   
   TI=0;   
     if(count!=5) //發(fā)送完5位數(shù)據(jù)   
     {      
       SBUF= outdata[count];   
       count++;
     }
   }   
   if(RI==1)  //接收中斷   
{     
   InPut3=SBUF;  
   indata[count_r]=InPut3;
   count_r++;   
   RI=0;           
  if(count_r==5)//接收完5位數(shù)據(jù)   
   {   
  count_r=0;   
  str[0]=indata[0];   
  str[1]=indata[1];      
  str[2]=indata[2];     
  str[3]=indata[3];     
  str[4]=indata[4];     
  P0=0;         //數(shù)據(jù)接收完畢處理。//這里的P0是什么意思?前面完全沒有定義過這一位吧?
   }   
  }  
}
希望各位能幫幫忙,最近一直在看,有的也看懂了,可以上面的紅色標(biāo)注的幾點(diǎn)一直沒明白,還有就只在開發(fā)板上測(cè)試時(shí)收到的數(shù)據(jù)全是0,是不是時(shí)序有問題?春枚喽颊f這個(gè)程序能用能用,自己用的時(shí)候還是有問題啊,請(qǐng)各位幫幫忙。

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:114626 發(fā)表于 2016-4-19 08:50 | 只看該作者
沒人來啊,好冷清
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表