![]() |
發布時間: 2019-3-1 08:57
正文摘要:STC89C52單片機(晶振 11.0592M),連接DHT11。按照DHT11說明書,編程設計好時序后,通電開始測試。 但是無數次地測試,也用了很多網上找到的據說是實測有用的代碼,都不能完整地讀出40bit的數據。 通過測試發現主要 ... |
晶振對了? |
先接一下上拉電阻,還不行就檢查一下延時的時間有沒有問題 |
慕蕓 發表于 2020-2-9 11:30 你好! 1、首先要硬件連接沒錯 2、基本就是程序的問題 |
同樣的問題,怎么解決 |
我也有這個問題,怎么解決的呢 |
你看看有沒有按照要求接上上拉電阻,沒接肯定不行的,有的開發板是直接在上面就已經接好了 |
一二三亖 發表于 2019-4-30 14:19 怎么解決的? |
一定要接5K的上拉電阻!!!!! |
我之前也遇到過類似的問題 |
我之前也遇到過類似的問題 |
找到問題是什么了嗎 我也遇到這個問題了 |
一二三亖 發表于 2019-4-30 14:19 我的搞定了 |
周英俊 發表于 2019-3-28 10:55 我的也是 ,,,,stc12的 |
我的也有問題,傳感器根本不響應。 |
解決了嗎 兄弟 我現在也遇到了相同問題 |
不一定是程序問題哦。 數據線一定、一定、一定要接10K的上拉電阻!!!!! |
續繼,續繼,期待更精彩 |
網上的程序可能是1t單片機的延時時間不對,建議你找一個51開發板附帶的程序試試,絕對可以,問題肯定出在延時上 |
注意延時長度在范圍內即可。 |
sbit Sensor_SDA = P1^2; //定義DHT11端口SDA // 變量定義 unsigned char Sensor_Data[5]={0x00,0x00,0x02d,0x2d,0x00}; unsigned char Sensor_Check; //校驗和 unsigned char Sensor_AnswerFlag; //收到起始標志位 unsigned char Sensor_ErrorFlag; //讀取傳感器錯誤標志 unsigned int Sys_CNT; unsigned int Tmp; unsigned char *String; #define S_Temp "Temp:" #define S_RH "RH:" #define S_CRCT "Check: True" #define S_CRCF "Check: Wrong" #define S_Data "Data: " #define S_NotS "Sensor Not Connected" unsigned char code cdis1[ ] = {" Check: True "}; unsigned char code cdis2[ ] = {" Check: Wrong "}; unsigned char code cdis3[ ] = {" DHT11 ERR0R "}; /*******************************************************************/ /* */ /* 數據轉換與濕度、溫度顯示 */ /* */ /*******************************************************************/ Disp_Temperature() { unsigned char m=0; if(Sensor_AnswerFlag == 1) { Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3]; //校驗成功 if(Sensor_Check ==Sensor_Data[4]) { unsigned char s=0; Tmp=Sensor_Data[0]+0x06; //RH display[1]=Tmp%10+0x30; display[0]=Tmp/10+0x30; if(display[0]==0x30) //高位為0,不顯示 { display[0]=0x20; if(display[1]==0x30) //次高位為0,不顯示 display[1]=0x20; } lcd_pos(0x08,1); lcd_wdat(display[0],1); //十位數顯示 lcd_wdat(display[1],1); //個位數顯示 Tmp=Sensor_Data[2]; //Temp display[1]=Tmp%10+0x30; display[0]=Tmp/10+0x30; if(display[0]==0x30) //高位為0,不顯示 { display[0]=0x20; if(display[1]==0x30) //次高位為0,不顯示 display[1]=0x20; } lcd_pos(0x46,1); lcd_wdat(display[0],1); //十位數顯示 lcd_wdat(display[1],1); //個位數顯示 }else //校驗失敗 送上讀到數據 { lcd_pos(0x40,2); for(m=0;m<16;m++) //顯示字符 lcd_wdat(cdis2[m],2); Delay_N1ms(36000); // 延時 2S(兩次讀取間隔至少2S) } }// 傳感器未連接 else { lcd_pos(0x40,2); for(m=0;m<16;m++) //顯示字符 lcd_wdat(cdis3[m],2); Delay_N1ms(36000); // 延時 2S(兩次讀取間隔至少2S) } } /********************************************\ |* 功能: 讀傳感器發送的單個字節 *| \********************************************/ unsigned char Read_SensorData(void) { unsigned int i,cnt; unsigned char buffer,tmp; buffer = 0; for(i=0;i<8;i++) { cnt=0; while(!Sensor_SDA) //檢測上次低電平是否結束 { if(++cnt >= 3600) { break; } } //延時Min=26us Max50us 跳過數據"0" 的高電平 Delay(48); //延時30us //判斷傳感器發送數據位 tmp =0; if(Sensor_SDA) { tmp = 1; } cnt =0; while(Sensor_SDA) //等待高電平 結束 { if(++cnt >= 2400) { break; } } buffer <<=1; buffer |= tmp; } return buffer; } /********************************************\ |* 功能: 讀傳感器 *| \********************************************/ unsigned char Read_Sensor(void) { unsigned char i; //主機拉低(Min=800US Max=20Ms) Sensor_SDA = 0; Delay_N1ms(216); //延時20Ms //釋放總線 延時(Min=30us Max=50us) Sensor_SDA = 1; Delay_N10us(36);//延時30us //主機設為輸入 判斷傳感器響應信號 Sensor_SDA = 1; Sensor_AnswerFlag = 0; // 傳感器響應標志 //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行 if(Sensor_SDA ==0) { Sensor_AnswerFlag = 1; //收到起始信號 Sys_CNT = 0; //判斷從機是否發出 80us 的低電平響應信號是否結束 while((!Sensor_SDA)) { if(++Sys_CNT>1200) { Sensor_ErrorFlag = 1; //防止進入死循環 return 0; } } Sys_CNT = 0; //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態 while((Sensor_SDA)) { if(++Sys_CNT>1200) { Sensor_ErrorFlag = 1; //防止進入死循環 return 0; } } // 數據接收 傳感器共發送40位數據 // 即5個字節 高位先送 5個字節分別為濕度高位 濕度低位 溫度高位 溫度低位 校驗和 // 校驗和為:濕度高位+濕度低位+溫度高位+溫度低位 for(i=0;i<5;i++) { Sensor_Data[i] = Read_SensorData(); } } else { Sensor_AnswerFlag = 0; // 未收到傳感器響應 } return 1; } void Clear_Data (void) { int i; for(i=0;i<5;i++) { Sensor_Data[i] = 0x2d; }//接收數據清零 } |