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");}
}