Professional Documents
Culture Documents
5.03 STM32 模块篇-温湿度传感器模块(DHT11)实验
5.03 STM32 模块篇-温湿度传感器模块(DHT11)实验
学 ARM 从 STM32 开始
STM32 开发板库函数教程--模块篇
官方网站:http://www.zxkjmcu.com
官方店铺:http://zxkjmcu.taobao.com
官方论坛:http://bbs.zxkjmcu.com
刘洋课堂:http://school.zxkjmcu.com
版本号:V2.1 第 1 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
目 录
5.03.1 概述...................................................................................................... 3
5.03.1.1 性能描述................................................................................... 4
5.03.1.2 传感器时序............................................................................... 4
5.03.2 实验目的..............................................................................................6
5.03.3 硬件设计..............................................................................................7
5.03.4 软件设计..............................................................................................7
5.03.4.1 软件设计说明........................................................................... 8
5.03.4.3 自定义头文件........................................................................... 8
5.03.12 程序下载..........................................................................................19
5.03.13 实验效果图..................................................................................... 20
版本号:V2.1 第 2 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
5.03 温湿度传感器模块实验
5.03.1 概述
DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复
合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具
有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一
质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个 DHT11 传感
器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在
OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单
线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号
传输距离可达 20 米以上,使其成为各类应用甚至最为苛刻的应用场合的最
佳选则。
图 5.03.1 标准封装
版本号:V2.1 第 3 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
所示。
5.03.1.1 性能描述
1. 供电电压:3-5.5V
2. 供电电流:最大 2.5mA
3. 温度范围:0-50℃ 误差±2℃
4. 湿度范围:20-90%RH 误差±5%RH
6. 测量分辨率分别为 8bit(温度)、8bit(湿度)
7. 采样周期间隔不得低于 1 秒钟
8. 模块尺寸:30x20mm
图 5.03.2 典型应用电路
际情况使用合适的上拉电阻。
5.03.1.2 传感器时序
当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为 40bit,高位先出。
数据格式:
+8bit 校验和
次信号采集,用户可选择读取部分数据.从模式下,DHT11 接收到开始信号触
发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11 不会主动进行
温湿度采集.采集数据后转换到低速模式。
通讯过程如图
图 5.03.3 工作时序图
版本号:V2.1 第 5 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉
电阻拉高。
电平的长短定了数据位是 0 还是 1.格式见下面图示.如果读取响应信号为高
5.03.2 实验目的
括硬件和软件实现两部分;
版本号:V2.1 第 6 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
的系统设计方法。
5.03.3 硬件设计
5.03.4 软件设计
版本号:V2.1 第 7 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
5.03.4.1 软件设计说明
章介绍的工作原理,我们就可以按照工作时序编写出数据采集程序。我们还
是采用库函数的方式进行程序设计。
在这节程序设计中,用到了外部中断函数;prinif 重定向打印输出函
数; USART 串口通讯函数;定时器函数。
stm32f10x_gpio.c
stm32f10x_rcc.c
Misc.c // 中断控制字(优先级设置)库函数
stm32f10x_exti.c // 外部中断库处理函数
stm32f10x_tim.c // 定时器库处理函数
stm32f10x_usart.c // 串口通讯函数
本节实验及以后的实验我们都是用到库文件,其中 stm32f10x_gpio.h
配置函数以及相关的外设时钟使能函数,所以我们要把这两个头文件对应的
含了中断优先级的设置,stm32f10x_exti.c 库函数主要包含了外部中断设
置参数,tm32f10x_tim.c 库函数主要包含定时器设置,tm32f10x_usart.c
库函数主要包含串行通讯设置,这些函数也要添加到函数库中。以上库文件
包含了本次实验所有要用到的函数使用功能。
5.03.4.3 自定义头文件
版本号:V2.1 第 8 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
pbdata.h
pbdata.c
我们在每个工程设计中都要创建了两个公共的文件,这两个文件主要存
放我们自定义的公共函数和全局变量,以方便以后每个功能模块(函数)之
间传递参数。
#ifndef _pbdata_H
#define _pbdata_H
#include "stm32f10x.h"
#include "misc.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_usart.h"
#include "stdio.h"
#include "DHT11.h"
//定义变量
extern u8 dt;
//定义函数
void RCC_HSE_Configuration(void);
void delay(u32 nCount);//
void delay_us(u32 nus);//微妙延时程序函数
void delay_ms(u16 nms);//毫妙延时程序函数
#endif
会提示重复调用错误。
版本号:V2.1 第 9 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
u8 dt=0;
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*设置系统时钟(SYSCLK)*/
while(RCC_GetSYSCLKSource() != 0x08); /*0x08:PLL 作为系统时钟 */
}
}
/***********************************************************************
* 名 称:delay_us(u32 nus)
* 功 能:微秒延时函数
* 入口参数:u32 nus
* 出口参数:无
版本号:V2.1 第 10 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
* 说 明:
* 调用方法:无
***********************************************************************/
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD = 9*nus;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
/***********************************************************************
* 名 称:delay_ms(u16 nms)
* 功 能:毫秒延时函数
* 入口参数:u16 nms
* 出口参数:无
* 说 明:
* 调用方法:无
***********************************************************************/
void delay_ms(u16 nms)
{
//注意 delay_ms 函数输入范围是 1-1863
//所以最大延时为 1.8 秒
u32 temp;
SysTick->LOAD = 9000*nms;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
版本号:V2.1 第 11 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
次也不例外。
SystemInit();//72m
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//设置 PA 输出端口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//设置 PE 输出
RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//设置串口 1 时钟使
能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//功能复用 IO 时钟使能
部芯片通讯,所以要打开功能复用时钟。
在主程序中采用 while(1)循环语句,采用查询方式不停的读取温湿度
数据,然后直接通过串口送打印输出到屏幕。
while(1)
{
DHT11_Read_Data(&wd,&sd); //读取温湿度值
printf("当前环境温度: %d ℃\r\n",wd);
printf("当前环境湿度: %d %%\r\n",sd);
delay_ms(1000);
delay_ms(1000);
}
版本号:V2.1 第 12 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
函数后,只有串口 1 有参数输出。
/* Includes
------------------------------------------------------------------*/
#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);
}
}
函数 dht11.h 在这里是为符合温湿度模块功能自定义的专用功能函数,
dht11.h 的内容如下:
#ifndef __DHT11_H
#define __DHT11_H
#include "pbdata.h"
void DHT11_IO_OUT(void);//温湿度模块输出函数
版本号:V2.1 第 13 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
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
版本号:V2.1 第 14 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
版本号:V2.1 第 15 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
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;
}
版本号:V2.1 第 16 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
return 0;
}
//初始化 DHT11 的 IO 口 DQ 同时检测 DHT11 的存在
//返回 1:不存在
//返回 0:存在
void DHT11_Init(void)
{
DHT11_Rst(); //复位 DHT11
DHT11_Check();//等待 DHT11 的回应
}
#include "pbdata.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void USART_Configuration(void);
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); //读取温湿度值
版本号:V2.1 第 17 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
printf("当前环境温度: %d ℃\r\n",wd);
printf("当前环境湿度: %d %%\r\n",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)
版本号:V2.1 第 18 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
{
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_HardwareFlowContr
ol_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
USART_ClearFlag(USART1,USART_FLAG_TC);
}
5.03.12 程序下载
传感器功能和原理。
请根据下图所指向的 7 个重点区域配置。其中(1)号区域根据自己机
器的实际情况选择,我的机器虚拟出来的串口号是 COM3。(2)号区域请自
己选择程序代码所在的文件夹。(7)号区域当程序下载完后,进度条会到
达最右边,并且提示一切正常。(4、5、6)号区域一定要按照上图显示的
设置。当都设置好以后就可以直接点击(3)号区域的开始编程按钮下传程
序了。
版本号:V2.1 第 19 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
本节实验的源代码在光盘中:(LY-STM32 光盘资料\1.课程\2,外设篇\模块
篇 03.温湿度传感器模块(DHT11)\程序)
5.03.13 实验效果图
打开众想科技多功能监控软件,接着打开串口,我们在接收区可以观察
到实测采集到周围环境的温湿度数据,周围环境的温度大约 摄氏度左
右、湿度是 左右,说明我们温湿度模块工作正常,程序编写和设计思路
吻合。
版本号:V2.1 第 20 页 共 21 页 官方网站:www.zxkjmcu.com
(众想)哈尔滨卓恩科技开发有限公司 STM32 开发板用户使用手册
图 5.03.13.1 温湿度模块测试周围环境实验效果图
版本号:V2.1 第 21 页 共 21 页 官方网站:www.zxkjmcu.com