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 高电平1
	while(dht);
	while(!dht);
	while(dht);
	
}
void Read_Data_From_DHT()
{
	int i; //轮
	int j; // 每轮读多少次
	char tmp;
	char flag;
	
	
	for(i = 0;i<5;i++){
		//g
		for(j = 0;j<8;j++){
			while(!dht); 
            
            // 卡g点:while(!dht)  有效数据是高电平,持续时间不一样,50us读,低电平0,高电平1
			Delay40us(); //BUG
			if(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");
	}
}
 
                


















