【蓝桥杯嵌入式拓展板】—温湿度传感器 DHT11 详解(附程序源码)

   日期:2021-02-27     浏览:190    评论:0    
核心提示:一、温湿度传感器 ————————————一般应用的时候,默认将Pin1接VDD Pin4接GND, Pin2作为通信引脚二、通信过程:串行通信通过一个端口接受来自MCU的命令或者发送给MCU数据。在发送数据的时候,一个完整的数据包含40bit,并且传感器首先发送高数据位(the sensor sends higher data bit first)。数据格式三、通信时序图...

一、温湿度传感器

————————————

一般应用的时候,默认将Pin1接VDD Pin4接GND, Pin2作为通信引脚

二、通信过程:串行通信

  1. 通过一个端口接受来自MCU的命令或者发送给MCU数据。在发送数据的时候,一个完整的数据包含40bit,并且传感器首先发送高数据位(the sensor sends higher data bit first)。
  2. 数据格式(从左到右发送)

  1. 校验格式
    求和结果取低八位

    正确的举例校验:返回Ture

    错误的举例校验:返回Fault

三、通信时序图

1、整体时序图预览

2、 MCU 发送开始信号给 DHT

数据单总线空闲状态为高电压电平。当单片机与单片机通信时DHT11开始,单片机的程序将数据单总线电压电平由高到低,这个过程至少需要18ms才能保证DHT检测到单片机的信号,然后单片机拉升电压,等待20-40us的DHT响应

3、DHT 响应 MCU

DHT检测到启动信号后,会发出低压响应信号,持续80us。然后DHT程序将数据单总线电压由低到高设置为80us,为DHT发送数据做准备。
当数据单总线处于低电压水平时,这意味着DHT正在发送响应信号。一旦DHT发出响应信号,它拉起电压并保持80us,为数据传输做准备。
DHT向单片机发送数据时,每一位数据都从50us低电压电平开始,随后的高电压电平信号的长度决定了数据位是0还是1。(参见下面的图4和图5)。

四、程序


DHT11电源为3-5.5V DC。当给传感器供电时,不要在一秒内给传感器发送任何指令以通过不稳定状态。可以在VDD和GND之间增加一个100nF的电容,用于电源滤波。

1、Mode_Out(uint8_t signal)

//MCU 控制 PA7输出 “0” 或 “1”
void Mode_Out(uint8_t signal)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	if(!signal)
	{ 
		GPIO_ResetBits(GPIOA, GPIO_Pin_7);
	}
	else 
	{ 	
		GPIO_SetBits(GPIOA, GPIO_Pin_7);
	}
}

2、void Mode_In(void)

//控制MCU接收数据
void Mode_In(void)
{ 
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

3、void DHT11_Init(void)

void DHT11_Init(void)
{ 
	Mode_Out(1);	//开始之前 先拉高信号线 
}

4、uint8_t Receive_Data(void)

//接收 1 Byte 数据
uint8_t Receive_Data(void)
{ 
	u8 i,temp=0,j=220;
	for(i=0;i<8;i++)
	{ 
		while(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));//50us低电平结束
		
		Delay_us(40);
		
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))//为高时
		{ 
			temp=(temp<<1)|1;
			while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)&&(j--));	
		}	
		else
		{ 
			temp=(temp<<1)|0;
		}
	}
	return temp;
}

5、uint8_t Ready_DHT11(void)


uint8_t Ready_DHT11(void)
{ 
	DHT11_Init();
	
	Mode_Out(0);Delay_us(18000);//18ms
	Mode_Out(1);Delay_us(30);//30us
	
	Mode_In();//输入模式
	if(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)) //判断从机的低电平相应
	{ 
		while(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));//从机发出的80us低电平相应信号结束
		while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7));//从机发出的80us高电平信号结束
		
		Humidity_H = Receive_Data(); //接收高8位湿度数据
		Humidity_L = Receive_Data(); //接收低8位湿度数据
		
		Temperature_H = Receive_Data(); //接收高8位温度数据
		Temperature_L = Receive_Data();	//接收低8位温度数据
		
		Check_Out = Receive_Data();	//接收校验位 
	}
	if(((Humidity_H+Humidity_L+Temperature_H+Temperature_L)&(0xFF))==Check_Out) //校验
	{ 
		return 1;		
	}
	else
	{ 
		return 0;
	}
			
}

6、用到的延时

void Delay_us(u32 nTime)
{ 
	SysTick_Config(SystemCoreClock/1000000);
	DelayTiming = nTime;
	while(DelayTiming != 0);
}
void SysTick_Handler(void)
{ 
	if(DelayTiming != 0){ 
		DelayTiming--;
	}
}

7、main

#include "stm32f10x.h"
#include "bsp_seg.h"
#include "lcd.h"
#include "bsp_dht11.h"
#include <stdio.h>
u32 DelayTiming = 0;

void Delay_Ms(u32 nTime)
{ 
	DelayTiming = nTime;

	while(DelayTiming != 0);
}
char txt[20];
int main(void)
{ 
	SysTick_Config(SystemCoreClock/1000000);
	
	STM3210B_LCD_Init();
	LCD_Clear(White);
	STM3210B_LCD_Init();
	SEG_GPIO_Config();

	LCD_SetTextColor(White);
	LCD_SetBackColor(Blue);

	LCD_ClearLine(Line0);
	LCD_ClearLine(Line1);
	LCD_ClearLine(Line2);
	LCD_ClearLine(Line3);
	LCD_ClearLine(Line4);
	
	LCD_DisplayStringLine(Line1,(u8*)" SDHT11 DEMO ");
	LCD_SetTextColor(Blue);
	LCD_SetBackColor(White);

	while(1)
	{ 
			if(1==Ready_DHT11())
			{ 
				sprintf(txt,  "Moisture:%2d%%",Humidity_H);
				LCD_DisplayStringLine(Line6,txt);
				sprintf(txt,  "Temperature:%2d",Temperature_H);
				LCD_DisplayStringLine(Line8,txt);
				SEG_Display(Temperature_H/10,Temperature_H%10,12);								
			} 
			Delay_us(1000000);//延时1s
	}
}

显示,只要读出对应温度和湿度的整数部分即可

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服