12:DHT11温湿度传感器的使用

1、结构说明

1.1、引脚

   此模块一个有3个引脚,分别为VCC,GND,DATA引脚。而DATA引脚则用于数据传输,且连接着一个上拉电阻,模块闲置的时候,引脚输入为高电平。
在这里插入图片描述

1.2、单向串行通信

   此模块通信都是通过DATA这一个引脚,所以是在数据传输的时候是单向串行通信的。(1)一次完整的数据传输为40bit,高位先出。

①一次完整的数据传输为40bit,高位先出。
② 数据格式:
(8bit湿度整数数据 + 8bit湿度小数数据) + (8bi温度整数数据 + 8bit温度小数数据) + 8bit校验和
③数据传送正确时,校验和数据等于
“8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据”所得结果的末8位

在这里插入图片描述

1.3、通信时序

如下图:单片机想要使用此传感器时,将引脚连接好后,给DATA引脚输入一个低电平的起始信号。然后在给一个高电平用于等待响应。(为什么要给一个高电平用于等待响应喃?原因:因为DATA在闲置时连接着一个上拉电阻,在闲置时引脚输入为高电平,单片机给引脚一个低电平后用于起始信号,然后给高电平代表将引脚的控制权交给模块自己)如果模块检测到这个起始信号,则模块会给DATA引脚输出一个低电平的响应信号,然后开始给DATA引脚一个高电平的信号,准备发送数据。
在这里插入图片描述

单片机的起始信号的时间和模块应答的时间不同

在这里插入图片描述

单片机通过判断DATA引脚的高电平的持续时间,判断传输来的是0还是1。

在这里插入图片描述
在这里插入图片描述

2、代码程序

DHT11.c文件

#include <REGX52.H>
#include "Delay.h"

sbit dht = P3^3;

unsigned char Data[5];
char hum[9];
char tmper[9];

/*
	模块的初始化
*/
void Dht_Init(void)
{
	dht = 1;
	dht = 0;
	Delay30ms();//单片机发出起始信号
	dht = 1;
	Delay40us();
	while(dht);//如果还在主机拉高,则卡在这里,当模块进入响应信号退出循环
	while(!dht);//模块发出响应信号,则卡此循环,模块拉高,退出循环
	while(dht);//进入模块DHT拉高,准备发送数据则卡在这里,开始传输数据退出循环
}

/*
	读取模块的数据
*/
void Dht_Read(void)//读取数据
{
	unsigned char i,j;
	char flag;
	char shuju;
	
	Dht_Init();
	for(i = 0; i<5; i++)
	{
	  for(j = 0; j<8; j++)
		{
		  while(!dht);//如果在低电平一直卡在这里,进入拉高时退出循环,然后判断拉高时间来断定是0还是1
			Delay40us();//延迟40us后进行判断
			if(dht == 0)
			{
			  flag = 0;
			}
			else
			{
			  flag = 1;
				while(dht);
			}
			shuju = shuju << 1;//每次循环hum左移1位
			shuju += flag;
		}//循环8次后,hum就得到了8位二进制
		Data[i] = shuju;
	}//循环5次后,Data是40位二进制,代表这湿度,温度,校验位数据
}

void Dht_Humidity()//对湿度数据的处理
{
  Dht_Read();
	hum[0] = 'H';
	hum[1] = ';';
	//Data[0]的是湿度的整数数据
	//Data[1]的是湿度的小数数据
	hum[2] = Data[0] / 10 + '0';//转换位字符,方便显示
	hum[3] = Data[0] % 10 + '0';	
	hum[4] = '.';
	hum[5] = Data[1] / 10 + '0';
	hum[6] = Data[1] % 10 + '0';
	hum[7] = '%';
	hum[8] = '\0';
}

void Dht_temper()//对温度数据的处理
{
  Dht_Read();
	tmper[0] = 'T';
	tmper[1] = ';';
	//Data[0]的是湿度的整数数据
	//Data[1]的是湿度的小数数据
	tmper[2] = Data[2] / 10 + '0';//转换位字符,方便显示
	tmper[3] = Data[2] % 10 + '0';	
	tmper[4] = '.';
	tmper[5] = Data[3] / 10 + '0';
	tmper[6] = Data[3] % 10 + '0';
	tmper[7] = 'C';
	tmper[8] = '\0';
}

主函数main.c文件

#include <REGX52.H>
#include "Delay.h"
#include "dth.h"
#include "Uart.h"

extern char hum[9];//变量在dht.c文件里面
extern char tmper[9];


void main(void)
{
	Delay1000ms();//DHT11的供电电压为3~5.5 V。传感器上电后,要等待 1s 以越过不稳定状态,在此期间无需发送任何指令。
	while(1)
	{
	    Dht_Humidity();
		Delay30ms();
        Dht_temper();
        Delay30ms();
		sendString(hum);
		sendString(" ");
		sendString(tmper);
		sendString(" ");
	}
}

在这里插入图片描述

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值