STM32 模块篇-温湿度传感器模块(DHT11)实验

发布者:CaptivatingEyes最新更新时间:2019-07-11 来源: eefocus关键字:STM32  温湿度传感器模块  DHT11 手机看文章 扫描二维码
随时随地手机看文章

5.03 温湿度传感器模块实验

5.03.1 概述

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

 


DHT11 数字温湿度传感器模块为4 针PH2.0 封装。连接方便。如右图所示。

5.03.1.1 性能描述

1. 供电电压:3-5.5V

2. 供电电流:最大2.5mA

3. 温度范围:0-50℃ 误差±2℃

4. 湿度范围:20-90%RH 误差±5%RH

5. 响应时间: 1/e(63%) 6-30s

6. 测量分辨率分别为 8bit(温度)、8bit(湿度)

7. 采样周期间隔不得低于1 秒钟

8. 模块尺寸:30x20mm 

 


注释:建议连接线长度短于20米时使用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。

5.03.1.2 传感器时序

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:

一次完整的数据传输为40bit,高位先出。

数据格式:

8bit湿度整数数据+8bit湿度小数数据

+8bi温度整数数据+8bit温度小数数据

+8bit校验和

数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。

用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。

通讯过程如图

 

 


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

 


    总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。 

5.03.2 实验目的

1. 掌握温度采集模块DHT11的工作原理; 

2. 掌握单片机实现温度采集模块DHT11数据采集的基本方法,其中包括硬件和软件实现两部分;     

3. 熟悉单片机数据采集系统中,温度采集模块DHT11作为传感器对象的系统设计方法。

5.03.3 硬件设计

选用大黄蜂实验板,温度采集模块DHT11是成品模块,直接插接到实验板上即可。硬件设计见“图5.03.5  温度采集模块DHT11连线图”。

 



5.03.4 软件设计

5.03.4.1 软件设计说明

    温度采集模块DHT11是成品模块,直接插接到实验板上即可。按照上一章介绍的工作原理,我们就可以按照工作时序编写出数据采集程序。我们还是采用库函数的方式进行程序设计。

在这节程序设计中,用到了外部中断函数;prinif 重定向打印输出函数; USART串口通讯函数;定时器函数。

5.03.4.2 STM32库函数文件

?

   本节实验及以后的实验我们都是用到库文件,其中 stm32f10x_gpio.h头文件包含了GPIO端口的定义。stm32f10x_rcc.h 头文件包含了系统时钟配置函数以及相关的外设时钟使能函数,所以我们要把这两个头文件对应的stm32f10x_gpio.c和stm32f10x_rcc.c加到工程中;Misc.c库函数主要包含了中断优先级的设置,stm32f10x_exti.c 库函数主要包含了外部中断设置参数,tm32f10x_tim.c库函数主要包含定时器设置,tm32f10x_usart.c库函数主要包含串行通讯设置,这些函数也要添加到函数库中。以上库文件包含了本次实验所有要用到的函数使用功能。

5.03.4.3 自定义头文件

                                        

    我们在每个工程设计中都要创建了两个公共的文件,这两个文件主要存放我们自定义的公共函数和全局变量,以方便以后每个功能模块(函数)之间传递参数。

5.03.4.4 pbdata.h文件里的内容是

   

           

语句 #ifndef、#endif是为了防止pbdata.h文件被多个文件调用时出现错误提示。如果不加这两条语句,当两个文件同时调用pbdata文件时,会提示重复调用错误。 

5.03.4.5 pbdata.c文件里的内容是

下面是pbdata.c文件详细内容,在文件开始还是引用“pbdata.h”文件。


 5.03.5  STM32系统时钟配置SystemInit()

在每个工程中必须在开始时配置并启动STM32系统时钟,这是基础,这次也不例外。

5.03.6  GPIO引脚时钟使能



 

5.03.7  GPIO管脚电平控制函数


    在主程序中采用while(1)循环语句,采用查询方式不停的读取温湿度数据,然后直接通过串口送打印输出到屏幕。



  while(1)

   {

  DHT11_Read_Data(&wd,&sd);//读取温湿度值    

  printf("当前环境温度: %d ℃rn",wd);    

  printf("当前环境湿度: %d %%rn",sd);    

  delay_ms(1000);

  delay_ms(1000);

   }



 


5.03.8  stm32f10x_it.c文件里的内容是


在中断处理stm32f10x_it.c文件里中仅串口1子函数非空,进入中断处理函数后,只有串口1有参数输出。



#include "stm32f10x_it.h" 

#include "stm32f10x_exti.h"

#include "stm32f10x_rcc.h"

#include "misc.h"

#include "pbdata.h"

 

void NMI_Handler(void)

{

}

 

void USART1_IRQHandler(void)

{

   if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)

   {

USART_SendData(USART1,USART_ReceiveData(USART1));

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

   }

}

 

 



5.03.9  dht11.h文件里的内容是


函数dht11.h在这里是为符合温湿度模块功能自定义的专用功能函数,dht11.h的内容如下:


#ifndef __DHT11_H

#define __DHT11_H 

#include "pbdata.h"

 

#define IO_DHT11 GPIO_Pin_4 //引入中间变量,方便移植

#define GPIO_DHT11 GPIOE //引入中间变量,方便移植

 

#define DHT11_DQ_High GPIO_SetBits(GPIO_DHT11,IO_DHT11) 

#define DHT11_DQ_Low  GPIO_ResetBits(GPIO_DHT11,IO_DHT11)

 

void DHT11_IO_OUT(void);//温湿度模块输出函数

void DHT11_IO_IN(void); //温湿度模块输入函数

void DHT11_Init(void);  //初始化DHT11

u8   DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度

u8   DHT11_Read_Byte(void);             //读出一个字节

u8   DHT11_Read_Bit(void);              //读出一个位

u8   DHT11_Check(void);                 //检测是否存在DHT11

void DHT11_Rst(void);                   //复位DHT11    

#endif

5.03.10  dht11.c文件里的内容是


 


自定义函数dht11.c的内容如下:


#include "pbdata.h"

 

void DHT11_IO_IN(void)//温湿度模块输入函数

{

GPIO_InitTypeDef GPIO_InitStructure;

 

GPIO_InitStructure.GPIO_Pin=IO_DHT11;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIO_DHT11,&GPIO_InitStructure);

}

 

void DHT11_IO_OUT(void)//温湿度模块输出函数

{

GPIO_InitTypeDef GPIO_InitStructure;

 

GPIO_InitStructure.GPIO_Pin=IO_DHT11;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIO_DHT11,&GPIO_InitStructure);

}

 

//复位DHT11

void DHT11_Rst(void)   

{                 

   DHT11_IO_OUT(); //SET OUTPUT

    DHT11_DQ_Low; //DQ=0

    delay_ms(20);    //拉低至少18ms

    DHT11_DQ_High; //DQ=1 

 delay_us(30);     //主机拉高20~40us

}

 

//等待DHT11的回应

//返回1:未检测到DHT11的存在

//返回0:存在

u8 DHT11_Check(void)    

{   

u8 retry=0;//定义临时变量

DHT11_IO_IN();//SET INPUT 

    while ((GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==1)&&retry<100)//DHT11会拉低40~80us

{

retry++;

delay_us(1);

}; 

if(retry>=100)return 1;

else retry=0;

    while ((GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==0)&&retry<100)//DHT11拉低后会再次拉高40~80us

{

retry++;

delay_us(1);

};

if(retry>=100)return 1;    

return 0;

}

//从DHT11读取一个位

//返回值:1/0

u8 DHT11_Read_Bit(void)  

{

 u8 retry=0;

while((GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==1)&&retry<100)//等待变为低电平

{

retry++;

delay_us(1);

}

retry=0;

while((GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==0)&&retry<100)//等待变高电平

{

retry++;

delay_us(1);

}

delay_us(40);//等待40us

if(GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==1)

return 1;

else 

return 0;   

}

//从DHT11读取一个字节

//返回值:读到的数据

u8 DHT11_Read_Byte(void)    

{        

    u8 i,dat;

    dat=0;

for (i=0;i<8;i++) 

{

   dat<<=1; 

    dat|=DHT11_Read_Bit();

    }    

    return dat;

}

 

//从DHT11读取一次数据

//temp:温度值(范围:0~50°)

//humi:湿度值(范围:20%~90%)

//返回值:0,正常;1,读取失败

u8 DHT11_Read_Data(u8 *temp,u8 *humi)    

{        

 u8 buf[5];

u8 i;

DHT11_Rst();

if(DHT11_Check()==0)

{

for(i=0;i<5;i++)//读取40位数据

{

buf[i]=DHT11_Read_Byte();

}

if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])

{

*humi=buf[0];

*temp=buf[2];

}

}else return 1;

return 0;    

}

//初始化DHT11的IO口 DQ 同时检测DHT11的存在

//返回1:不存在

//返回0:存在     

void DHT11_Init(void)

{     

DHT11_Rst();  //复位DHT11

DHT11_Check();//等待DHT11的回应

}

 

5.03.11  main.c文件里的内容是

#include "pbdata.h"

 

void RCC_Configuration(void);

void GPIO_Configuration(void);

void NVIC_Configuration(void);

void USART_Configuration(void);

 

int fputc(int ch,FILE *f)

{

USART_SendData(USART1,(u8)ch);

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

return ch;

}

 

int main(void)

{

   u8 wd=0;      

   u8 sd=0;

 

   RCC_Configuration();//系统时钟初始化

   GPIO_Configuration();//端口初始化

   USART_Configuration();

   NVIC_Configuration();

 

   DHT11_Init();

   

   while(1)

   {

  DHT11_Read_Data(&wd,&sd);//读取温湿度值    

  printf("当前环境温度: %d ℃rn",wd);    

  printf("当前环境湿度: %d %%rn",sd);    

  delay_ms(1000);

  delay_ms(1000);

   }

}

 

void RCC_Configuration(void)

{

    SystemInit();//72m

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

}

 

void GPIO_Configuration(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

 

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA,&GPIO_InitStructure);

}

 

void NVIC_Configuration(void)

{

   NVIC_InitTypeDef NVIC_InitStructure; 

 

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 

 

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

NVIC_Init(&NVIC_InitStructure);

}

 

void USART_Configuration(void)

{

    USART_InitTypeDef  USART_InitStructure;

 

USART_InitStructure.USART_BaudRate=9600;

USART_InitStructure.USART_WordLength=USART_WordLength_8b;

USART_InitStructure.USART_StopBits=USART_StopBits_1;

USART_InitStructure.USART_Parity=USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;

[1] [2]
关键字:STM32  温湿度传感器模块  DHT11 引用地址:STM32 模块篇-温湿度传感器模块(DHT11)实验

上一篇:STM32 嵌入式学习入门 —— 窗口看门狗 & 独立看门狗
下一篇:零知开源分享- 温湿度模块DHT11的使用

推荐阅读最新更新时间:2024-11-08 21:34

利用ST-LINK配合ST-LINK Utility 将bin文件下载到STM32的FLASH中
背景 项目需求,要把字模文件导入到32中FLASH的指定地址,使用了ST-LINK V2 连接单片机和计算机,然后通过ST-LINK Utility 软件的配合将弄好的字模bin文件导入到FLASH指定地址。下面记录一下整个过程: 1.连接ST-LINK V2与单片机 博主的只需要连接4个线即可: VDD GND SWCLK SWDIO 2.配置工程 然后打开工程,进行配置,选择ST-Link Debugger 然后查看是否检测到ST-Link(选择SW) 如果你的可以显示如图内容,那么就成功连接了。 3.配置ST-LINK Utility 打开软件后的界面如示: 点击蓝色的球,打开设置界面,设置Por
[单片机]
利用ST-LINK配合ST-LINK Utility 将bin文件下载到<font color='red'>STM32</font>的FLASH中
STM32唯一ID读取方法
STM32唯一ID STM32微控制器有一个96位的产品唯一身份标识,在任何情况下都是唯一且不允许修改 这个96位的产品唯一身份标识,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。 基地址:0x1FFF F7E8 以全字(32bit)读取 u32 GetLockCode(void) { u32 stm32Id ={0}; stm32Id =*(vu32*)(0x1ffff7e8); stm32Id =*(vu32*)(0x1ffff7ec); stm32Id =*(vu32*)(0x1ffff7f0); return (stm32Id 1)+(stm32Id 2
[单片机]
startup_stm32f10x_xx.s 启动代码文件选择
stm32给的库文件太琐碎了,正如它的芯片型号一样繁多,例如启动文件: 网上查到的各个文件的解释是: startup_stm32f10x_cl.s 互联型的器件,STM32F105xx,STM32F107xx startup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_hd_vl.s 大容量的STM32F100xx startup_stm32f10x_ld.s 小容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_ld_vl.s 小容量的STM32F100xx st
[单片机]
startup_stm32f10x_xx.s 启动代码文件选择
STM32单片机ADC库函数的定义和使用方法
ADC的基本概念希望各位网友查阅相应的手册,上面对ADC有比较详尽的介绍,包括误差的分析和消除。这里主要介绍ADC的基本库函数的定义和使用。 1.ADC_DeInit函数的功能是将外设ADCx的全部寄存器重设为默认值。 ADC_DeInit(ADC2); 2.ADC_Init函数的功能是根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器。其中ADC_InitTypeDef定义在stm32f10x_adc.h中。其结构体如下所示: typedef struct { u32 ADC_Mode;//可以设置ADC_Mode FunctionalState ADC_ScanConvMode;//规定了模数转换工
[单片机]
STM32中的独立看门狗和窗口看门狗
一、前言 在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况。为了避免这种情况的出现,后期的MCU都集成了看门狗的功能。但是目前看门狗发展到今天基本上分为两大类:独立看门狗和窗口看门狗。 独立看门狗:使用的是外部时钟,即使主频不工作了,看门狗也能正常工作。只要在到达喂狗时间的上限前喂狗即表示程序是正常的,这点和窗口看门狗是有区别的。另外独立看门狗是独立于整个系统之外的,这也是独立看门狗名字的由来,他有自己独立的时钟,不受整个系统的影响,所以独立看门狗主要用来监控硬件上的错误。 窗口看门狗:使用芯片内部时钟。喂狗的时间既有上限又有下限,即喂狗太早或者太晚都不行,比如我要求你在0.8s到0.9s内完成
[单片机]
基于STM32的智能饮水机系统设计
一、项目背景 随着智能化的迅速发展,人们对于生活中的各类设备也越来越有智能化的需求,其中智能饮水机是一种比较常见的设备。智能饮水机不仅可以提供饮用水,还可以通过智能化的技术满足人们对于水质、水温、出水量等方面的需求。因此,当前设计了一种基于STM32的智能饮水机系统,以满足人们对智能化饮水机的需求。 智能饮水机系统其主要功能包括: 【1】控制加热芯片:通过继电器模块控制加热芯片,在水烧开后自动断电。 【2】液位感应:使用液位传感器感应水箱水位,当水位过低时通过语音模块进行播报提示。 【3】移动端控制:Android手机端可以显示当前双水箱内的水温,设置出水温度及出水量,并且还可以控制出水操作。 【4】主控芯片:采用STM32F
[单片机]
基于<font color='red'>STM32</font>的智能饮水机系统设计
意法半导体STM32C0系列高能效微控制器性能大幅提升
新微控制器 STM32C071扩大闪存和 RAM容量,增加USB控制器,支持 TouchGFX图形软件,让终端产品变得更纤薄、小巧,更具竞争力 2024 年 10 月 16 日,中国——现在, STM32 开发人员可以在 STM32C0微控制器(MCU)上获得更多存储空间和更多功能,在资源有限和成本敏感的嵌入式应用中实现更先进的功能。 STM32C071 MCU配备高达128KB的闪存和 24KB 的 RAM ,还新增不需要外部晶振的USB从设备,支持TouchGFX图形软件。片上 USB控制器让设计人员轻松节省至少一个外部时钟和四个去耦电容,降低物料清单成本,简化 PCB元器件布局。此外,新产品只有一对电源线,这有助
[单片机]
意法半导体STM32C0系列高能效微控制器性能大幅提升
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved