DHT11温湿度传感器程序设计
本程序对应的开发板为蓝桥杯嵌入式开发板stm32f103rbt6,为中型mcu。DHT11是单线接口数字温湿度传感器,温度测量范围是0~50℃,湿度测量范围是20%~90%RH,温度测量精度是±2℃,湿度测量精度是±5%RH。
DHT11包含一个电阻式感湿元件和一个NTC(负温度系数)测温元件,通过双向单线输出温湿度数据,一次数据输出为40位(高位在前,大约需要4ms),数据格式为:
8位湿度整数+8位湿度小数+8位温度整数+8位温度小数+8位校验和。其中校验和是前4个8位数据之和的后8位


读取步骤



连接:
P4.7(PA7)-P3.7(HDQ)
dht11.c
#include "stm32f10x.h"#define delay_us(X) delay(X*72/5)void delay(unsigned int n)
{while (n--);
}void dht11_init (void )
{GPIO_InitTypeDef GPIO_InitStructure;/* Enable clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);/* Configure Ports */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_7);}void mode_input(void )
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void mode_output(void )
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
}unsigned int dht11_read(void)
{int i;long long val;int timeout;GPIO_ResetBits(GPIOA, GPIO_Pin_7);delay_us(18000); //pulldown for 18msGPIO_SetBits(GPIOA, GPIO_Pin_7);delay_us( 20 ); //pullup for 30usmode_input();//等待DHT11拉高,80ustimeout = 5000;while( (! GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_7)) && (timeout > 0) ) timeout--; //wait HIGH//等待DHT11拉低,80ustimeout = 5000;while( GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_7) && (timeout > 0) ) timeout-- ; //wait LOW#define CHECK_TIME 28for(i=0;i<40;i++){timeout = 5000;while( (! GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_7)) && (timeout > 0) ) timeout--; //wait HIGHdelay_us(CHECK_TIME);if ( GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_7) ){val=(val<<1)+1;} else {val<<=1;}timeout = 5000;while( GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_7) && (timeout > 0) ) timeout-- ; //wait LOW}mode_output();GPIO_SetBits(GPIOA, GPIO_Pin_7);if (((val>>32)+(val>>24)+(val>>16)+(val>>8) -val ) & 0xff ) return 0;else return val>>8; }
dht11.h
#ifndef __DHT11_H
#define __DHT11_Hvoid dht11_init (void );
void delay(unsigned int n);unsigned int dht11_read(void);#endif
主程序
#include "stm32f10x.h"
#include "lcd.h"
#include "dht11.h"u32 TimingDelay = 0;void Delay_Ms(u32 nTime);
unsigned int Dht_Val;
unsigned char string[20],Sec1,Sec;
unsigned long Tick_Ms;void Dht11_Proc(void);int main(void)
{STM3210B_LCD_Init();LCD_Clear(Blue);LCD_SetBackColor(Blue);LCD_SetTextColor(White);SysTick_Config(SystemCoreClock/1000);dht11_init();LCD_DisplayStringLine(Line0," "); LCD_DisplayStringLine(Line1," "); LCD_DisplayStringLine(Line2," ");LCD_DisplayStringLine(Line3," ");LCD_DisplayStringLine(Line4," ");LCD_DisplayStringLine(Line5," ");LCD_DisplayStringLine(Line6," ");LCD_DisplayStringLine(Line7," "); LCD_DisplayStringLine(Line8," ");LCD_DisplayStringLine(Line9," "); while (1){Dht11_Proc();}
}void Dht11_Proc(void)
{if(Sec1!=Sec){Sec1=Sec;Dht_Val=dht11_read();sprintf((char*)string,"Humidity: %2d%",Dht_Val>>24);LCD_DisplayStringLine(Line1,string);sprintf((char*)string,"Temperature: %2dC",(Dht_Val>>8)&0xff);LCD_DisplayStringLine(Line4,string);}}void Delay_Ms(u32 nTime)
{TimingDelay = nTime;while(TimingDelay != 0);
}void SysTick_Handler(void)
{TimingDelay--;Tick_Ms++;if(Tick_Ms%1000==0)Sec++;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
