51单片机与DHT11温湿传感器

本文详细介绍了DHT11传感器的产品概述、特点、数据传送逻辑(包括0和1信号表示)、检测模块存在的方式以及数据传输过程,重点讲解了如何通过单片机实现与传感器的通信和数据解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、产品概述

2、产品特点

3、数据传送逻辑

4、数据格式 

5、检测模块是否存在

6、数据传输

6.1数字0信号的表示方法

6.2数字1信号表示方法

1、产品概述

DHT11数字温湿度传感器是一款含有已校准数字信号输出温湿度符合传感器,应用领域:温通空调;汽车;消费品;气象站;湿度调节器;除湿器;家电;医疗;自动控制

2、产品特点

相对湿度和温度的测量

全部校准,数字输出

长期稳定

超长的信号传输距离:20米

超低能耗:休眠

4引脚安装:我们这里用到的是封装好的

完全交换:直接出结果不用转化

3、数据传送逻辑

封装好的一共有3根引脚分别是GND、VCC、DATA,这里只有一根数据线DATA,单片机发送序列指令给DHT11模块,模块一次完整的数据传输为40bit,高位先出

4、数据格式 

8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据        +8bit校验

数据通讯过程时序图

主机与模块的通信过程

总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须要大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后DHT11发送80us低电平响应信号,主机发送开始信号结束后,延时等待20-40us后读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。

5、检测模块是否存在

用户MCU发送一次开始信号后,DHT11从低功耗模式转换为高功耗模式,等待主机开始信号结束后,DHT11发送响应信号(总线为低电平,说明DHT11发送响应信号)

检测信号代码

sbit Dht11 = P3^3;
//Dht11 Data接线
void DHT11_DSR()
{
	Dht11 = 1;
	_nop_();
	_nop_();//给延时
	Dht11 = 0;
	Delay30ms();//拉低30ms
	Dht11 = 1;
	while(Dht11);//DHT响应信号	
	while(!Dht11);//DHT拉高
	while(Dht11);//准备开始发送信号	
	led1 = 0;//让小灯亮

}

当模块响应时灯会亮

6、数据传输

首先我们要先对传输的信号进行判断

6.1数字0信号的表示方法

6.2数字1信号表示方法

根据两个时序图我们可以发现1和0的区分要根据高电平的持续时间,这里我们可以在总线高电平之后延时40us然后再对电位进行测量如果时高电平则此时传输的数据就是1反之则为0

char Data[5];//对传感器的数据进行存储
void DHT11TransferData()
{
	char cmd;
	char flag;
	int i,j;
	DHT11_DSR();//每次数据传输之前都要对模块进行唤醒也就是检测是否存在
	for(i = 0;i < 5;i++){//5bit数据
		for(j = 0;j < 8;j++){//1bit=8个二进制位
		while(!Dht11);//卡总线变为高电平的点
		Delay40us();//延时40us进行电位检测
		if(Dht11 == 1){
			//flag = 1;
		cmd <<= 1;//位运算
		cmd |= Dht11;
			while(Dht11);
		}else{
			//flag=0;
		cmd <<= 1;//位运算
		cmd |= Dht11;
		}
		//cmd <<= 1;//位运算
		//cmd |= flag;
	}
	Data[i] = cmd;
}
	led2 = 0;
}
	

对DHT11的操作就这些了,我们获取了数据但是我们看不到,这里先用串口接收数据在串口上进行显示具体代码

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

sbit led1 = P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第7口
sbit led2 = P3^6;//根据原理图(电路图),设备变量led2指向P3组IO口的第6口
sbit Dht11 = P3^3;
sfr AUXR = 0x8e;

char Data[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 Delay40us()		//@11.0592MHz
{
	unsigned char i;
	_nop_();
	i = 15;
	while (--i);
}

void Delay30ms()		//@11.0592MHz
{
	unsigned char i, j;
	i = 54;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

void DHT11_DSR()
{
	Dht11 = 1;
	_nop_();
	_nop_();
	Dht11 = 0;
	Delay30ms();
	Dht11 = 1;
	while(Dht11);//DHT响应信号	
	while(!Dht11);//DHT拉高
	while(Dht11);//准备开始发送信号	
	led1 = 0;

}

void DHT11TransferData()
{
	char cmd;
	char flag;
	int i,j;
	DHT11_DSR();
	for(i = 0;i < 5;i++){
		for(j = 0;j < 8;j++){
		while(!Dht11);
		Delay40us();
		if(Dht11 == 1){
			//flag = 1;
		cmd <<= 1;//位运算
		cmd |= Dht11;
			while(Dht11);
		}else{
			//flag=0;
		cmd <<= 1;//位运算
		cmd |= Dht11;
		}
		//cmd <<= 1;//位运算
		//cmd |= flag;
	}

	Data[i] = cmd;
}
	led2 = 0;

}
	

void UART0_Init(){//串口初始化
	SCON  = 0x50;
	PCON &= 0x7F;
	AUXR  = 0x01;
	
	TMOD &= 0x0F;
	TMOD |= 0x20;
	
	TL1   = 0xFD;
	TH1   = 0xFD;
	TF1   = 0;
	TR1   = 1;


}

void TransferChar(char c)
{
	SBUF = c;
	while(!TI);
	TI = 0;
}
void TransferString(char* s)
{
	while(*s != '\0'){
	TransferChar(*s);
		s++;
	}
}
void main()
{
	Delay1000ms();//上电之后等待1秒让传感器稳定下来
	led1 = 1;//上电先让两个灯灭
	led2 = 1;
	UART0_Init();
	while(1){
	Delay1000ms();
	Delay1000ms();
	Delay1000ms();
	Delay1000ms();
	Delay1000ms();
    //延时5秒然后进行测温
	DHT11TransferData();
	TransferString("H:");
	//因为模块传输过来的是数字,我们要把它转变为字符型
	TransferChar(Data[0]/10 + 0x30);
	TransferChar(Data[0]%10 + 0x30);
	TransferChar('.');
	TransferChar(Data[1]/10 + 0x30);
	TransferChar(Data[1]%10 + 0x30);
		
	TransferString("\r\n");
		
	TransferString("T:");
	TransferChar(Data[2]/10 + 0x30);
	TransferChar(Data[2]%10 + 0x30);
	TransferChar('.');
	TransferChar(Data[3]/10 + 0x30);
	TransferChar(Data[3]%10 + 0x30);
	TransferString("\r\n");
	led1 = 1;//根据电路图,低电平点亮led
	led2 = 1;
}
}

### 关于C51单片机DHT11温湿度传感器交互 #### 使用C51单片机读取DHT11温湿度传感器的数据并显示在OLED屏幕上是一个很好的实践项目,适合初学者了解基本的硬件接口编程和数据处理方法[^1]。 为了实现这一目标,首先需要理解DHT11的工作原理及其通信协议。DHT11是一种数字式的温湿度复合传感器,它能提供相对湿度和温度两种信息,并通过简单的单总线方式进行通讯。当主机发出请求命令后,DHT11会响应并将采集到的数据发送给主机。在此过程中涉及到严格的时序控制来确保正确接收来自DHT11的数据帧[^3]。 以下是基于C51编写的用于获取DHT11温湿度值的基础程序框架: ```c #include <reg52.h> sbit DHT11_PIN = P3^7; // 定义DHT11连接至P3.7引脚 void delay_us(unsigned int us); unsigned char check_sum(unsigned char *data); // 初始化函数 void init_dht11(void){ DHT11_PIN = 1; } // 启动一次测量过程 bit start_measurement(){ unsigned char i, j; DHT11_PIN = 0; delay_us(1800); /* 主机拉低至少18ms */ DHT11_PIN = 1; delay_us(40); /* 接着拉高等待DHT11回应 */ while(DHT11_PIN == 1);/* 等待DHT11拉低应答信号 */ if (DHT11_PIN==0) { delay_us(80); /* 应答持续时间约80us */ DHT11_PIN=1; return 1; } else{ return 0;} /* 如果未收到应答则返回错误标志 */ } // 获取一组完整的温湿度数据包 void read_data(unsigned char* data){ unsigned char i,j,k; for(i=0;i<5;i++){ k=0; do{ /* 循环直到检测到起始位 */ while(!DHT11_PIN); while(DHT11_PIN); k++; }while(k<=1 && !DHT11_PIN); for(j=0;j<8;j++){ /* 处理每一位数据 */ while(!DHT11_PIN); _nop_(); if(DHT11_PIN)data[i]|=(0x01<<(7-j)); while(DHT11_PIN); } } if(check_sum(data)!=data[4])return ;/* 验证校验码是否匹配 */ } ``` 此代码片段展示了如何配置I/O端口、启动测量流程以及解析接收到的数据流。值得注意的是,在实际应用中还需要考虑更多的细节,比如异常情况下的重试机制等[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值