DHT11详细介绍(内含51和STM32代码)

DHT11

文章目录

  • DHT11
  • DHT11
    • 一、DHT11基础储备
    • 二、接口说明
      • 1. 接线图
      • 2. 电源引脚
      • 3. 串行接口(单线双向)
    • 三、协议及数据格式
    • 四、操作时序
      • 4.1 主机发送复位信号
      • 4.2 DHT11 发送响应信号
      • 4.3 数据传输
      • 4.4 区分数据0/1的巧法
    • 五、51及STM32例程
      • 5.1 51对应的
        • dht11.h
      • 5.2 STM32对应的
        • dht11.h
        • dht11.c
        • main.c
      • 实物图
        • 百度网盘资源


DHT11

导读:DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。

一、DHT11基础储备

DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,内部由一个 8 位单片机控制一个电阻式感湿元件和一个 NTC 测温元件。DHT11 虽然也是采用单总线协议,但是该协议与 DS18B20 的单总线协议稍微有些不同之处。

相比于 DS18B20 只能测量温度,DHT11 既能检测温度又能检测湿度,不过 DHT11 的精度和测量范围都要低于 DS18B20,其温度测量范围为 0~50℃,误差在±2℃;湿度的测量范围为 20%~90%RH(Relative Humidity 相对湿度—指空气中水汽压与饱和水汽压的百分比),误差在±5%RH。DHT11 电路很简单,只需要将 DATA 引脚连接单片机的一个 I/O 即可,不过该引脚需要上拉一个 5K 的电阻,DHT11 的供电电压为 3~5.5V

在这里插入图片描述

二、接口说明

1. 接线图

在这里插入图片描述

DHT11引脚说明

Pin名称注释
1VDD供电 3-5.5V
2GND接地,电源负极
3DATA串行数据,单总线
4NC空脚,请悬空

2. 电源引脚

DHT11的供电电压为3~5.5 V。传感器上电后,要等待 1s 以越过不稳定状态,在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。

3. 串行接口(单线双向)

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分

三、协议及数据格式

DHT11 采用单总线协议与单片机通信,单片机发送一次复位信号后,DHT11 从低功耗模式转换到高速模式,等待主机复位结束后,DHT11 发送响应信号,并拉高总线准备传输数据。一次完整的数据为 40bit,按照高位在前,低位在后的顺序传输

数据格式为:8bit 湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和,一共 5 字节(40bit)数据。由于 DHT11 分辨率只能精确到个位,所以小数部分是数据全为 0。校验和为前 4 个字节数据相加,校验的目的是为了保证数据传输的准确性。

DHT11 只有在接收到开始信号后才触发一次温湿度采集,如果没有接收到主机发送复位信号,DHT11 不主动进行温湿度采集。当数据采集完毕且无开始信号后,DHT11 自动切换到低速模式。

注意:由于 DHT11 时序要求非常严格,所以在操作时序的时候,为了防止中断干扰总线时序,先关闭总中断,操作完毕后再打开总中断。

四、操作时序

在这里插入图片描述

4.1 主机发送复位信号

DHT11 的初始化过程同样分为复位信号和响应信号
首先主机拉低总线至少 18ms,然后再拉高总线,延时 20~40us,取中间值 30us,此时复位信号发送完毕。

在这里插入图片描述

从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低速模式。

4.2 DHT11 发送响应信号

DHT11 检测到复位信号后,触发一次采样,并拉低总线 80us 表示响应信号,告诉主机数据已经准备好了;然后 DHT11 拉高总线 80us,之后开始传输数据。如果检测到响应信号为高电平,则 DHT11 初始化失败,请检查线路是否连接正常。

当复位信号发送完毕后,如果检测到总线被拉低,就每隔 1us 计数一次,直至总线拉高,计算低电平时间;当总线被拉高后重新计数检测 80us 的高电平。如果检测到响应信号之后的80us 高电平,就准备开始接收数据。实际上 DHT11 的响应时间并不是标准的 80us,往往存在误差,当响应时间处于 20~100us 之间时就可以认定响应成功。

4.3 数据传输

DHT11 在拉高总线 80us 后开始传输数据。每 1bit 数据都以 50us 低电平时隙开始,告诉主机开始传输一位数据了。DHT11 以高电平的长短定义数据位是 0 还是 1,当 50us 低电平时隙过后拉高总线,高电平持续 26~28us 表示数据“0”持续 70us 表示数据“1”

最后 1bit 数据传送完毕后,DHT11 拉低总线 50us,表示数据传输完毕,随后总线由上拉电阻拉高进入空闲状态。

在这里插入图片描述

4.4 区分数据0/1的巧法

还是像检测响应时间那样计算高电平持续时间那就太麻烦了!!!

数据“0”的高电平持续 26~28us,数据“1”的高电平持续70us,每一位数据前都有 50us 的起始时隙。如果我们取一个中间值 40us 来区分数据“0”和数据“1”的时隙。

当数据位之前的 50us 低电平时隙过后,总线肯定会拉高,此时延时 40us 后检测总线状态,如果为高,说明此时处于 70us 的时隙,则数据为“1”;如果为低,说明此时处于下一位数据 50us 的开始时隙,那么上一位数据肯定是“0”。

为什么延时 40us?
由于误差的原因,数据“0”时隙并不是准确 26~28us,可能比这短,也可能比这长。
当数据“0”时隙大于 26~28us 时,
如果延时太短,无法判断当前处于数据“0”的时隙还是数据“1”的时隙;
如果延时太长,则会错过下一位数据前的开始时隙,导致检测不到后面的数据

五、51及STM32例程

5.1 51对应的

dht11.h

while(t–)执行的时间T = T2 -T1 = 201us - 195.5us = 4.5us。

#define uchar unsigned char
#define uint unsigned int

sbit Data=P1^0; //数据线
uchar rec_dat[9]; //储存数据
void DHT11_delay_us(uchar n)
{
    while(--n);
}
void DHT11_delay_ms(uint z)
{
   uint i,j;
   for(i=z;i>0;i--)
      for(j=110;j>0;j--);
}

/*
主机(单片机)发送起始信号:
1.主机先拉高data。
2.拉低data延迟18ms。
3.拉高data并延迟等待(通过此操作将单片机引脚设置为输入)。
*/
void DHT11_start()
{
   Data=1;
   DHT11_delay_us(2);
   Data=0;
   DHT11_delay_ms(25);   //拉低延时18ms以上
   Data=1;
   DHT11_delay_us(30);   //拉高 延时 20~40us,取中间值 30us
}

/*------------------------------------------------
              接收八位二进制
------------------------------------------------*/
uchar DHT11_rec_byte()      //接收一个字节
{
  unsigned char i,dat=0;
  for(i=0;i<8;i++)    //从高到低依次接收8位数据
   {          
      while(Data);   //等待进入低电平
      while(!Data);   //等待50us低电平过去
      DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0 
      dat<<=1;//移位(低位补零)使正确接收8位数据,数据为0时直接移位
      if(Data==1)    //数据为1时,使dat加1来接收数据1
        dat+=1;
      while(Data);  //等待数据线拉低    
   }  
    return dat;
}


/*------------------------------------------------
              接收40bit数据(具体的温湿度)
1.主机先把data线拉高(io设置为输入)。
2.从机把data线拉低,主机读取data线电平,直到低电平结束(大约50us)
  从机拉高data线后,延迟40us左右(28~70us之间)主机再次读取data线电平,如果为低电平,则为“0”,如果为高电平,则为“1”。
3.继续重复上述1,2步骤累计40次。
------------------------------------------------*/
uchar T_H;
void DHT11_receive()      //接收40位的数据
{
    uchar R_H,R_L,T_L,RH,RL,TH,TL,revise; 
    DHT11_start();//发送起始信号:
    if(Data==0)
    {
        while(Data==0);   //等待拉高     
        DHT11_delay_us(40);  //拉高后延时80us
			
        R_H=DHT11_rec_byte();    //接收湿度高八位  
        R_L=DHT11_rec_byte();    //接收湿度低八位  
        T_H=DHT11_rec_byte();    //接收温度高八位  
        T_L=DHT11_rec_byte();    //接收温度低八位
        revise=DHT11_rec_byte(); //接收校正位

        DHT11_delay_us(25);    //结束

        if((R_H+R_L+T_H+T_L)==revise)      //最后一字节为校验位,校验是否正确
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
        } 
				
        /*数据处理,转换为字符,方便显示*/
			  //湿度
				rec_dat[0]='0'+(RH/10);
        rec_dat[1]='0'+(RH%10);
				rec_dat[2]=' ';
				rec_dat[3]=' ';
				
				//温度
        rec_dat[4]='0'+(TH/10);
        rec_dat[5]='0'+(TH%10); 
		    rec_dat[6]=' ';
			
    }

}

5.2 STM32对应的

dht11.h
#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f10x.h"                  // Device header



#define dht11_high GPIO_SetBits(GPIOB, GPIO_Pin_12)
#define dht11_low GPIO_ResetBits(GPIOB, GPIO_Pin_12)
#define Read_Data GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)

void DHT11_GPIO_Init_OUT(void);
void DHT11_GPIO_Init_IN(void);
void DHT11_Start(void);
unsigned char DHT11_REC_Byte(void);
void DHT11_REC_Data(void);



#endif

dht11.c
#include "stm32f10x.h"                  // Device header
#include  "dht11.h"
#include  "delay.h"
//数据
unsigned int rec_data[4];


//对于stm32来说,是输出
void DH11_GPIO_Init_OUT(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);

}

//对于stm32来说,是输入
void DH11_GPIO_Init_IN(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING; //浮空输入
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);

}



//主机发送开始信号
void DHT11_Start(void)
{
	DH11_GPIO_Init_OUT(); //输出模式
	
	dht11_high; //先拉高
	delay_us(30);
	
	dht11_low; //拉低电平至少18us
	delay_ms(20);
	
	dht11_high; //拉高电平20~40us
	delay_us(30);
	
	DH11_GPIO_Init_IN(); //输入模式
}


//获取一个字节
char DHT11_Rec_Byte(void)
{
	unsigned char i = 0;
	unsigned char data;
	
	for(i=0;i<8;i++) //1个数据就是1个字节byte,1个字节byte有8位bit
	{
		while( Read_Data == 0); //从1bit开始,低电平变高电平,等待低电平结束
		delay_us(30); //延迟30us是为了区别数据0和数据1,0只有26~28us
		
		data <<= 1; //左移
		
		if( Read_Data == 1 ) //如果过了30us还是高电平的话就是数据1
		{
			data |= 1; //数据+1
		}
		
		while( Read_Data == 1 ); //高电平变低电平,等待高电平结束
	}
	
	return data;
}

//获取数据

void DHT11_REC_Data(void)
{
	unsigned int R_H,R_L,T_H,T_L;
	unsigned char RH,RL,TH,TL,CHECK;
	
	DHT11_Start(); //主机发送信号
	dht11_high; //拉高电平
	
	if( Read_Data == 0 ) //判断DHT11是否响应
	{
		while( Read_Data == 0); //低电平变高电平,等待低电平结束
		while( Read_Data == 1); //高电平变低电平,等待高电平结束
		
		R_H = DHT11_Rec_Byte();
		R_L = DHT11_Rec_Byte();
		T_H = DHT11_Rec_Byte();
		T_L = DHT11_Rec_Byte();
		CHECK = DHT11_Rec_Byte(); //接收5个数据
		
		dht11_low; //当最后一bit数据传送完毕后,DHT11拉低总线 50us
		delay_us(55); //这里延时55us
		dht11_high; //随后总线由上拉电阻拉高进入空闲状态。
		
		if(R_H + R_L + T_H + T_L == CHECK) //和检验位对比,判断校验接收到的数据是否正确
		{
			RH = R_H;
			RL = R_L;
			TH = T_H;
			TL = T_L;
		}
	}
	rec_data[0] = RH;
	rec_data[1] = RL;
	rec_data[2] = TH;
	rec_data[3] = TL;
}

main.c

OLED文章见-》[STM32-OLED]((85条消息) STM32—OLED显示屏_安赫.的博客-CSDN博客_基于stm32的oled屏幕介绍)

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "OLED.h"
#include  "dht11.h"
#include  "usart.h"

extern unsigned int rec_data[4];

int main()
{

  OLED_Init();
	uart_init(9600);
	
  OLED_ShowCHinese(0, 0, 0);							//温
	OLED_ShowCHinese(0, 16, 1); 						//度
	OLED_ShowCHinese(0, 32, 4);							//:
	OLED_ShowCHinese(0, 60, 5);							//.
	OLED_ShowCHinese(0, 90, 6);							//℃
	
	
	OLED_ShowCHinese(4, 0, 2);							//湿
	OLED_ShowCHinese(4, 16, 3); 						//度
	OLED_ShowCHinese(4, 32, 4);							//:
	OLED_ShowCHinese(4, 60, 5);							//.
	OLED_ShowCHinese(4, 90, 7);							//%
	while(1)
	{
		delay_s(1);
		DHT11_REC_Data(); //接收温度和湿度的数据
		
	    OLED_ShowNum(1,7,rec_data[2],2);
		OLED_ShowNum(1,10,rec_data[3],1);
		OLED_ShowNum(3,7,rec_data[0],2);
		OLED_ShowNum(3,10,rec_data[1],2);
		printf("温度:%d\r\n",rec_data[2]); 
		printf("湿度:%d\r\n",rec_data[0]);
        printf("\r\n\n");	

	}
}

实物图

在这里插入图片描述

百度网盘资源

有条件的兄弟支持支持❀❀❀→CSND资源

既然都看到最后了,关注 收藏 不迷路。


给那些看完的朋友,奖励一个 赤赤博客-后端+前端,觉得不错的话可以推荐给身边的朋友哟!
在这里插入图片描述

  • 510
    点赞
  • 1996
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 82
    评论
### 回答1: 下面是stm32c8t6和dht11连接的代码示例: ``` #include "stm32f0xx.h" #define DHT11_PIN GPIO_PIN_0 #define DHT11_PORT GPIOA void delay_us(uint32_t us) { us *= 7; while (us--) { __NOP(); } } void DHT11_Start() { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = DHT11_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct); HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET); delay_us(18000); HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET); delay_us(30); GPIO_InitStruct.Pin = DHT11_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct); } uint8_t DHT11_Read_Byte() { uint8_t byte = 0; for (int i = 0; i < 8; i++) { while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET); // 等待高电平 delay_us(30); if (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET) { byte |= (1 << (7 - i)); while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET); // 等待低电平 } } return byte; } int main(void) { // 初始化相应的时钟和引脚配置 while (1) { DHT11_Start(); if (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET) { // 接收到DHT11的响应信号,开始读取数据 for (int i = 0; i < 5; i++) { data[i] = DHT11_Read_Byte(); } // 处理温湿度数据 // 延时一段时间后再次读取 HAL_Delay(2000); } } } ``` 这是一个简单的stm32c8t6和dht11连接的例子,可以通过这个代码来读取dht11的温湿度数据。具体的硬件连接可以根据实际情况进行调整。 ### 回答2: 要连接STM32C8T6和DHT11,需要使用STM32的GPIO(通用输入输出)引脚来与DHT11进行通信。下面是一个简单的连接代码示例: 1. 首先,确保你已经将DHT11的数据引脚连接到STM32C8T6的一个GPIO引脚上。假设你将DHT11的数据引脚连接到STM32C8T6的GPIOA的第0号引脚上(即PA0)。 2. 在代码中引入STM32的相关库和引脚定义文件: ```c #include "stm32f10x.h" ``` 3. 在代码中配置GPIOA的引脚为输入模式,然后对DHT11进行初始化: ```c void DHT11_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } ``` 4. 在代码中编写函数来读取DHT11的数据: ```c uint8_t DHT11_Read(void) { uint8_t data[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; uint16_t timeout = 0xFFFF; // 发送开始信号 GPIO_ResetBits(GPIOA, GPIO_Pin_0); delay_us(18000); GPIO_SetBits(GPIOA, GPIO_Pin_0); delay_us(30); // 等待DHT11响应 while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) { if (--timeout == 0) { return 1; // 错误:超时 } } timeout = 0xFFFF; // 等待DHT11的数据 while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET) { if (--timeout == 0) { return 1; // 错误:超时 } } timeout = 0xFFFF; // 读取DHT11的数据 for (int i = 0; i < 40; ++i) { while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET); uint32_t start_time = 0; while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET) { start_time++; } uint32_t high_time = 0; while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) { high_time++; } data[i / 8] <<= 1; if (high_time > start_time) { data[i / 8] |= 0x01; } } // 检查校验和 if (data[4] == (data[0] + data[1] + data[2] + data[3])) { // 数据正确 // 在这里对data进行处理 return 0; } else { // 数据错误 return 1; } } ``` 这只是一个基础的代码示例框架,你可以根据自己的需求进行代码的调整和完善。注意,以上代码中的`delay_us`函数应该是一个微秒级延时函数,你可以自己实现或调用相关库函数来延时。 希望以上回答对你有帮助! ### 回答3: STM32C8T6和DHT11连接的代码如下: 首先,需要将DHT11的DATA引脚连接到STM32C8T6的GPIO引脚上,假设连接到PA0。 1. 首先,需要包含必要的头文件: ```c #include "stm32f10x.h" ``` 2. 设置GPIO引脚模式,将PA0设置为输入模式: ```c GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOA, &GPIO_InitStructure); ``` 3. 读取DHT11的数据: ```c #define DHT11_DATA_PIN GPIO_Pin_0 #define DHT11_PORT GPIOA uint8_t DHT11_ReadByte(void) { uint8_t i, j; uint8_t byte = 0; for (j = 0; j < 8; j++) { while (!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_DATA_PIN)); // 等待DHT11拉低数据线 delay_us(40); // DHT11低电平持续时间 if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_DATA_PIN)) { // 判断高电平持续时间 byte |= (1 << (7 - j)); // 接收到1,将对应位设置为1 } while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_DATA_PIN)); // 等待DHT11拉高数据线 } return byte; } void DHT11_ReadData(uint8_t *humidity, uint8_t *temperature) { uint8_t data[5]; // 主机发送开始信号 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 拉低数据线,持续>18ms delay_ms(20); GPIO_SetBits(GPIOA, GPIO_Pin_0); // 拉高数据线,使DHT11开始发送数据 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 切换到输入模式,开始接收数据 GPIO_Init(GPIOA, &GPIO_InitStructure); // 接收数据 while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_DATA_PIN)); // 等待DHT11拉低数据线 delay_us(80); // DHT11低电平持续时间 if (!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_DATA_PIN)) { // 判断DHT11响应信号 while (!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_DATA_PIN)); // 等待DHT11拉高数据线 while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_DATA_PIN)); // 等待DHT11再次拉低数据线 for (i = 0; i < 5; i++) { data[i] = DHT11_ReadByte(); // 依次读取8位数据 } if (data[4] == (data[0] + data[1] + data[2] + data[3])) { // 判断校验和是否正确 *humidity = data[0]; // 湿度整数部分 *temperature = data[2]; // 温度整数部分 } } } ``` 以上代码是一个简单的DHT11读取数据的例子,你可以根据自己的需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 82
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安赫'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值