DHT11数据的时序分析

DHT11数据的时序分析

a : dht = 1
b :dht = 0
延时30ms
c: dht = 1
卡d点;while(dht );
卡e点 while(!dht)
卡f点:while(dht)
卡g点:while(!dht)
在这里插入图片描述
DHT11传输 0 的时序分析
在这里插入图片描述
DHT11传输 1 的时序分析
在这里插入图片描述
有效数据都是高电平,持续时间不一样,50us读,低电平是0的时序, 高电平是1的时序
在这里插入图片描述
一次完整的数据传输为40bit,高位先出。(40bit = 5个char)
数据格式:
8bit湿度整数数据 + 8bit湿度小数数据 +
8bit温度整数数据 + 8bit温度小数数据 +
8bit校验和
在这里插入图片描述

#include "reg52.h"
#include "intrins.h"

sbit ledOne = P3^7;
sbit dht    = P3^3;

char datas[5];

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 Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void Delay40us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 15;
	while (--i);
}
void DHT11_Start()
{
	// 时序逻辑分析
	// a : dht = 1
	dht = 1;
	// b :dht = 0
	dht = 0;
	// 延时30ms
	Delay30ms();
	// c: dht = 1
	dht = 1;
	// 卡d点;while(dht1);  
	while(dht);
	// 卡e点 while(!dht)
	while(!dht);
	// 卡f点:while(dht)
	while(dht);
}

void Read_Data_From_DHT()
{
	int i,j;
	char tmp;
	char flag;
	DHT11_Start();
	for(i = 0; i < 5; i++){  // 5轮
 		for(j = 0; j < 8; j++){ // 1轮8次
			while(!dht); // 卡g点
			Delay40us();
			if(dht == 1){  
				flag = 1;
				while(dht);  // 如果是1说明是70us,需要等高电平的持续时间完全 走完
			}else{
				flag = 0;
			}
			tmp = tmp << 1;
			tmp |= flag;
		}
		// 8次 = 8bit = 1char
		datas[i] = tmp;
	}
}
	
void main()
{
	ledOne = 1;
	Delay1000ms();
	Delay1000ms();
	DHT11_Start();
	
	while(1){
		Delay1000ms();
		Read_Data_From_DHT();
	}
}

现在没法观察数据是否是正确的,下面通过串口上传数据观察

#include "reg52.h"
#include "intrins.h"

sbit ledOne = P3^7;
sbit dht    = P3^3;

char datas[5];

sfr AUXR = 0x8e;

void UartInit(void)		//9600bps@11.0592MHz
{
	AUXR = 0x01;
	SCON = 0x40; // 配置串口工作方式1,REN不使能接收
	TMOD &= 0x0F; // 高4位清零
	TMOD |= 0x20; // 定时器1工作方式为8位自动重载
	
	TL1 = 0xFD;
	TH1 = 0xFD;  // 9600 波特率的初值
	
	TR1 = 1; //启动定时器
}

void sendByte(char data_msg)
{
	SBUF = data_msg;
	while(!TI);
	TI = 0;
}

void sendString(char *str)
{
	while(*str != '\0'){
		sendByte(*str);
		str++;
	}
}

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 Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay40us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 15;
	while (--i);
}

void DHT11_Start()
{
	// 时序逻辑分析
	// a : dht = 1
	dht = 1;
	// b :dht = 0
	dht = 0;
	// 延时30ms
	Delay30ms();
	// c: dht = 1
	dht = 1;
	// 卡d点;while(dht1);  
	while(dht);
	// 卡e点 while(!dht)
	while(!dht);
	// 卡f点:while(dht)
	while(dht);
}

void Read_Data_From_DHT()
{
	int i,j;
	char tmp;
	char flag;
	DHT11_Start();
	for(i = 0; i < 5; i++){  // 5轮
 		for(j = 0; j < 8; j++){ // 1轮8次
			while(!dht); // 卡g点
			Delay40us();
			if(dht == 1){  
				flag = 1;
				while(dht);  // 如果是1说明是70us,需要等高电平的持续时间完全 走完
			}else{
				flag = 0;
			}
			tmp = tmp << 1;
			tmp |= flag;
		}
		// 8次 = 8bit = 1char
		datas[i] = tmp;
	}
}
	
void main()
{
	ledOne = 1;
	UartInit();
	Delay1000ms();
	Delay1000ms();
	DHT11_Start();
	
	while(1){
		Delay1000ms();
		Read_Data_From_DHT();
		// 8bit湿度整数数据 + 8bit湿度小数数据 + 8bi温度整数数据 + 8bit温度小数数据
		sendString("H:");
		// 8bit湿度整数数据
		sendByte(datas[0]/10 + 0x30); // 43  43/10 = 4  数字4 转字符4 '4' 需要加上0x30
		sendByte(datas[0]%10 + 0x30);
		sendByte('.');
		// 8bit湿度小数数据
		sendByte(datas[1]/10 + 0x30);
		sendByte(datas[1]%10 + 0x30);
		sendString("\r\n");
		
		sendString("T:");
		// 8bi温度整数数据
		sendByte(datas[2]/10 + 0x30);
		sendByte(datas[2]%10 + 0x30);
		sendByte('.');
		// 8bit温度小数数据
		sendByte(datas[3]/10 + 0x30);
		sendByte(datas[3]%10 + 0x30);
		sendString("\r\n");
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值