DHT11传输0的时序分析:
DHT11传输1的时序分析:
用while(dht)卡点,当不满足while时,信号拉低;
用while(!dht)卡点,当不满足while时,信号拉高。
传输0和1时有效数据都是高电平,但持续时间不一样。
在50um后读取数据,低电平为0,高电平为1。
数据格式:
8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验和
由数据格式可知:
读数据:读5轮,一轮读8次
检测到模块之后进行数据读取:
#include "reg52.h"
#include <intrins.h>sbit ledOne = P3^7;
sbit DHT = P3^3; //模块的data接在c51的P3.3口char datas[5];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 Delay60us() //@11.0592MHz
{unsigned char i;i = 25;while (--i);
}//开始
void DTH11_Start()
{DHT = 1; //开始处于 1 位DHT = 0; //拉低至少18ms,这里给它30msDelay30ms(); DHT = 1; //vcc拉高20-40us//DHT响应信号,将高电平拉低持续80us(在40--80us之间读取:低电平——模块存在)//所以在60us的时候读取Delay60us(); while(DHT); //卡点,当不满足while时,信号拉低while(!DHT); //卡点,当不满足while时,信号拉高while(DHT); //卡点,当不满足while时,信号拉低while(!DHT); //卡点,当不满足while时,信号拉高
}//传输数据
void Read_Data_From_DHT()
{//读取数据需要,读5轮,一轮读8次int i; //轮int j; //一轮多少次char tmp; //tmp移位获取数据char flag;DTH11_Start(); //每次读取都需要发送开始for(i = 0;i < 5;i++){for(j = 0;j < 8;j++){while(!DHT); //卡点,当不满足while时,信号拉高Delay60us(); //在60um后读取数据,低电平为0,高电平为1。if(DHT == 1){flag = 1;while(DHT);}else{flag = 0;}tmp = tmp << 1; //tmp左移一位tmp |= flag;}datas[i] = tmp;}
}void main()
{ledOne = 1; //灭灯Delay1000ms();Delay1000ms();while(1){Delay1000ms();Read_Data_From_DHT();}
}