文章目录
前言
首先感谢大家的关注,本文参考业内温湿度传感器资料,根据一些网络知识所编写,如若有错误请直接私信我,立马删帖道歉!谢谢大家的关注大家的关注才是我不断更新的动力!
一、DHT11是什么?
(2条消息) DHT11温湿度传感器原理图V1.0-单片机文档类资源-CSDN文库
上述链接是原理图,DHT11是数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。
优点:成本低、长期稳定、相对湿度和温度测量、品质卓越、超快响应、抗干扰能力强、超长的
信号传输距离、数字信号输出、精确校准。
接线:
1、VDD 供电3.3~5.5V DC
2、DATA 串行数据,单总线
3、NC 空脚
4、GND 接地,电源负极
注意事项:
1、典型应用电路中建议连接线长度短于5m时用4.7K上拉电阻,大于5m时根据实际情况降 低上拉电阻的阻值。
2、使用3.3V电压供电时连接线尽量短,接线过长会导致传感器供电不足,造成测量偏差。 3、每次读出的温湿度数值是上一次测量的结果,欲获取实时数据,需连续读取2次,但不建议连续多次读取传感器。
4、电源部分如有波动,会影响到温度。
二、使用步骤
1.代码
DHT11.c
#include "ls1b_gpio.h" #include "src/dht11.h" #include "bsp.h" #include "ls1b.h" #include "tick.h" #include "ls1x_fb.h" #include <stdio.h> /************************************************************** *功 能:复位DHT11 *参 数: 无 *返回值: 无 **************************************************************/ void DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_OUT(0); //拉低DQ delay_ms(20); //拉低至少18ms DHT11_DQ_OUT(1); //DQ=1 delay_us(40); //主机拉高20~40us } /************************************************************** *功 能:等待DHT11的回应 *参 数: 无 *返回值: 返回1:未检测到DHT11的存在; 返回0:存在 **************************************************************/ unsigned char DHT11_Check(void) { unsigned char retry=0; DHT11_IO_IN(); //SET INPUT while (DHT11_DQ_IN()&&retry<100) //DHT11会拉低40~80us { retry++; delay_us(1); } if(retry>=100)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; } /************************************************************** *功 能:从DHT11读取一个位 *参 数: 无 *返回值: 1/0 **************************************************************/ unsigned char DHT11_Read_Bit(void) { unsigned char retry=0; while(DHT11_DQ_IN()&&retry<100) //等待变为低电平 { 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; } /************************************************************** *功 能:从DHT11读取一个字节 *参 数: 无 *返回值: 读到的数据 **************************************************************/ unsigned char DHT11_Read_Byte(void) { unsigned char i,dat; dat=0; for (i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit(); } return dat; } /************************************************************** *功 能:从DHT11读取一次数据 *参 数: temp:温度值(范围:0~50°);humi:湿度值(范围:20%~90%) *返回值: 0,正常;1,读取失败 **************************************************************/ unsigned char DHT11_Read_Data(unsigned int *temp,unsigned int *humi) { unsigned char buf[5]; unsigned char i; DHT11_Rst(); if(DHT11_Check()==0) { for(i=0;i<5;i++) //读取40位数据 { buf[i]=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humi = buf[0] * 10 + buf[1]; *temp = buf[2] * 10 + buf[3]; } } else return 1; return 0; } /************************************************************** *功 能:初始化DHT11的IO口 DQ,同时检测DHT11的存在 *参 数: 无 *返回值: 返回1:不存在;返回0:存在 **************************************************************/ unsigned char DHT11_Init(void) { gpio_enable(DHT11_IO,DIR_OUT); gpio_write(DHT11_IO,1); DHT11_Rst(); //复位DHT11 return DHT11_Check(); //等待DHT11的回应 } /************************************************************** *功 能:初始化输出端口 *参 数: 无 *返回值: 无 **************************************************************/ void DQ_OUT(void) { gpio_enable(DHT11_IO,DIR_OUT); } /************************************************************** *功 能:初始化输入端口 *参 数: 无 *返回值: 无 **************************************************************/ void DQ_IN(void) { gpio_enable(DHT11_IO,DIR_IN); } /************************************************************** *功 能:DHT11传感器检测 *参 数: 无 *返回值: 无 **************************************************************/ void DHT11_WHILE(void) { while(DHT11_Init()) { delay_ms(50); } } /************************************************************** *功 能:读取温湿度值 *参 数: 无 *返回值: 无 **************************************************************/ void DHT11_Test() { static unsigned int temperature; static unsigned int humidity; char data[20]; char data_humi[20]; fb_fillrect(120, 70, 480, 200, cidxBLACK); DHT11_Read_Data(&temperature,&humidity); //读取温湿度值 sprintf(data,"%2.1f ℃ ",temperature/10.0); fb_textout(120, 70, data); sprintf(data_humi,"%d %%RH ",humidity/10); fb_textout(120, 100, data_humi); }
DHT11.h
#ifndef _DHT11_H #define _DHT11_H #define DHT11_IO 29 //IO方向设置 #define DHT11_IO_IN() DQ_IN() #define DHT11_IO_OUT() DQ_OUT() IO操作函数 #define DHT11_DQ_OUT(X) gpio_write(DHT11_IO,(int)X)//数据端口 #define DHT11_DQ_IN() gpio_read(DHT11_IO)//数据端口 unsigned char DHT11_Init(void); //初始化DHT11 unsigned char DHT11_Read_Data(unsigned int *temp,unsigned int *humi); //读取温湿度 unsigned char DHT11_Read_Byte(void); //读出一个字节 unsigned char DHT11_Read_Bit(void); //读出一个位 unsigned char DHT11_Check(void); //检测是否存在DHT11 void DHT11_Rst(void); //复位DHT11 void DQ_OUT(void); void DQ_IN(void); void DHT11_Test(void); void DHT11_WHILE(void); #endif // _DHT11_H
总结
谢谢大家的观看,有错误希望大家指正!
联系我们
vx ——> buildupup 公众号 嵌入式up 如果文章对您有帮助,请打赏一元呗,感谢支持,分享不易,码字不易。希望对大家帮助!