1.DHT11的時序數據
a : dht = 1
b :dht = 0延時30ms
c: dht = 1
卡d點;while(dht1); 卡e點 while(!dht) 卡f點:while(dht) 卡g點:while(!dht) 有效數據都是高電平,持續時間不一樣,50us讀,低電平0 高電平
知識點:
在計算機中,數字和字符之間的轉換通常是通過 ASCII 碼或 Unicode 碼來完成的。在 ASCII 碼中,數字 4 的表示為 52,而字符 '4' 的表示也是 52。因此,將數字 4 和十六進制數 0x30(在 ASCII 碼中表示數字 '0')相加得到的結果是字符 '4'。
思路:
? ? ? ? main函數進來,先關燈,初始化串口,延遲兩秒整個模塊穩定,while()函數進去(一直)讀取數據,延遲一秒穩定DHT11,開始從DHT11讀取數據存入char datas[5];? 然后sendString() 發溫度 ,分別發送以下圖片數據
BUG:
? ? ? ? 在卡g點的時候給60us給的太多了,對于傳0數據會跳到下一個節點去,給40us最合適
DH11傳輸0的時序分析
DH11傳輸1的時序分析
#include "reg52.h"
#include "intrins.h"sbit ledOne = P3^7;
sbit dht = P3^3;char datas[5];sfr AUXR = 0x8E;void UartInit(void)
{AUXR = 0x01;SCON = 0x40;TMOD &= 0xF0;TMOD |= 0x20;TH1 =0xFD;TL1 =0xFD;TR1 = 1;
}void sendByte(char data_msg)
{SBUF = data_msg;while(!TI); //(TI==0) TI = 0;}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void Delay1000ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void Delay30ms() //@11.0592MHz
{unsigned char i, j;i = 54;j = 199;do{while (--j);} while (--i);
}
void Delay40us() //@11.0592MHz
{unsigned char i;_nop_();i = 15;while (--i);
}void DHT11_Start()
{//一開始是高電平VCC,dht = 1;//拉低dht = 0;//圖片說18ms,我們延遲30ms,Delay30ms();//后,拉高dht = 1;//在60us后讀開始讀數據,D點,如果D點是低電平,模塊被拉低,說明模塊存在//卡D點; while (dht); 卡e點while(!dht)里面是低電平; 卡g點:while(!dht)//有效數據都是高電平,持續時間不一樣而已,50us讀,低電平0 高電平1while(dht);while(!dht);while(dht);}void Read_Data_From_DHT()
{int i; //輪int j; // 每輪讀多少次char tmp;char flag;for(i = 0;i<5;i++){//gfor(j = 0;j<8;j++){while(!dht); // 卡g點:while(!dht) 有效數據是高電平,持續時間不一樣,50us讀,低電平0,高電平1Delay40us(); //BUGif(dht==1){flag = 1;while(dht); // 維持高電平}else{flag = 0;}tmp = tmp << 1;tmp |= flag; // 或上flag 獲取溫濕度數據}datas[i] = tmp;}
}void main()
{ledOne = 1;UartInit(); Delay1000ms();Delay1000ms();while(1){Delay1000ms();Read_Data_From_DHT();//0123分別代表0123個字節sendString("HU:");//溫度//整數sendByte(datas[0]/10 + 0x30); // 比如:把40拿出來變成字符'4';0變成字符'0'sendByte(datas[0]%10 + 0x30);sendByte('.');//小數sendByte(datas[1]/10 + 0x30); // 比如:把40拿出來變成字符'4';0變成字符'0'sendByte(datas[1]%10 + 0x30);sendString("\r\n");sendString("TM:");//濕度//整數sendByte(datas[2]/10 + 0x30); // 比如:把40拿出來變成字符'4';0變成字符'0'sendByte(datas[2]%10 + 0x30);sendByte('.');//小數sendByte(datas[3]/10 + 0x30); // 比如:把40拿出來變成字符'4';0變成字符'0'sendByte(datas[3]%10 + 0x30);sendString("\r\n");}
}