DHT11温湿度传感器

📅 2026/7/30 17:17:38
DHT11温湿度传感器
DHT11简介本文本质为学习笔记在B站学习后的代码总结数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器一次通讯时间 4ms 左右,一次完整的数据传输为 40bit高位先出数据分小数部分和整数部分bytel0为校验位。工作电压范围 3.3V-5.5V工作电流 平均 0.5mA输出单总线数字信号测量范围湿度 20~90RH温度 0~50℃精度 湿度±5%温度±2℃分辨率 湿度 1%温度 1℃时序图myDHT11.h代码#ifndef __MYDHT11_H_ #define __MYDHT11_H_ void myDHT11_putinit(void);//输入模式 void myDHT11_getinit(void);//输出模式 unsigned char myDHT11_readbyte(void);//读取8位字节 unsigned char myDHT11_getdata(unsigned char *wen_H,unsigned char *wen_L,unsigned char *shi_H,unsigned char *shi_L);//读取温湿度高低8位传入为指针读取温湿度时主要使用这个函数 #endifmyDHT11.c代码#include stm32f10x.h #include myDHT11.h #include delay.h//这个库相信你应该有的如果没有自己写一下也不难 /**************************只需更改下面参数即可移植*******************************/ #define myDHT11_RCC RCC_APB2Periph_GPIOA //时钟线选择 #define myDHT11_GPIO GPIOA //GPIO组选择 #define myDHT11_Pin GPIO_Pin_0 //引脚号 /**************************************************************************/ void myDHT11_putinit()//输入模式 { RCC_APB2PeriphClockCmd(myDHT11_RCC,ENABLE);//开启GPIOA时钟 GPIO_InitTypeDef GPIO_initstructure; GPIO_initstructure.GPIO_ModeGPIO_Mode_Out_OD;//推挽输出模式 GPIO_initstructure.GPIO_PinmyDHT11_Pin;//选择引脚号为PA0 GPIO_initstructure.GPIO_SpeedGPIO_Speed_50MHz;//输入速率 GPIO_Init(myDHT11_GPIO,GPIO_initstructure); } void myDHT11_getinit()//输出模式 { RCC_APB2PeriphClockCmd(myDHT11_RCC,ENABLE);//开启GPIOA时钟 GPIO_InitTypeDef GPIO_initstructure; GPIO_initstructure.GPIO_ModeGPIO_Mode_IN_FLOATING;//浮空输入模式 GPIO_initstructure.GPIO_PinmyDHT11_Pin;//选择引脚号为PA0 GPIO_initstructure.GPIO_SpeedGPIO_Speed_50MHz;//输入速率 GPIO_Init(myDHT11_GPIO,GPIO_initstructure); } unsigned char myDHT11_readbyte()//读取8位字节 { unsigned char retry0,i,temp,data0; for(i0;i8;i) { while(GPIO_ReadInputDataBit(myDHT11_GPIO,myDHT11_Pin)0 retry100) { Delay_us(1); retry; } retry0; Delay_us(30); temp0; if(GPIO_ReadInputDataBit(myDHT11_GPIO,myDHT11_Pin)1)temp1; while(GPIO_ReadInputDataBit(myDHT11_GPIO,myDHT11_Pin)1 retry100) { Delay_us(1); retry; } retry0; data1; data |temp; } return data; } unsigned char myDHT11_getdata(unsigned char *wen_H,unsigned char *wen_L,unsigned char *shi_H,unsigned char *shi_L)//读取温湿度高低8位传入为指针 { unsigned char i,retry0,sum0; unsigned char arr[5]; myDHT11_putinit(); GPIO_ResetBits(myDHT11_GPIO,myDHT11_Pin); Delay_ms(20);//18 30 GPIO_SetBits(myDHT11_GPIO,myDHT11_Pin); Delay_us(13);//10 20 myDHT11_getinit(); Delay_us(20); if(GPIO_ReadInputDataBit(myDHT11_GPIO,myDHT11_Pin)0) { while(GPIO_ReadInputDataBit(myDHT11_GPIO,myDHT11_Pin)0 retry100) { Delay_us(1); retry; } retry0; while(GPIO_ReadInputDataBit(myDHT11_GPIO,myDHT11_Pin)1 retry100) { Delay_us(1); retry; } retry0; for(i0;i5;i) { arr[i]myDHT11_readbyte(); } Delay_us(50); } sumarr[0]arr[1]arr[2]arr[3]; *shi_Harr[0]; *shi_Larr[1]; *wen_Harr[2]; *wen_Larr[3]; if(sumarr[4]) return 1;//校验正确返回1 else return 0;//校验错误返回0 }main.c代码#include stm32f10x.h #include OLED.h #include DHT11.h int main() { unsigned char wen_H,wen_L,shi_H,shi_L;//用于接收温湿度数据 OLED_Init(); while(1) { if(myDHT11_getdata(wen_H,wen_L,shi_H,shi_L)1)//温湿度校验,返回值为1则校验正确 { OLED_ShowNum(1, 6, wen_H, 2);//显示所读取的温度数值 OLED_ShowNum(2, 6, shi_H, 2);//显示所读取的湿度数值 } OLED_ShowChinese(1,1,0);//温 OLED_ShowChinese(1,2,1);//度 OLED_ShowChar(1, 5, :); OLED_ShowChinese(1,5,4);//℃ OLED_ShowChinese(2,1,2);//湿 OLED_ShowChinese(2,2,1);//度 OLED_ShowChar(2, 5, :); OLED_ShowChar(2, 8, %); } }