樓主大四,在做一個(gè)基于 51 的智能晾衣架,其中分別使用了 DS18B20、DHT11 檢測溫、濕度,溫度檢測正常,在 dht11 的程序里,通過調(diào)試發(fā)現(xiàn)程序卡死了,在主函數(shù)里讀不出數(shù)據(jù),也無法執(zhí)行后面的程序,單片機(jī)型號(hào)是 STC 90C52RC ,晶振 11.0592M Hz ,延時(shí)函數(shù)使用燒錄軟件生成,之前參考了這篇文章 http://www.zg4o1577.cn/bbs/dpj-162117-1.htmldht11和ds18b20溫濕度控制 單片機(jī)程序。 燒錄在大二購買的51學(xué)習(xí)模塊【巫妖王】12 MHz 可以正常運(yùn)行,但是燒錄在自己焊接的板子上就出問題了,一度懷疑自己焊接有問題,調(diào)了幾天,累了,遂尋求幫助 。
1、原理圖及PCB
原理圖.png (7.05 MB, 下載次數(shù): 78)
下載附件
2019-11-13 22:39 上傳
PCB.png (4.71 MB, 下載次數(shù): 83)
下載附件
2019-11-13 22:39 上傳
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數(shù)據(jù)接入端
- extern uchar dht11_data[5]; //存儲(chǔ)濕度數(shù)組
- void DHT11_receive();
- #endif
"dht11.c"- #include"dht11.h"
- uchar dht11_data[5]; //存儲(chǔ)濕度數(shù)組
- //1-檢測到響應(yīng)信號(hào) 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;
- }
- /*********************************************************************************************
- 函數(shù)名:DHT11讀數(shù)據(jù)函數(shù)
- 調(diào) 用:? = DHT11_rec_byte();
- 參 數(shù):無
- 返回值:
- 結(jié) 果:讀DHT11數(shù)據(jù)并保存到dat
- 備 注:
- **********************************************************************************************/
- uchar DHT11_rec_byte() //接收一個(gè)字節(jié)
- {
- uchar i,dat=0;
- EA = 0;
- for(i=0;i<8;i++) //從高到低依次接收8位數(shù)據(jù)
- {
- while(DATA);
- while(!DATA); ////等待50us低電平過去
- delay40us();
- dat<<=1; //左移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時(shí)直接移位
- if(DATA) //數(shù)據(jù)為1時(shí),使dat加1來接收數(shù)據(jù)1
- {
- dat |= 0x01;
- }
- while(DATA); //等待數(shù)據(jù)線拉低
- }
- EA = 1;
- return dat;
- }
- /*********************************************************************************************
- 函數(shù)名:接收DHT11的40位的數(shù)據(jù)并校驗(yàn)
- 調(diào) 用:? = DHT11_receive();
- 參 數(shù):無
- 返回值:無
- 結(jié) 果:結(jié)果保存到strx中
- 備 注:
- **********************************************************************************************/
- void DHT11_receive()
- {
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- EA=0;
- DATA=1; // 主線空閑狀態(tài)
- delay10us();
- DATA=0; // 主機(jī)發(fā)送開始工作信號(hào)
- delay20ms(); //延時(shí)18ms以上
- DATA=1; // 拉高并延時(shí)等待DHT11響應(yīng)
- delay30us();
- DATA = 1;
- if(DHT11RstAndCheck())
- {
- delay80us(); //拉高后延時(shí)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(); //結(jié)束
- DATA = 1;
- if((R_H+R_L+T_H+T_L)==revise) //數(shù)據(jù)校驗(yàn)
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
-
- /*數(shù)據(jù)處理,方便顯示*/
- 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、焊接及顯示內(nèi)容
焊接.jpg (2.12 MB, 下載次數(shù): 75)
下載附件
2019-11-13 22:54 上傳
|