找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)+DHT11讀不出數(shù)據(jù)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:884998 發(fā)表于 2021-2-19 22:12 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
寫了一個DHT11溫度計(jì),用lcd1602顯示,lcd1602的程序肯定是沒錯的,用了許多次。DHT11的函數(shù)里面用了while語句,所以現(xiàn)在就好像是卡在讀取程序的函數(shù)里面了,這個模塊我之前用別人的程序測試過也是好用的,延時函數(shù)由STC-isp提供,應(yīng)該也沒錯。

下面是單片機(jī)代碼
  1. void DHT11Start()     //發(fā)送開始信號
  2. {
  3.     DHT11data = 1;
  4.     DHT11data = 0;
  5.     Delay20ms();
  6.     DHT11data = 1;
  7.     Delay30us();
  8. }

  9. uchar DHT11GetByte()  //獲得一組8bit數(shù)據(jù)
  10. {
  11.     uchar byte = 0;
  12.     uint i;
  13.     for(i=0;i<8;i++)
  14.     {
  15.         while(!DHT11data);
  16.         Delay30us();
  17.         Delay30us();
  18.         byte <<= 1;
  19.         if(DHT11data == 1)
  20.         { byte += 1; }
  21.         while(DHT11data);
  22.     }
  23.     return byte;
  24. }


  25. void DHT11GetData(uchar *dat)                         //獲得所有數(shù)據(jù)
  26. {
  27.     uchar check,datbuffer[4]={0,0,0,0};
  28.   uchar datcheck[4]={0,0,0,0};    //濕度十位,濕度個位,溫度十位,溫度個位
  29.     uint i,num;
  30.    
  31.     DHT11Start();
  32.     if(DHT11data == 0)
  33.     {
  34.         while(DHT11data == 0);
  35.         Delay80us();
  36.    
  37.         datbuffer[0] = DHT11GetByte();
  38.         datbuffer[1] = DHT11GetByte();
  39.         datbuffer[2] = DHT11GetByte();
  40.         datbuffer[3] = DHT11GetByte();
  41.         
  42.         check = DHT11GetByte();
  43.         Delay30us();
  44.         num = datbuffer[0]+datbuffer[1]+datbuffer[2]+datbuffer[3];
  45.         if(check == num)
  46.             {
  47.                 for(i=0;i<4;i++)
  48.                 {
  49.                     datcheck[i] = datbuffer[i];
  50.                 }
  51.             }
  52.             dat[0] = (datcheck[0]/10)+'0';
  53.             dat[1] = (datcheck[1]%10)+'0';
  54.             dat[2] = (datcheck[2]/10)+'0';
  55.             dat[3] = (datcheck[3]%10)+'0';
  56.             
  57. //            dat[0] = (datbuffer[0]/10)+'0';
  58. //            dat[1] = (datbuffer[1]%10)+'0';
  59. //            dat[2] = (datbuffer[2]/10)+'0';
  60. //            dat[3] = (datbuffer[3]%10)+'0';

  61.     }
  62. }
復(fù)制代碼


DHT11.zip

44.53 KB, 下載次數(shù): 26

這是工程文件

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

使用道具 舉報(bào)

沙發(fā)
ID:871393 發(fā)表于 2021-2-19 22:28 | 只看該作者
DHT11 data是全局變量嗎 在哪更新 不更新就會死在while里
回復(fù)

使用道具 舉報(bào)

板凳
ID:884998 發(fā)表于 2021-2-19 22:59 來自手機(jī) | 只看該作者
77599585 發(fā)表于 2021-2-19 22:28
DHT11data是全局變量嗎 在哪更新 不更新就會死在while里

DHT11data不是個變量,是dht11的io口,前面有句我沒放上來是,是:sbit DHT11data = P2^1
回復(fù)

使用道具 舉報(bào)

地板
ID:844772 發(fā)表于 2021-2-20 09:30 | 只看該作者
它不是IIC設(shè)備,你delay時間安排的不大對啊,比如while(DHT11data == 0);         Delay80us();前一句已經(jīng)等待掉這80
回復(fù)

使用道具 舉報(bào)

5#
ID:884998 發(fā)表于 2021-2-20 16:59 | 只看該作者
glinfei 發(fā)表于 2021-2-20 09:30
它不是IIC設(shè)備,你delay時間安排的不大對啊,比如while(DHT11data == 0);         Delay80us();前一句已經(jīng) ...

你這么一說確實(shí),這個地方相當(dāng)于延遲了兩遍,但我這個代碼是參考別人的寫的,他那個程序就能讀出了,我的就不行,我把那個delay80刪除之后還是讀不出來
回復(fù)

使用道具 舉報(bào)

6#
ID:884998 發(fā)表于 2021-2-20 17:35 | 只看該作者
  1.     void DHT11_start()                 // 主機(jī)控制DHT11開始工作
  2.     {
  3. //       DATA=1;                                 // 主線空閑狀態(tài)
  4. //       _nop_();
  5. //       _nop_();
  6.        DATA=0;                                 // 主機(jī)發(fā)送開始工作信號
  7.        Delay20ms();   //延時18ms以上
  8.        DATA=1;                                 // 拉高并延時等待DHT11響應(yīng)
  9.        Delay30us();
  10.     }
  11.     /*********************************************************************************************
  12.     函數(shù)名:DHT11讀數(shù)據(jù)函數(shù)
  13.     調(diào)  用:? = DHT11_rec_byte();
  14.     參  數(shù):無
  15.     返回值:
  16.     結(jié)  果:讀DHT11數(shù)據(jù)并保存到dat
  17.     備  注:
  18.     **********************************************************************************************/

  19.     uchar DHT11_rec_byte()      //接收一個字節(jié)
  20.     {
  21.        uchar i,dat=0;
  22.       for(i=0;i<8;i++)    //從高到低依次接收8位數(shù)據(jù)
  23.        {         
  24.           while(!DATA);   ////等待50us低電平過去
  25.           Delay30us();
  26.               Delay30us();     //延時60us,如果還為高則數(shù)據(jù)為1,否則為0
  27.           dat<<=1;           //左移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時直接移位
  28.           if(DATA==1)    //數(shù)據(jù)為1時,使dat加1來接收數(shù)據(jù)1
  29.              dat+=1;
  30.           while(DATA);  //等待數(shù)據(jù)線拉低   
  31.         }  
  32.         return dat;
  33.     }

  34.     /*********************************************************************************************
  35.     函數(shù)名:接收DHT11的40位的數(shù)據(jù)并校驗(yàn)
  36.     調(diào)  用:? = DHT11_receive();
  37.     參  數(shù):無
  38.     返回值:無
  39.     結(jié)  果:結(jié)果保存到dat_r[i]中
  40.     備  注:
  41.     **********************************************************************************************/
  42.     void DHT11_receive()      //接收40位的數(shù)據(jù)
  43.     {
  44.         uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  45.         DHT11_start();                 // 主機(jī)控制DHT11開始工作
  46.         if(DATA==0)
  47.         {
  48.             while(DATA==0);   //等待拉高     
  49.             Delay30us();
  50.                     Delay30us();
  51.                     Delay30us();  //拉高后延時80us
  52.             R_H=DHT11_rec_byte();    //接收濕度高八位  
  53.             R_L=DHT11_rec_byte();    //接收濕度低八位  
  54.             T_H=DHT11_rec_byte();    //接收溫度高八位  
  55.             T_L=DHT11_rec_byte();    //接收溫度低八位
  56.             revise=DHT11_rec_byte(); //接收校正位

  57. //            Delay30us();    //結(jié)束

  58.             if((R_H+R_L+T_H+T_L)==revise)      //校正
  59.             {
  60.                 RH=R_H;
  61.                 RL=R_L;
  62.                 TH=T_H;
  63.                 TL=T_L;
  64.             }
  65.             /*數(shù)據(jù)處理,方便顯示*/
  66.             dat_r[0]='0'+(RH/10);
  67.             dat_r[1]='0'+(RH%10);
  68.             dat_r[2]='0'+(TH/10);
  69.             dat_r[3]='0'+(TH%10);

  70.         }
  71.     }
復(fù)制代碼


這是我測試時用的代碼,我實(shí)在找不出和我寫的有啥區(qū)別,可是我的程序就是讀不出數(shù)據(jù),dat_r是個全局變量
回復(fù)

使用道具 舉報(bào)

7#
ID:112099 發(fā)表于 2021-2-21 08:40 | 只看該作者
樓主有試過仿真看是卡死在哪里?你用的是什么單片機(jī)?IO口設(shè)置對嗎?
回復(fù)

使用道具 舉報(bào)

8#
ID:155507 發(fā)表于 2021-2-21 09:34 | 只看該作者
MirrAKe 發(fā)表于 2021-2-20 17:35
這是我測試時用的代碼,我實(shí)在找不出和我寫的有啥區(qū)別,可是我的程序就是讀不出數(shù)據(jù),dat_r是個全局變 ...

求助之前,自己先別急,靜下心來,仔細(xì)檢查代碼有沒有錯誤;程序處理邏輯有沒有問題。必要的話,各變量隨著處理流程的值變化,列成清單。

建議你先畫個流程,先在流程圖上走通,再與程序!

對于控制一些對時序要求比較高的外部器件,可以根據(jù)MCU時鐘頻率,用單片機(jī)助手之類的工具計(jì)算延時很方便。

DHT11溫濕度傳感器中文資料分析
http://www.torrancerestoration.com/bbs/dpj-30362-1.html
回復(fù)

使用道具 舉報(bào)

9#
ID:844772 發(fā)表于 2021-2-22 17:09 | 只看該作者
//       DATA=1;                                 // 主線空閑狀態(tài)
//       _nop_();
//       _nop_();
這幾句也需要的
回復(fù)

使用道具 舉報(bào)

10#
ID:887027 發(fā)表于 2021-2-28 14:30 | 只看該作者
一個是dht11是不是不同,現(xiàn)在dht11好像有兩種,最好你有在用的dht11的datasheet。第二你接個邏輯分析儀上去,看看dht11的信號時序。
回復(fù)

使用道具 舉報(bào)

11#
ID:390243 發(fā)表于 2021-3-16 21:51 | 只看該作者
請問樓主解決了嗎?我也遇到和你一樣的問題了。。
回復(fù)

使用道具 舉報(bào)

12#
ID:889832 發(fā)表于 2021-3-17 15:50 | 只看該作者
細(xì)節(jié)決定成敗,加油相信你,反正我的  dht11  可以
回復(fù)

使用道具 舉報(bào)

13#
ID:884998 發(fā)表于 2021-3-20 11:04 | 只看該作者
LOGLOG6 發(fā)表于 2021-3-16 21:51
請問樓主解決了嗎?我也遇到和你一樣的問題了。。

當(dāng)時時解決了,按照人家的例程完全照搬就好使,甚至for循環(huán)中的i 從unsigned char變成unsigned int都會讀不出來,至于為什么,我不知道,后來還有個奇怪的事,當(dāng)天晚上改完好用,第二天早上,就讀不出來了,然后一直到現(xiàn)在,我也再沒讀出過正確數(shù)據(jù)
回復(fù)

使用道具 舉報(bào)

14#
ID:915884 發(fā)表于 2021-5-11 14:45 | 只看該作者
MirrAKe 發(fā)表于 2021-3-20 11:04
當(dāng)時時解決了,按照人家的例程完全照搬就好使,甚至for循環(huán)中的i 從unsigned char變成unsigned int都會讀 ...

我也是這樣,樓主后續(xù)有跟進(jìn)嗎,我測試了一下我是卡在while(Data); 這句上了,一刪掉就能顯示,不過數(shù)據(jù)不對,好像一直無法拉低數(shù)據(jù)線
回復(fù)

使用道具 舉報(bào)

15#
ID:915884 發(fā)表于 2021-5-12 13:20 | 只看該作者
dellte 發(fā)表于 2021-5-11 14:45
我也是這樣,樓主后續(xù)有跟進(jìn)嗎,我測試了一下我是卡在while(Data); 這句上了,一刪掉就能顯示,不過數(shù)據(jù) ...

解決了,加了個上拉電阻就能讀到數(shù)據(jù)了
回復(fù)

使用道具 舉報(bào)

16#
ID:1082926 發(fā)表于 2023-6-9 00:00 | 只看該作者
dellte 發(fā)表于 2021-5-11 14:45
我也是這樣,樓主后續(xù)有跟進(jìn)嗎,我測試了一下我是卡在while(Data); 這句上了,一刪掉就能顯示,不過數(shù)據(jù) ...

請問后來解決了嗎,我也是卡在while循環(huán)里面了
回復(fù)

使用道具 舉報(bào)

17#
ID:1004455 發(fā)表于 2023-6-9 17:02 | 只看該作者
IO口要設(shè)置一下
回復(fù)

使用道具 舉報(bào)

18#
ID:1101718 發(fā)表于 2024-7-12 15:34 | 只看該作者
dellte 發(fā)表于 2021-5-12 13:20
解決了,加了個上拉電阻就能讀到數(shù)據(jù)了

IIC好像需要上拉電阻才可以穩(wěn)定通訊
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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