DHT11编程

发布时间:2023年12月25日

实验:用数码管显示温湿度

dht11.h

#ifndef _DHT11_H
#define _DHT11_H
#include "stm32f10x_conf.h"

extern void dht11_init(void);
extern void Get_Dht_Value(char *buf);
#endif

dht11.c

#include"dht11.h"
#include"bitband.h"
#include"delay.h"

void set_dht_out(void)
{
	GPIO_InitTypeDef Gpio_Value;//初始化
	Gpio_Value.GPIO_Mode=GPIO_Mode_Out_PP;//指定模式-推免输出
	Gpio_Value.GPIO_Pin=GPIO_Pin_10;//10号引脚
	Gpio_Value.GPIO_Speed=GPIO_Speed_50MHz;//设置接口速度
	GPIO_Init(GPIOC	,&Gpio_Value);	
}

void set_dht_in(void)
{
	GPIO_InitTypeDef Gpio_Value;//初始化
	Gpio_Value.GPIO_Mode=GPIO_Mode_IPU;//上拉输入模式
	Gpio_Value.GPIO_Pin=GPIO_Pin_10;//10号引脚
	GPIO_Init(GPIOC,&Gpio_Value);	
}

void dht_out_status(int n)
{
	set_dht_out();
	if(n==1)
		PCOut (10)=1;
	else
		PCOut (10)=0;
}

int dht_in_status(void)
{
	set_dht_in();
	return PCIn(10);
}


void dht11_init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
}


void Get_Dht_Value(char *buf)
{
	int ret=0,i=0;
	int times=0;
	u8 data=0;
	dht_out_status(1);//拉高数据线
	dht_out_status(0);//拉低数据线
	delay_ms(20);//至少拉低18ms
	dht_out_status(1);//拉高数据线
	do{    //第一次等用超时处理
		ret=dht_in_status();
		times++;
		delay_us(2);//延时2微秒
	}while(ret==1&&times<=20);//最高延时40us
	if(times>20)
		return  ;
	while(!dht_in_status());//死等拉高
	for(i=0;i<40;i++)
	{
		while(dht_in_status());//死等拉低
	  while(!dht_in_status());//死等拉高
		delay_us(40);
		data<<=1;
		if(dht_in_status()==1)//判断获得的是高电平哥还是低点平	
		{
			data|=1;
		}
	 if((i+1)%8==0)//连续转存
	 {
		 buf[i/8]=data;
		 data=0;
	 }
	}
	dht_out_status(1);//拉高数据线
}

main.c

#include"iwdg.h"
#include"led.h"
#include"fmq.h"
#include"key.h"
#include"delay.h"
#include"inte.h"
#include"hc138.h"
#include"dht11.h"
void h0(void)
{
	Led_On(0);
	Led_On(1);
	Led_On(2);
	
}
void h1(void)
{
	Fmq_On();
}
void h2(void)
{
	Led_Off(0);
	Fmq_Off();
	
}

int main(void)
{
	char buff[5]={0};
	int dht_data=0;
	int i=0,j=0;
	inte_init();
	Led_Init();	
	Key_Init();
	Fmq_Init();
	delay_init();
	iwdg_init(5);
	hc138_init();
	dht11_init();
	
	set_inte_handler(h0,h1,h2);
	while(1)
	{
		Get_Dht_Value(buff);
		dht_data=buff[0]*100+buff[2];
		show_digital_Out(dht_data);
		
	}
	return 0;
}

运行截图

前两位为湿度,后两位为温度

文章来源:https://blog.csdn.net/qq_63507404/article/details/135198706
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。