STM32F103C8T6--DHT11温湿度传感器

 DHT11模块

上电后等待1s稳定状态,输入接上拉输入

发送数据格式如图

起始信号

 

发'0'时间间隔

 代码如下

//DHT11.c


#include "DHT11.h"

void DHT11_Config(u8 Mode)
{
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	 GPIO_InitTypeDef GPIO_InitStruct = {0};
	 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
	 if(Mode == 1)
	 {
	 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
		 
	 DHT11_High();
	 }
	 else if(Mode == 0)
	 {
		 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
		 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	 }
	 GPIO_Init(GPIOA,&GPIO_InitStruct);
}

u8 DHT11_Read(u8* H, u8* T)
{
	u8 DATA[5] ={0};
	u8 i,j;
	
 DHT11_Config(DHT11_OUT_mode); 
 delay_ms(1000);                  //初始化高点平输出,等待1s稳定
	DHT11_low();                    //发送起始信号
 delay_ms(20);                 
 DHT11_High();                    //拉高,设置输入等待回应
	
 DHT11_Config(DHT11_Din_Mode);
	
  while(DHT11_Pin() == 1);  // 等待 DHT11 响应信号 -- 默认上拉输入为高电平
	while(DHT11_Pin() == 0);  // 等待 响应  信号结束
	for( i=0; i<5; i++)
	{
		for(j=0; j<8; j++)
		 {
			 while(DHT11_Pin() == 1);  //等待 DHT拉高结束
			 while(DHT11_Pin() == 0);  //开始等待高电平,判断1--0
			 delay_us(30);             // '0'时间为 26-28us '1'为 70us
			 DATA[i]<<=1;              //初始为0左移不变
			 if(DHT11_Pin()== 1)           
				 DATA[i]++;              //若为1,加一,下次开始左移一位
		 }
	}
	if(DATA[4] == DATA[3]+DATA[2]+DATA[1]+DATA[0])
	{
		*H = DATA[0];
		*T = DATA[2];
		return 0;
	}
 return 1;
}
//DHT11.h
//sys.h 只需包含 单片机头文件和延时头文件即可

#ifndef _DHT11_H_
#define _DHT11_H_
#include "sys.h"
#define DHT11_High()  GPIO_SetBits(GPIOA,GPIO_Pin_12)
#define DHT11_low()   GPIO_ResetBits(GPIOA,GPIO_Pin_12)

#define DHT11_Pin()   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)

#define DHT11_OUT_mode     1
#define DHT11_Din_Mode     0
void DHT11_Config(u8 Mode);
u8 DHT11_Read(u8* H, u8* T);
#endif
//main.c

#include "sys.h"
#include "DHT11.h"
int main()
{ 
  DHT11_Config(DHT11_OUT_mode); 
  uart_init(115200);
	u8 H,T;
	printf("串口初始化成功\r\n");
while(1)
{
    DHT11_Read(&H,&T);
	printf("%d,%d\r\n",H,T);
	delay_ms(200);
	//MODBUS_ReceiveDeal();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值