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,这里给它30ms
Delay30ms();
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();
}
}