STM32F103+DHT11显示温湿度(0.96寸oled)

您所在的位置:网站首页 液晶屏上显示妈妈的生日怎么设置 STM32F103+DHT11显示温湿度(0.96寸oled)

STM32F103+DHT11显示温湿度(0.96寸oled)

2024-07-04 15:42| 来源: 网络整理| 查看: 265

文章目录 STM32一.前言二.DHT11驱动原理三. 代码部分

STM32 一.前言

在实际的项目开发过程中我们会使用到很多模块,今天我们说一下DHT11温湿度模块 这里是将测量的数据显示在0.96寸oled显示屏上面,如果不会oled屏幕驱动的可以看一下之前的文章

在这里插入图片描述

二.DHT11驱动原理

步骤一 DHT11上电后(DHT11上电后要等待 1S 以越过不稳定状态在此期间不能发送任何指令),测试环境 温湿度数据,并记录数据,同时 DHT11的 DATA 数据线由上拉电阻拉高一直保持高电平;此时 DHT11的 DATA 引脚处于输入状态,时刻检测外部信号。

步骤二 微处理器的 I/O设置为输出同时输出低电平,且低电平保持时间不能小于 18ms(最大不得超过 30ms), 然后微处理器的 I/O设置为输入状态,由于上拉电阻,微处理器的 I/O即 DHT11的 DATA 数据线也随之变 高,等待 DHT11作出回答信号,发送信号如图所示: 在这里插入图片描述

步骤三 DHT11 的 DATA引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA 引脚处于输出状态,输出 83微秒的低电平作为应答信号,紧接着输出 87 微秒的高电平通知外设准备接 收数据,微处理器的 I/O 此时处于输入状态,检测到 I/O 有低电平(DHT11回应信号)后,等待 87微秒 的高电平后的数据接收,发送信号如图所示: 在这里插入图片描述

步骤四 由 DHT11 的 DATA引脚输出 40 位数据,微处理器根据 I/O电平的变化接收 40 位数据,位数据“0” 的格式为: 54 微秒的低电平和 23-27 微秒的高电平,位数据“1”的格式为: 54 微秒的低电平加 68-74 微秒的高电平。位数据“0”、“1”格式信号如图所 在这里插入图片描述

三. 代码部分

整个工程代码在此处下载

STM32F103ZET6驱动DHT11 温湿度显示 1. 蓝秦云下载 2.github 下载

DHT11.h

#ifndef __DHT11_H #define __DHT11_H #include "system.h" #define BOOL unsigned char #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif //定义DHT11 GPIOD 0 #define DHT11_PORT_RCC RCC_APB2Periph_GPIOD #define DHT11_PIN GPIO_Pin_0 #define DHT11_PORT GPIOD static void DHT11_DataPin_Configure_Output(void); static void DHT11_DataPin_Configure_Input(void); BOOL DHT11_get_databit(void); void DHT11_set_databit(BOOL level); void mdelay(u16 ms); void udelay(u16 us); static uint8_t DHT11_read_byte(void); static uint8_t DHT11_start_sampling(void); void DHT11_get_data(u32 *buf); #endif

DHT11.c

#include "dht11.h" #include "SysTick.h" /*数据定义: ---以下变量均为全局变量-------- //----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //-----校验 8位 == U8checkdata----- */ u8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; u8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; static void DHT11_DataPin_Configure_Output(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(DHT11_PORT_RCC, ENABLE); //使能PD端口时钟 GPIO_InitStructure.GPIO_Pin = DHT11_PIN; //PD.0 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DHT11_PORT, &GPIO_InitStructure); } static void DHT11_DataPin_Configure_Input(void) { GPIO_InitTypeDef DataPin; DataPin.GPIO_Pin = DHT11_PIN; DataPin.GPIO_Mode = GPIO_Mode_IN_FLOATING; //悬空 输入 DataPin.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DHT11_PORT, &DataPin); } BOOL DHT11_get_databit(void) { uint8_t val; val = GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN); if(val == Bit_RESET) { return FALSE; } else { return TRUE; } } void DHT11_set_databit(BOOL level) { if(level == TRUE) { GPIO_SetBits(DHT11_PORT, DHT11_PIN); } else { GPIO_ResetBits(DHT11_PORT, DHT11_PIN); } } void mdelay(u16 ms) { if(ms != 0) { delay_ms(ms); } } void udelay(u16 us) { if(us != 0) { delay_us(us); } } static uint8_t DHT11_read_byte(void) { uint8_t i; uint8_t data = 0; for(i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3