【龙芯1B】:DHT11温湿度例程

文章目录


前言

一、DHT11是什么?

二、使用步骤

1.代码

总结


前言

        首先感谢大家的关注,本文参考业内温湿度传感器资料,根据一些网络知识所编写,如若有错误请直接私信我,立马删帖道歉!谢谢大家的关注大家的关注才是我不断更新的动力!


一、DHT11是什么?

        (2条消息) DHT11温湿度传感器原理图V1.0-单片机文档类资源-CSDN文库

        上述链接是原理图,DHT11是数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。

DHT11
DHT11

引脚图
原理图

 优点:成本低、长期稳定、相对湿度和温度测量、品质卓越、超快响应、抗干扰能力强、超长的
信号传输距离、数字信号输出、精确校准。

接线:

        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   如果文章对您有帮助,请打赏一元呗,感谢支持,分享不易,码字不易。希望对大家帮助!


 出发,永远是最有意义的事,去做就是了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值