DHT11温湿度模块代码(无原理内容)

头文件

(.h文件)

#ifndef _DHT11_
#define _DHT11_

char DHT11_BeginWork(void);
	
float DHT11_GetTemperature(void);

float DHT11_GetHumidity(void);

#endif

实现文件 

(.c文件)

#include "stm32f10x.h"
#include "Delay.h"

unsigned char RECDATA[4];
float Temperature = 0;
float Humidity = 0;

/*DHT11模块的延时函数,单独写一个是为了解耦合,方便移植*/
void DHT11_Delay_us(unsigned int us)
{
    Delay_us(us);
}

/*stm32输出到DHT11_DATA*/
void DHT11_DATA_OUT(unsigned char out)
{
	GPIO_WriteBit(GPIOB,GPIO_Pin_12,(BitAction)out);
}

/*DHT11_DATA输出到stm32*/
char DHT11_DATA_IN(void)
{
	return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12);
}

/*mode=1:推挽输出,mode=0:浮空输入*/
void Charge_DHT11_DATA_MODE(char mode)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	if(mode == 0)
	{
		GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING; //浮空输入
	}
	else
	{
		GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出
	}
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/**
 * @brief stm32向DHT11发送开始信号
 * @param 无
 * @retval 无
*/
void DHT11_Start(void)
{
	Charge_DHT11_DATA_MODE(1);//输出模式
	DHT11_DATA_OUT(1);//先拉高
	DHT11_Delay_us(30);
	DHT11_DATA_OUT(0);//拉低电平至少18ms,1ms=1000us
	DHT11_Delay_us(20*1000);
	DHT11_DATA_OUT(1);//拉高电平20~40us
	DHT11_Delay_us(30);
	Charge_DHT11_DATA_MODE(0);//输入模式
}

/*DHT11获取一个字节*/
char DHT11_ReciveByte(void)
{
	unsigned char i = 0;
	unsigned char data;
	for(i=0;i<8;i++) //1个数据就是1个字节byte,1个字节byte有8位bit
	{
		while( DHT11_DATA_IN() == 0); //从1bit开始,低电平变高电平,等待低电平结束
		DHT11_Delay_us(30); //延迟30us是为了区别数据0和数据1,0只有26~28us
		
		data <<= 1; //左移(左移最低位自动补0)
		
		if( DHT11_DATA_IN() == 1 ) //如果过了30us还是高电平的话就是数据1
		{
			data |= 1; //数据+1
		}
		
		while( DHT11_DATA_IN() == 1 ); //高电平变低电平,等待高电平结束
	}
	
	return data;
}
/**
 * @brief 驱动DHT11获取数据
 * @param 无
 * @retval 0/1
* @note 0:获取失败,1获取成功
*/
char DHT11_BeginWork(void)
{
	unsigned char RH,RL,TH,TL,CHECK;
	
	DHT11_Start(); //主机发送信号
	DHT11_DATA_OUT(1); //拉高电平
	
	if( DHT11_DATA_IN() == 0 ) //判断DHT11是否响应
	{
		while( DHT11_DATA_IN() == 0); //低电平变高电平,等待低电平结束
		while( DHT11_DATA_IN() == 1); //高电平变低电平,等待高电平结束
		/*接收5个数据*/
		RH = DHT11_ReciveByte();
		RL = DHT11_ReciveByte();
		TH = DHT11_ReciveByte();
		TL = DHT11_ReciveByte();
		CHECK = DHT11_ReciveByte(); 
		
		DHT11_DATA_OUT(0); //当最后一bit数据传送完毕后,DHT11拉低总线 50us
		DHT11_Delay_us(55); //这里延时55us
		DHT11_DATA_OUT(1); //随后总线由上拉电阻拉高进入空闲状态。
		
		if(RH + RL + TH + TL == CHECK) //和检验位对比,判断校验接收到的数据是否正确
		{
			/*更新数据寄存数组*/
			RECDATA[0] = RH;
			RECDATA[1] = RL;
			RECDATA[2] = TH;
			RECDATA[3] = TL;
			
			//成功返回1
			return 1;
		}
	}
	//失败返回0
	return 0;
}


/**
 * @brief 获取温度数据
 * @param 无
 * @retval Temperature
*/
float DHT11_GetTemperature(void)
{
	/*解析数据寄存数组的数据*/
	Temperature = (float)RECDATA[3]/10 + RECDATA[2];
    return Temperature;
}

/**
 * @brief 获取湿度数据
 * @param 无
 * @retval Humidity
*/
float DHT11_GetHumidity(void)
{
	/*解析数据寄存数组的数据*/
	Humidity = (float)RECDATA[1]/10 + RECDATA[0];
    return Humidity;
}

 改一下延时函数和端口就能用

需要在主循环中调用DHT11_BeginWork(),更新温湿度数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值