先来认识一下这个传感器
DHT11温湿度传感器图片
以下是他的封装尺寸以及管脚介绍
1、VDD供电 3.3~5.5V DC
2、DATA 串行数据,单总线
3、NC 空脚
4、GND接地,电源负极
DHT11和单片机之间的通信时通过io口来通信的,以下是它的通信介绍
DHT11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。设备(主机或从机)通过一个漏枀开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接一个约 4.7kΩ 的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结极,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。
单总线传送数据位定义DATA 用于微处理器与 DHT11 之间的通讯和同步,采用单总线数据格式,一次传送 40 位数据,高位先出。
上面一段话中所说的主机就是Stm32单片机,从机就是传感器内的一个8位单片机,传输模式是主机给从机发送一个信号,然后从机应答后返还给主机数据。主机和从机依靠一个IO口的高低电平进行通信。既然用到IO口那么我们就必须找到并配置这个IO口。
简单认识之后看开发板原理图DTH11是连接在哪个IO口
这个传感器连接在PG11 io口上,那么我们需要配置这个端口
之前配置io口,需要开启GPIOx的时钟,创建一个GPIO_initTypeDef结构体,选择管脚、输出速率、IO口输入输出模式,最后调用函数初始化IO
PG11在GPIOG上,那初始化GPIO函数的第一个参数选择GPIOG,管脚和速率我们选择GPIO_Pin_11、GPIO_Speed_50MHz,只剩下IO口输入输出模式这个参数通过DTH11数据手册的时序图介绍可知
时序图有实线和虚线、实线代表主机信号(单片机信号)、虚线代表从机信号(DTH11响应的信号).
(1)主机通过拉低IO口之后至少延迟18ms,然后拉高IO口与从机通信,这个过程我们站在32芯片单片机的角度来看,io口当然要配置成输出模式。(2)那么从机响应信号后给主机返回信号,信号到达主机,主机通过读取IO口高低电平状态来读取数据,这个过程当然IO口要配置成输入模式。
这里主机既要求IO口配置成输出模式,从机又要求IO口配置成输入模式,我们怎么解决这个矛盾?
查询GPIO口输出模式得到将IO口配置成开漏模式可以解决这个矛盾,至此配置IO口的所有参数确定
dht11.h头文件代码:
#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f10x.h"
#define dht11_High() GPIO_SetBits(GPIOG,GPIO_Pin_11)
#define dht11_low() GPIO_ResetBits(GPIOG,GPIO_Pin_11)
#define dht11_readG11() GPIO_ReadInputDataBit(GPIOG