STM32+DHT11温湿度传感器

这篇具有很好参考价值的文章主要介绍了STM32+DHT11温湿度传感器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次
通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数
部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验

数据传送正确时校验和数据
等于“8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
” 所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到速模式,等待主
机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,
用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,
如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后
转换到低速模式.

STM32+DHT11温湿度传感器

 

STM32+DHT11温湿度传感器

直接上代码

//main程序
#include "stdio.h"	
#include "stm32f10x.h"
#include "USART.h"
#include "dht11.h"
#include "Delay.h"
 
extern u8 dat[5];
 
int main(void)
{	
	uart1_init();

 
	
	printf( "串口printf函数测试\n" );
	
	
	while (1)
	{
		
	if(DHT_Read())
			printf("湿度:%d%%,温度:%d度\r\n",dat[0],dat[2]);
     //printf("湿度:%d.%d%%,温度:%d.%d度\r\n",dat[0],dat[1],dat[2],dat[3]);  显示小数
		Delay_ms(3000);
	}
}
//UART1.C程序
#include "stm32f10x.h"  // Device header
#include "stdio.h"
#include "USART.h"
u8 Recse;
void uart1_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	
	USART_InitStructure.USART_BaudRate = 9600; //波特率
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不进行硬件流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//模式为接收和发送双向
	USART_InitStructure.USART_Parity = USART_Parity_No;//不校验
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止1位
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据8位
	USART_Init(USART1, &USART_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//输出复用推挽
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//输入复用浮空
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_Cmd(USART1, ENABLE);//使能串口1
		
}


/* 重定向printf函数 */
int fputc(int ch, FILE *f)
{
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); 
	USART_SendData(USART1,ch);
	/* 等待发送完毕 */
	return ch;
}

//UART.H程序
#ifndef __USART_H
#define __USART_H

void uart1_init(void);


#endif
//dht11.c程序
#include "dht11.h"
#include "Delay.h"
 
uint8_t dat[5]={0x00,0x00,0x00,0x00,0x00};
uint8_t sum=0;
 
//初始化为输出
void DHT11_GPIO_OUT(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 
		
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);		
}
//初始化为输入
void DHT11_GPIO_IN(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
		
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;	
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);					
}
 
//读一个字节
uint8_t DHT_Read_Byte(void)
{
	uint8_t temp;
	uint8_t ReadDat=0;
	
	uint8_t retry = 0;	
	uint8_t i;
	
	for(i=0;i<8;i++)
	{
		//数据信号低电平50us
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&&retry<100)
		{		
			Delay_us(1);
			retry++;		
		}
		retry=0;
		Delay_us(30);
		temp=0;//数字信号0,temp=0
		//数字0信号高电平持续28us,数字1信号高电平70us,延时30us以确认数字0或1
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1) temp=1;		
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1&&retry<100)//数字1信号高电平剩余40us
		{		
			Delay_us(1);
			retry++;
		}
		retry=0;
		ReadDat<<=1;
		ReadDat|=temp;
	}	
	return ReadDat;
}
 
uint8_t DHT_Read(void)
{
	uint8_t i;
	uint8_t retry = 0;
	
	//主机设置为输出,发送开始信号低电平18ms,高电平40us
	DHT11_GPIO_OUT();
	GPIO_ResetBits(GPIOB,GPIO_Pin_14);
	Delay_ms(18);
	GPIO_SetBits(GPIOB,GPIO_Pin_14);
	Delay_us(40);
	//主机设置为输入,检查并接收响应信号低电平80us,高电平80us
	DHT11_GPIO_IN();
	Delay_us(20);
	//延时20us,低电平80us,还剩60us,检查是否是低电平以确定是否有响应信号
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0)
	{
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&&retry<100)//接收响应信号低电平剩余60us
		{
			Delay_us(1);
			retry++;			
		}
		retry=0;//超过100us自动向下运行,以免卡死
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1&&retry<100)//接收响应信号高电平80us
		{
			Delay_us(1);
			retry++;			
		}
		retry=0;
		//接收8字节数据
		for(i=0;i<5;i++)
		{
			dat[i]=DHT_Read_Byte();
		}
		Delay_us(50);//DHT11拉低总线50us作为结束信号,或者使用以下语句
				
//		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&&retry<100)//接收响应信号低电平剩余60us
//		{
//			SysTick_Delay_us(1);
//			retry++;			
//		}
//		retry=0;
		
	}
	sum=dat[0]+dat[1]+dat[2]+dat[3];
	if(dat[4]==sum)
	{
		return 1;
	}
	else
		return 0;
}


 

//dth11.h程序
#ifndef __DHT11_H
#define __DHT11_H
 
#include "stm32f10x.h"
 
 
void DHT11_GPIO_OUT(void);
void DHT11_GPIO_IN(void);
uint8_t DHT_Read_Byte(void);
uint8_t DHT_Read(void);
 
#endif 
//Delay.c程序
#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 
//Delay.h程序
#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

上结果图

STM32+DHT11温湿度传感器文章来源地址https://www.toymoban.com/news/detail-411933.html

到了这里,关于STM32+DHT11温湿度传感器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 玩转传感器——DHT11温湿度传感器(STM32版)

    DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产

    2024年02月03日
    浏览(48)
  • STM32+DHT11采集温湿度传感器数据

            DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温度。 DHT11 与单片机之间能采用简单的单总线进行通信,仅

    2024年02月07日
    浏览(44)
  • 【STM32(HAL库)--DHT11温湿度传感器】

    stm32控制DHT11温湿度传感器,进行温湿度的读取.以下是自己的一点学习过程和心得,若有不妥之处,还望各位大佬指正,在下感激不尽. DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器 。 它应用专用的数字模块采集技术温湿度传感技术, 确保产品具有极高

    2024年04月15日
    浏览(51)
  • STM32+DHT11温湿度传感器(含完整代码)

    前言 DHT11数字温湿度传感器是一种数字信号输出的温湿度传感器,具有高可靠性和长期稳定性。它采用专用的数字模块和温湿度传感技术,提供准确的温湿度数据。传感器内部包含感湿元件和测温元件,并与高性能单片机连接。因此,该传感器具有优异的品质、快速响应、抗

    2024年04月08日
    浏览(71)
  • 【STM32】DHT11温湿度模块传感器详解&代码

    DHT11是数字温湿度传感器,测量范围:湿度20%-95%,温度0-50℃,广泛应用于加湿器、温湿度计、空调、汽车等领域。 如上图DATA引脚用于MCU与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右(超时时间的判断)。一次完整的数据传输为40bit,高位先出(MSB最高

    2024年02月12日
    浏览(55)
  • [STM32]HAL库STM32CubeMX+DHT11温湿度传感器

    目录 所用的工具: 知识概括: DHT11介绍: DHT11性能说明: 接口说明  电源引脚 串行接口   工程创建 1、设置RCC 2、时钟设置 3、项目文件设置 4、设置IO口(DATA) 5、TIM时钟配置 6、USART配置   程序编写:          1、TIM3实现微秒(us)级延时函数: 2、IO口配置 3、DHT11检测

    2024年02月09日
    浏览(47)
  • Clion开发Stm32之温湿度传感器(DHT11)驱动编写

    涵盖之前文章: Clion开发STM32之HAL库GPIO宏定义封装(最新版) Clion开发stm32之微妙延迟(采用nop指令实现) Clion开发STM32之日志模块(参考RT-Thread) 头文件 源文件

    2024年02月15日
    浏览(46)
  • STM32F4_DHT11数字温湿度传感器

    目录 前言 1. DHT11简介 2. DHT11数据结构 3. DHT11的传输时序 3.1 DHT11开始发送数据流程 3.2 主机复位信号和DHT11响应信号 3.3 数字 “0” 信号表示方法 3.4 数字 “1” 信号表示方法 4. 硬件分析 5. 实验程序详解 5.1 main.c 5.2 DHT11.c 5.3 DHT11.h         DHT11数字温湿度传感器 不但能测温度

    2024年02月08日
    浏览(49)
  • (STM32F103单片机)DHT11温湿度传感器

    目录   一,产品介绍 二,产品亮点 三,产品参数 四,引脚连接及通信说明  五,原理讲解 六,源码 1,DHR11.C 2.DHR11.H 3,main.c DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高

    2023年04月08日
    浏览(56)
  • ESP32单片机使用DHT11温湿度传感器的实践与代码解析

    摘要:本文将介绍如何使用ESP32单片机与温湿度传感器进行连接和数据读取。通过实例代码的解析,帮助读者了解实现温湿度检测的原理和方法。 一、引言 ESP32是一款功能强大的微控制器,广泛应用于物联网、智能家居等领域。在许多应用场景中,温湿度传感器是不可或缺的

    2024年02月21日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包