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