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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機,使用DHT11模塊,程序卡死的問題

[復制鏈接]
跳轉到指定樓層
樓主
20黑幣

樓主大四,在做一個基于 51 的智能晾衣架,其中分別使用了 DS18B20、DHT11 檢測溫、濕度,溫度檢測正常,在 dht11 的程序里,通過調試發現程序卡死了,在主函數里讀不出數據,也無法執行后面的程序,單片機型號是 STC 90C52RC ,晶振 11.0592M Hz ,延時函數使用燒錄軟件生成,之前參考了這篇文章 http://www.zg4o1577.cn/bbs/dpj-162117-1.htmldht11和ds18b20溫濕度控制 單片機程序。 燒錄在大二購買的51學習模塊【巫妖王】12 MHz 可以正常運行,但是燒錄在自己焊接的板子上就出問題了,一度懷疑自己焊接有問題,調了幾天,累了,遂尋求幫助 。



1、原理圖及PCB







2、DHT11代碼
"dht11.h"

  • #ifndef __DHT11_H_  
  • #define __DHT11_H_  

  • #include <reg52.h>
  • #include"wifi.h"
  • #include<delay.h>

  • #ifndef uchar
  • #define uchar unsigned char
  • #endif

  • #ifndef uint
  • #define uint unsigned int
  • #endif

  • sbit DATA=P3^6; //溫濕度傳感器DHT11數據接入端

  • extern uchar dht11_data[5];         //存儲濕度數組

  • void DHT11_receive();

  • #endif  



"dht11.c"
  • #include"dht11.h"

  • uchar dht11_data[5];         //存儲濕度數組

  • //1-檢測到響應信號 0-未檢測到
  • uchar DHT11RstAndCheck()
  • {
  •         uchar timer = 0;
  •         
  •         EA = 0;
  •         DATA = 0;
  •         delay20ms();
  •         DATA = 1;
  •         delay30us();
  •         while(!DATA)
  •         {
  •                   timer++;
  •                         _nop_();
  •         }
  •         if(timer>100 || timer<20)
  •         {
  •                  EA = 1;
  •                  return 0;
  •         }
  •         timer = 0;
  •         while(DATA)
  •         {
  •                         timer++;
  •                         _nop_();
  •         }
  •         EA = 1;
  •         if(timer>100 || timer<20)
  •         {
  •                 return 0;
  •         }
  •         return 1;
  • }

  • /*********************************************************************************************
  • 函數名:DHT11讀數據函數
  • 調  用:? = DHT11_rec_byte();
  • 參  數:無
  • 返回值:
  • 結  果:讀DHT11數據并保存到dat
  • 備  注:
  • **********************************************************************************************/
  • uchar DHT11_rec_byte()      //接收一個字節
  • {
  •    uchar i,dat=0;
  •          EA = 0;
  •          for(i=0;i<8;i++)    //從高到低依次接收8位數據
  •    {         
  •                   while(DATA);
  •       while(!DATA);   ////等待50us低電平過去
  •                                         delay40us();
  •       dat<<=1;           //左移位使正確接收8位數據,數據為0時直接移位
  •       if(DATA)    //數據為1時,使dat加1來接收數據1
  •                         {
  •          dat |= 0x01;
  •                         }
  •       while(DATA);  //等待數據線拉低   
  •     }  
  •           EA = 1;
  •     return dat;
  • }

  • /*********************************************************************************************
  • 函數名:接收DHT11的40位的數據并校驗
  • 調  用:? = DHT11_receive();
  • 參  數:無
  • 返回值:無
  • 結  果:結果保存到strx
  • 備  注:
  • **********************************************************************************************/
  • void DHT11_receive()                 
  • {
  •           uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  •           EA=0;
  •     DATA=1;                                 // 主線空閑狀態
  •                         delay10us();
  •     DATA=0;                                 // 主機發送開始工作信號
  •                         delay20ms();   //延時18ms以上
  •     DATA=1;                                 // 拉高并延時等待DHT11響應
  •                         delay30us();
  •           DATA = 1;
  •     if(DHT11RstAndCheck())
  •     {        
  •                                         delay80us();             //拉高后延時80us
  •                                 R_H = DHT11_rec_byte();  //接收濕度高八位
  •                                 R_L = DHT11_rec_byte();  //接收濕度低八位
  •                                 T_H = DHT11_rec_byte();  //接收溫度高八位
  •                                 T_L = DHT11_rec_byte();  //接收溫度低八位
  •                     revise = DHT11_rec_byte();     //接收校正位
  •                           
  •                           DATA = 0;
  •                     delay40us();    //結束
  •                     DATA = 1;
  •                                 if((R_H+R_L+T_H+T_L)==revise)           //數據校驗
  •                                 {
  •                                                 RH=R_H;
  •             RL=R_L;
  •             TH=T_H;
  •             TL=T_L;
  •                                 }
  •                  
  •         /*數據處理,方便顯示*/
  •         dht11_data[0]='0'+(RH/10);
  •         dht11_data[1]='0'+(RH%10);
  •         dht11_data[2]='0'+(TH/10);
  •         dht11_data[3]='0'+(TH%10);
  •                                 dht11_data[4]=RH;        
  •                                 send_table[20]=dht11_data[0];
  •                                 send_table[21]=dht11_data[1];
  •                 }
  • }   


3、焊接及顯示內容



顯示.jpg (563.85 KB, 下載次數: 106)

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

使用道具 舉報

沙發
ID:639532 發表于 2019-11-15 17:55 | 只看該作者
程序我就不看了,給你個思路,一般會你這現象的原因有:1,單片機的中斷標志沒清,導致程序一直跑中斷,不運行主函數;2,中斷的等級沒處理好,有些函數被更高級別的中斷阻塞了;3,用了一些空指針,程序跑飛了;4,內存占滿了;5,某些寄存器會在某些行為(比如觸發中斷)后自動清0,導致你的配置被清了;6,你所使用的單片機這一方面性能不穩定(這個可能非常小這么多年就見過一次,原廠fae都解決不了)

評分

參與人數 1黑幣 +5 收起 理由
Eli_ + 5 贊一個!

查看全部評分

回復

使用道具 舉報

板凳
ID:245004 發表于 2019-11-15 22:47 | 只看該作者
84行到88行的代碼不合適吧?對照數據手冊看看。單片機時鐘必須跟延時函數一致;延時函數盡量放在當前c文件里,不要放在其它文件里;以下代碼僅供參考:
io_DHT11 = 0;                 //主機拉低 >18ms
        Delay25ms();
        io_DHT11 = 1;                //20~40us后從機應答拉低電平
        Delay60us();                 //延時大于(20~40us)
        if(io_DHT11 == 0)         //判斷從機是否響應
        {
                if (DHT11_WaitLevelChange(0) == isNo) return isNo;        //規定時間內電平0是否改變?如果未改變返回isNo
                if (DHT11_WaitLevelChange(1) == isNo) return isNo;        //規定時間內電平1是否改變?如果未改變返回isNo

                i = 0;
                ucArrTemp[i++] = DHT11_ReadByte();
                ucArrTemp[i++] = DHT11_ReadByte();
                ucArrTemp[i++] = DHT11_ReadByte();
                ucArrTemp[i++] = DHT11_ReadByte();
                ucArrTemp[i]   = DHT11_ReadByte();


評分

參與人數 1黑幣 +5 收起 理由
Eli_ + 5 贊一個!

查看全部評分

回復

使用道具 舉報

地板
ID:123289 發表于 2019-11-16 09:17 | 只看該作者
關鍵點:
1、不要用DEALY做延時。
2、等待硬件信號時,要做限時動作,等不到就返回,并標記異常通知主程序。

評分

參與人數 1黑幣 +5 收起 理由
Eli_ + 5 贊一個!

查看全部評分

回復

使用道具 舉報

5#
ID:647620 發表于 2019-11-23 02:16 | 只看該作者
想知道樓主解決了嗎?
。。。表示碰到了一樣的問題 。。把dht11拔了 別的都正常,插上dht11就卡住了  感覺上好像是卡在某個while里面了。。。。。。。作為一個初學者毫無頭緒
回復

使用道具 舉報

6#
ID:647620 發表于 2019-11-23 02:21 | 只看該作者
對了還有個現象 卡住以后 濕度高位不知道為什么變成了255.。。
回復

使用道具 舉報

7#
ID:647620 發表于 2019-11-23 18:57 | 只看該作者
樓主數據線設的P3^6 可是 沒有把端口設置成開漏,可以設置一下試試 。我今天把sda換到P0口  程序不至于卡死了。。雖然取值還不對 。感覺之前卡死是因為從機沒法置低導致開在while判斷上了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美在线视频一区 | 中文字幕亚洲一区二区va在线 | 久草新在线 | 国产东北一级毛片 | 日韩国产在线 | 午夜视频一区 | 少妇一级淫片aaaaaaaaa | 中文字幕在线观看av | 欧洲亚洲一区 | 在线播放中文字幕 | 亚洲国产成人精品女人久久久 | 久久成人久久 | 亚洲一区在线日韩在线深爱 | av一区在线观看 | 国产精品成人一区二区 | 欧美8一10sex性hd | 国产在线视频一区 | 国产99久久精品一区二区300 | 国产一区二区三区www | 免费在线观看一区二区 | 国产一级片91| 日韩一区二区三区精品 | 亚洲视频在线一区 | 蜜桃五月天| 欧美一级二级视频 | 国产乱码久久久久久 | 五月天国产视频 | 亚洲欧美中文日韩在线v日本 | 九九久久精品 | 国产在线一区二区 | 欧美一区二区 | 在线国产视频 | 免费观看色 | 91秦先生艺校小琴 | 看av网址| 欧美在线观看一区 | 在线小视频 | 毛片入口 | 美女日皮网站 | 波多野吉衣在线播放 | 日韩电影免费在线观看中文字幕 |