首页 > 编程知识 正文

dht11温湿度传感器优点,温湿度传感器dht11实验报告

时间:2023-05-03 15:23:24 阅读:140996 作者:4793

1 .数字温湿度传感器DHT11

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

2 .数字式温湿度传感器模块DHT11实物、原理图

2 .模块说明2.1 DHT11产品简介DHT11数字温湿度传感器是一种包含校准数字信号输出的温湿度复合传感器。 每个DHT11传感器都在非常准确的湿度检测室进行了校准。 校准系数作为程序存储在OTP存储器中,在传感器内部,在检测信号的处理过程中调用这些校准系数。 传感器包括电阻式感湿元件和NTC测温元件,与高性能8位单片机连接。 单线式串行接口使系统集成变得简单快捷。 超小型、极低功耗,信号传输距离可达20米以上,非常适合各种APP应用和最苛刻的APP应用。

2.2订货信息:型号测量范围湿度测量精度测温精度分辨率封装DHT11 20-90%RH 0-505%RH214针单列直插

2.3性能参数

2.4电源端子

DHT11的供电电压为3-5.5V。 接通传感器电源后,等待1s以克服不稳定状态。 在此期间,不需要发送命令。 可以在电源端子(VDD、GND )之间增加100nF的电容器,施加去耦滤波器。

2.5串行接口(单线双向)2.5.1 单总线工作原理:DATA输出线用于单片机和DHT11之间的通信,每次通信时间为4ms左右; 单片机发送一次开始信号后,DHT11从低功耗模式转移到高速模式,等待主机的开始信号结束后,DHT11发送应答信号,发送40比特的数据,触发一次信号采集,由用户在没有接收到从主机发送的开始信号的情况下,DHT11不积极地进行温湿度的采集。

2.5.2 数据格式:

一次完整的数据传输为40bit,上位先出; 数据格式:8bit湿度整数数据8bit湿度小数数据8bi温度整数数据8bit温度小数数据8bit校验; DHT11数据分为小数部分和整数部分,当前小数部分用于以后的扩展,当前读出为零; 测量分辨率分别为8bit (温度)、8bit (温度) )湿度)。 在数据传输正确情况下,奇偶校验位等于" 8bit湿度整数数据8bit湿度小数数据8bi温度整数数据8bit温度小数数据"之和;

通信流程

2.5.3 开始信号与响应信号

开始信号:由于上拉电阻,总线处于高电平,主机发出开始信号,将总线降低18ms以上,减去高电平延迟时间,等待20-40us后,读取DHT11的应答信号

响应信号:DHT11在接收到主机开始信号后,等待主机开始信号结束,发送80us低电平应答信号,将总线增加80us; 主机发送开始信号结束后,可以切换到输入模式,总线可以被上拉电阻上拉或输出高功率平均值。

2.5.4数据信号与结束信号

数据信号:每个位数据以50us低电平开始,高电平的长度决定数据位是0还是1。 下图:

结束信号:最后的bit数据传输完成后,DHT11降低总线50us,然后总线被上拉电阻提升而成为空闲状态。

数字0信号显示方法

数字1信号显示方法3.STM32程序和显示结果

//主函数# include stdio.h # include ' STM 32 F10 x.h '/# include ' bsp _ led.h ' # include ' bsp _ usart.h ' # inclue HSE_setsysclk(RCC_PLLmul_6; printf (串行端口printf函数测试(n ); while(1) if ) DHT_read ) ) printf )、(湿度: %d%,温度: %d度(r(n )、dat(0)、dat(0) ); systick_Delay_ms(3000; }/* * * * * endo ffile * * * * * * * * * * * * * * * * * * * * * * * * * endo ffile * * * * * * * * * *。

//dht11.c程序# include ' DHT 11.h ' # include ' bsp _ sy stick.h ' uint

8_t dat[5]={0x00,0x00,0x00,0x00,0x00};uint8_t sum=0;//初始化为输出void DHT11_GPIO_OUT(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);}//初始化为输入void DHT11_GPIO_IN(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure);}//读一个字节uint8_t DHT_Read_Byte(void){uint8_t temp;uint8_t ReadDat=0;uint8_t retry = 0;uint8_t i;for(i=0;i<8;i++){//数据信号低电平50uswhile(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&&retry<100){SysTick_Delay_us(1);retry++;}retry=0;SysTick_Delay_us(30);temp=0;//数字信号0,temp=0//数字0信号高电平持续28us,数字1信号高电平70us,延时30us以确认数字0或1if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1) temp=1;while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1&&retry<100)//数字1信号高电平剩余40us{SysTick_Delay_us(1);retry++;}retry=0;ReadDat<<=1;ReadDat|=temp;}return ReadDat;}uint8_t DHT_Read(void){uint8_t i;uint8_t retry = 0;//主机设置为输出,发送开始信号低电平18ms,高电平40usDHT11_GPIO_OUT();GPIO_ResetBits(GPIOB,GPIO_Pin_14);SysTick_Delay_ms(18);GPIO_SetBits(GPIOB,GPIO_Pin_14);SysTick_Delay_us(40);//主机设置为输入,检查并接收响应信号低电平80us,高电平80usDHT11_GPIO_IN();SysTick_Delay_us(20);//延时20us,低电平80us,还剩60us,检查是否是低电平以确定是否有响应信号if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0){while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&&retry<100)//接收响应信号低电平剩余60us{SysTick_Delay_us(1);retry++;}retry=0;//超过100us自动向下运行,以免卡死while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1&&retry<100)//接收响应信号高电平80us{SysTick_Delay_us(1);retry++;}retry=0;//接收8字节数据for(i=0;i<5;i++){dat[i]=DHT_Read_Byte();}SysTick_Delay_us(50);//DHT11拉低总线50us作为结束信号,或者使用以下语句//while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&&retry<100)//接收响应信号低电平剩余60us//{//SysTick_Delay_us(1);//retry++;//}//retry=0;}sum=dat[0]+dat[1]+dat[2]+dat[3];if(dat[4]==sum){return 1;}elsereturn 0;} //dth11.h程序#ifndef __DHT11_H#define __DHT11_H#include "stm32f10x.h"void DHT11_GPIO_OUT(void);void DHT11_GPIO_IN(void);uint8_t DHT_Read_Byte(void);uint8_t DHT_Read(void);#endif //延时.c函数#include "bsp_systick.h"#if 0static __INLINE uint32_t SysTick_Config(uint32_t ticks){ // 判断 tick 的值是否大于 2^24,如果大于,则不符合规则 if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); // 初始化reload寄存器的值 SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; // 配置中断优先级,配置为15,默认为最低的优先级NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); // 初始化counter的值为0 SysTick->VAL = 0; // 配置 systick 的时钟为 72M // 使能中断// 使能systick SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; return (0); }#endifvoid SysTick_Delay_us(uint32_t us){uint32_t i;SysTick_Config(72);for(i=0; i<us; i++){while( !((SysTick->CTRL) & (1<<16)) );}SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;}void SysTick_Delay_ms(uint32_t ms){uint32_t i;SysTick_Config(72000);for(i=0; i<ms; i++){while( !((SysTick->CTRL) & (1<<16)) );}SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;} //延时.h函数#ifndef __BSP_SYSTICK_H#define __BSP_SYSTICK_H#include "stm32f10x.h"#include "core_cm3.h"void SysTick_Delay_us(uint32_t us);void SysTick_Delay_ms(uint32_t ms);#endif /* __BSP_SYSTICK_H */ //12M晶振替换8M,RCC.C程序配置频率#include "bsp_rccclkconfig.h"void HSE_SetSysClk( uint32_t RCC_PLLMul_x ){ErrorStatus HSEStatus;// 把RCC 寄存器复位成复位值RCC_DeInit();// 使能 HSE RCC_HSEConfig(RCC_HSE_ON);HSEStatus = RCC_WaitForHSEStartUp();if( HSEStatus == SUCCESS ){// 使能预取指FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);// 配置 PLLCLK = HSE * RCC_PLLMul_x RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x); // 使能PLLRCC_PLLCmd(ENABLE);// 等待PLL稳定while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET ); // 选择系统时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while( RCC_GetSYSCLKSource() != 0x08 );}else {/* 如果HSE 启动失败,用户可以在这里添加处理错误的代码 */}}void HSI_SetSysClk( uint32_t RCC_PLLMul_x ){__IO uint32_t HSIStatus = 0;// 把RCC 寄存器复位成复位值RCC_DeInit();// 使能 HSI RCC_HSICmd(ENABLE);HSIStatus = RCC->CR & RCC_CR_HSIRDY;if( HSIStatus == RCC_CR_HSIRDY ){// 使能预取指FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);// 配置 PLLCLK = HSE * RCC_PLLMul_x RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_x); // 使能PLLRCC_PLLCmd(ENABLE);// 等待PLL稳定while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET ); // 选择系统时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while( RCC_GetSYSCLKSource() != 0x08 );}else {/* 如果HSI 启动失败,用户可以在这里添加处理错误的代码 */}}void MCO_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;// 开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 选择GPIO8引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//设置为复用功能推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//设置IO的翻转速率为50M GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// 初始化GPIOA8 GPIO_Init(GPIOA, &GPIO_InitStructure);} //12M晶振替换8M晶振,重新设置频率.H程序#ifndef __BSP_RCCCLKCONFIG_H#define __BSP_RCCCLKCONFIG_H#include "stm32f10x.h"void HSE_SetSysClk( uint32_t RCC_PLLMul_x );void MCO_GPIO_Config(void);void HSI_SetSysClk( uint32_t RCC_PLLMul_x );#endif /*__BSP_RCCCLKCONFIG_H */

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。