温湿度采集系统设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 通过图 9-1 可知,DHT11 模块的 DATA 引脚连接到 MCU,温湿度 的获取只和这个引脚有关,DATA 用于微处理器与 DHT11 之间的通 信和同步,采用单总线数据格式,一次通信时间为 4 ms 左右,数据 分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以 后扩展,现读出为零。操作流程如下:
上一页
返回
图 9-1 温湿度模块与 STM32 部分接口 电路
返回
图 9-2 通信过程(一)
返回
图 9-3 通信过程(二)
返回
图 9-4 数字“0”的信号表示方法
返回
图 9-5 数字“1”的信号表示方法
返回
图 9-6 温湿度采集系统的软件流程
返回
下一页 返回
9.3 程 序 实 现
• GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; • GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输
出 • GPIO_Init(GPIO_PORT, &GPIO_InitStructure); •} • (3)将 DHT11 的 I/O 端口设置成上拉输入。 • static void DHT11_IO_IN(void) • { GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; • GPIO_Init(GPIO_PORT, &GPIO_InitStructure); } • (4)将 DHT11 的 I/O 端口设置成推挽输出。 • static void DHT11_IO_OUT(void)
上一页 下一页 返回
9.1 系统结构
• 总线空闲状态为高电平,主机把总线拉低等待 DHT11 响应,主机把 总线拉低必须大于18 ms,以保证 DHT11 能检测到起始信号。 DHT11 接收到主机的开始信号后,等待主机开始信号结束,然后发 送 80 μs 低电平响应信号。主机发送开始信号结束后,延时等待 20~40 μs后,读取 DHT11 的响应信号,主机发送开始信号后,可 以切换到输入模式,或者输出高电平,总线由上拉电阻拉高。
• 根据温湿度传感器 DHT11 的工作原理以及温湿度数据读取时序,通 过编程实现温湿度值的采集,程序解析过程如下:
• (1)DHT11 I/O 资源宏定义。 • #define GPIO_CLK RCC_APB2Periph_GPIOB • #define GPIO_PIN GPIO_Pin_5 • #define GPIO_PORT • (2)DHT11 模块 I/O 初始化。 • void DHT11_Init(void) • { RCC_APB2PeriphClockCmd(GPIO_CLK, ENABLE); • GPIO_InitStructure.GPIO_Pin=GPIO_PIN;
上一页 下一页 返回
9.3 程 序 实 现
• { retry++; delay_us(1); } • retry=0; • while(!DHT11_DQ_IN()&&retry<100)//等待变为高电平 • { retry++; delay_us(1); } • delay_us(40);//等待 40us • if(DHT11_DQ_IN())return 1; • else return 0; •} • (10)读取 DHT11 的一个字节的数据。 • static u8 DHT11_Read_Byte(void) • { u8 i,dat = 0;
• 数字“0”和“1”的信号表示方法分别如图 9-4 和图 9-5 所示。
上一页
返回
9.2 软 件 结 构
• 温湿度采集系统的软件流程如图 9-6 所示。
返回
9.3 程 序 实 现
• 温湿度采集是通过 STM32 开发板的 PB5 口模拟 DHT11 的读取时序, 读取 DHT11 的温湿度数据,读取到温湿度数据后通过串口打印输出。
上一页 下一页 返回
9.3 程 序 实 现
• for (i=0;i<8;i++) { • dat<<=1; • dat|=DHT11_Read_Bit(); } • return dat; •} • (11)读取 DHT11 的温湿度数据并打印。 • int DHT11_Read_Data(void) • { u8 buf[5], u8 i; • static unsigned int t, h; • DHT11_Rst();//主机发送起始信号 • //判断 DHT11 是否发送响应信号
上一页 下一页 返回
9.3 程 序 实 现
• DHT11_DQ_OUT(0); //主机拉低 • delay_ms(20); //拉低至少 18ms • DHT11_DQ_OUT(1); //主机拉高 • delay_us(30); //主机拉高 20~40us } • (8)检查 DHT11 是否发送响应信号。 • u8 DHT11_Check(void) • { u8 retry=0; • DHT11_IO_IN();//将 I/O 端口设置成上拉输入 • while (!DHT11_DQ_IN()&&retry<100)//DHT11 会拉低 40~80us • { retry++; delay_us(1); }; • if(retry>=100)
上一页 下一页 返回
9.3 程 序 实 现
• return 1; • else retry=0; • while (DHT11_DQ_IN()&&retry<100)//DHT11 拉低后会再次拉高
40~80us • { retry++; delay_us(1); }; • if(retry>=100) return 1; • return 0; •} • (9)读取 DHT11 的一个数据位。 • static u8 DHT11_Read_Bit(void) • { u8 retry=0; • while(DHT11_DQ_IN()&&retry<100)//等待变为低电平
第 9 章 温湿度采集系统设计
• 9.1 系统结构 • 9.2 软件结构 • 9.3 程序实现
返回
9.1 系结构
• DHT11 数字温湿度传感器模块与 STM32 开发板部分接口电路如图 9-1 所示。
• 根据 STM32 开发板的电路原理图得知,图 9-1 中的 GPIO 口连接到 STM32 开发板的 PB5口。下面介绍 DHT11 获取温湿度值的工作原 理。
• 一次完整的数据传输为 40 bit,高位先出。数据格式:8 bit 湿度整 数数据 +8 bit 湿度小数数据 +8 bit 温度整数数据 +8 bit 温度小数数 据+8 bit 校验和。
下一页 返回
9.1 系统结构
• 数据传送正确时校验和数据等于“8 bit 湿度整数数据+8 bit 湿度小 数数据+8 bit 温度整数数据+8 bit 温度小数数据”所得结果的末 8 位。 STM32 发送一次开始信号后,DHT11 从低功耗模式转换到高速模式, 等待主机开始信号结束后,DHT11 发送响应信号,送出 40 bit 的数 据,并触发一次信号采集,用户可选择读取部分数据。从模式下, DHT11 接收到开始信号触发一次温湿度采集,如果没有接收到主机 发送的开始信号,DHT11 不会主动进行温湿度采集。采集数据后转 换到低速模式。通信过程如图 9-2、图 9-3 所示。
上一页 下一页 返回
9.3 程 序 实 现
• if(DHT11_Check()) return -1; • for(i=0;i<5;i++) //读取 40 位数据 • { buf[i]=DHT11_Read_Byte(); } • if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) //数据校验 • { h=buf[0]; t=buf[2]; • if(h&t) printf("湿度: %u%% 温度: %u℃ \r\n", h, t); •} • return 0; •}
上一页 下一页 返回
9.3 程 序 实 现
• { GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; • GPIO_Init(GPIO_PORT, &GPIO_InitStructure); } • (5)I/O 端口电平输出。 • static void DHT11_DQ_OUT(uint8_t dat) • { GPIO_WriteBit(GPIO_PORT, GPIO_PIN, dat); } • (6)读取 I/O 端口的电平值。 • static uint8_t DHT11_DQ_IN(void) • { return GPIO_ReadInputDataBit(GPIO_PORT, GPIO_PIN); } • (7)主机发送起始信号。 • void DHT11_Rst(void) • { DHT11_IO_OUT(); //将 I/O 端口设置成推挽输出
相关文档
最新文档