stm32F4使用温湿度传感器模块-->DHT11

发布者:知者如渊最新更新时间:2021-10-14 来源: eefocus关键字:stm32F4  温湿度传感器模块  DHT11 手机看文章 扫描二维码
随时随地手机看文章

就是 雁凌家的模块,测好了,弄了很久吧发现是他们家的杜邦线不行,以后买模块要看杜邦线质量,还是买点好的

太耽误开发周期了

在这里插入图片描述

我们用的模块是四线 转三线的(dht11从四线的引脚变成三线的输出)


线路连接

dht11 有三根线连出来,vcc,gnd,还有一个负责输入和输出

所以最后一根线可以连接到没有被占用的gpio口就能获得数据

连接到板子的 pb2上面

在这里插入图片描述

程序编写

唤醒dht11 ->检测dht11是否存在 -> 读取数据


唤醒dht11

输出低电平 20ms 再输出 高电平 30us


//复位DHT11

void DHT11_Rst(void)    

{                 

DHT11_IO_OUT(); //设置为输出

DHT11_DQ_OUT=0; //拉低DQ

delay_ms(20);    //拉低至少18ms

DHT11_DQ_OUT=1; //DQ=1 

delay_us(30);      //主机拉高20~40us

}


检测dht11

唤醒后dht11 会拉低电频40,80us 拉低后会再次拉高40~80us


读取数据

读取一位数据

dht11 会拉低电频 拉低后会再次拉高,此时就是当时数据位的值,我们进行检测


u8 DHT11_Read_Byte(void)    

{        

u8 i,dat;

dat=0;

for (i=0;i<8;i++) 

{

    dat<<=1; 

    dat|=DHT11_Read_Bit();

    }     

    return dat;

}


读取一个byte数据

就是循环读取八个位


u8 DHT11_Read_Data(u8 *temp,u8 *humi)    

{        

  u8 buf[5];

u8 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];

*temp=buf[2];

}

}else return 1;

return 0;     

}


对所有数据进行拼装,得到温度值

从总共的40byte里拿出我们的数据,小数部分就不要了,好像是不支持


u8 DHT11_Read_Data(u8 *temp,u8 *humi)    

{        

  u8 buf[5];

u8 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];

*temp=buf[2];

}

}else return 1;

return 0;     

}


所有代码

dht11.c


#include "dht11.h"

#include "delay.h"

//  

//本程序只供学习使用,未经作者许可,不得用于其它任何用途

//ALIENTEK STM32F429开发板

//DHT11驱动代码    

//正点原子@ALIENTEK

//技术论坛:www.openedv.com

//创建日期:2016/1/16

//版本:V1.0

//版权所有,盗版必究。

//Copyright(C) 广州市星翼电子科技有限公司 2014-2024

//All rights reserved   

//


//复位DHT11

void DHT11_Rst(void)    

{                 

DHT11_IO_OUT(); //设置为输出

DHT11_DQ_OUT=0; //拉低DQ

delay_ms(20);    //拉低至少18ms

DHT11_DQ_OUT=1; //DQ=1 

delay_us(30);      //主机拉高20~40us

}


//等待DHT11的回应

//返回1:未检测到DHT11的存在

//返回0:存在

u8 DHT11_Check(void)    

{   

u8 retry=0;

DHT11_IO_IN();      //设置为输入  

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

u8 DHT11_Read_Bit(void)  

{

  u8 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读取一个字节

//返回值:读到的数据

u8 DHT11_Read_Byte(void)    

{        

u8 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,读取失败

u8 DHT11_Read_Data(u8 *temp,u8 *humi)    

{        

  u8 buf[5];

u8 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];

*temp=buf[2];

}

}else return 1;

return 0;     

}


//初始化DHT11的IO口 DQ 同时检测DHT11的存在

//返回1:不存在

//返回0:存在       

u8 DHT11_Init(void)

{

    GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟

    GPIO_Initure.Pin=GPIO_PIN_2;           //PB12

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出

    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉

    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速

    HAL_GPIO_Init(GPIOB,&GPIO_Initure);     //初始化

 

    DHT11_Rst();

return DHT11_Check();

}


dht11.h


#ifndef __DS18B20_H

#define __DS18B20_H

#include "sys.h"


//IO方向设置

#define DHT11_IO_IN()  {GPIOB->MODER&=~(3<<(2*2));GPIOB->MODER|=0<<(2*2);} //PB12输入模式

#define DHT11_IO_OUT() {GPIOB->MODER&=~(3<<(2*2));GPIOB->MODER|=1<<(2*2);} //PB12输出模式

 

IO操作函数    

#define DHT11_DQ_OUT    PBout(2)//数据端口 PB12

#define DHT11_DQ_IN     PBin(2) //数据端口 PB12 

   

u8 DHT11_Init(void);//初始化DHT11

u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度

u8 DHT11_Read_Byte(void);//读出一个字节

u8 DHT11_Read_Bit(void);//读出一个位

u8 DHT11_Check(void);//检测是否存在DHT11

void DHT11_Rst(void);//复位DHT11  

#endif


main.c


#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "led.h"

#include "key.h"

#include "lcd.h"

#include "sdram.h"

#include "dht11.h"

#include "pcf8574.h"



int main(void)

{

u8 t=0;      

u8 temperature;      

u8 humidity;    

    HAL_Init();                     //初始化HAL库   

    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz

    delay_init(180);                //初始化延时函数

    uart_init(115200);              //初始化USART

    LED_Init();                     //初始化LED 

    KEY_Init();                     //初始化按键

    SDRAM_Init();                   //初始化SDRAM

    LCD_Init();                     //初始化LCD

    PCF8574_Init();                 //初始化PCF8574

    POINT_COLOR=RED;

LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7"); 

LCD_ShowString(30,70,200,16,16,"DHT11 TEST");

LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");

LCD_ShowString(30,110,200,16,16,"2016/1/16");

    PCF8574_ReadBit(BEEP_IO);       //由于DHT11和PCF8574的中断引脚共用一个IO,

                                    //所以在初始化DHT11之前要先读取一次PCF8574的任意一个IO,

                                    //使其释放掉中断引脚所占用的IO(PB12引脚),否则初始化DS18B20会出问题    

  while(DHT11_Init()) //DHT11初始化

{

LCD_ShowString(30,130,200,16,16,"DHT11 Error");

delay_ms(200);

LCD_Fill(30,130,239,130+16,WHITE);

  delay_ms(200);

}    

LCD_ShowString(30,130,200,16,16,"DHT11 OK");

POINT_COLOR=BLUE;//设置字体为蓝色 

  LCD_ShowString(30,150,200,16,16,"Temp:  C");  

  LCD_ShowString(30,170,200,16,16,"Humi:  %");

while(1)

{         

  if(t%10==0)//每100ms读取一次

{

            PCF8574_ReadBit(BEEP_IO);   //读取一次PCF8574的任意一个IO,使其释放掉PB12引脚,

                                        //否则读取DHT11可能会出问题            

DHT11_Read_Data(&temperature,&humidity); //读取温湿度值     

LCD_ShowNum(30+40,150,temperature,2,16); //显示温度        

LCD_ShowNum(30+40,170,humidity,2,16); //显示湿度    

}    

delay_ms(10);

t++;

if(t==20)

{

t=0;

LED0=!LED0;

}

}     

}

关键字:stm32F4  温湿度传感器模块  DHT11 引用地址:stm32F4使用温湿度传感器模块-->DHT11

上一篇:STM32F103C8T6+温湿度传感器DHT11实现温湿度采集
下一篇:STM32驱动dht11温湿度传感器

推荐阅读最新更新时间:2024-11-11 11:22

在Keil V5下新建STM32F407工程
1、 建立工程目录 新建一个工程目录,用来存放工程文件,源文件,头文件等,例如在桌面上新建一个名称为My_Project的目录。 2、 建立工程子目录 在步骤1建立的工程文件夹中建立子目录,用来存储工程中用到的不同文件。建立CMSIS、Library、Listing、Output、Project、User六个子目录,如下图所示。 下面来讲一下这六个子目录的作用。 CMSIS目录:用来存放和内核相关的文件 Library目录:用来存放STM32F4 标准外设固件库源码文件和对应的头文件。 Listing目录:用来存放列表文件。 Output目录:用来存放编译过程中产生的中间文件。 Projec
[单片机]
在Keil V5下新建<font color='red'>STM32F4</font>07工程
stm32f407(cortex-M4)USART串口调试程序
上文通过调试TIM1遇到了一些问题,深入了解了stm32F407的复用功能。网上流传的很多资料都是cortex-M3的,现在都M4了,观念自然得跟上,一味照搬没有自己的思考是不行的。记得我最早的调试的程序就是串口USART,刚入手嘛,就网上找了个例程,例程对IO复用是这么写的: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE); //打开复用时钟 GPIO_StructInit(&GPIO_InitStructure); GPIO_Init
[单片机]
51单片机基础之DHT11温湿度传感器
接线: 代码: main.c文件 /* 使用DHT11模块,检测温湿度,在lcd1602上面显示,因为1602显示不是每次都能出来,所以加了串口打印,会更加直观。 */ #include reg51.h #include lcd.h #include intrins.h #include stdio.h sbit Temp_data=P3^6; //信号引脚 unsigned int rec_dat ; unsigned char rec_dat_lcd0 ; unsigned char rec_dat_lcd1 ; unsigned char rec_dat_lcd2 ; unsigned ch
[单片机]
51单片机基础之<font color='red'>DHT11</font><font color='red'>温湿度</font><font color='red'>传感器</font>
STM32F4三路ADC同时采集
注意三路ADC配置为DMA传输的时候,需要修改ADC1-ADC3的地址: #define ADC1_DR_Addr ((uint32_t)0x4001204C) #define ADC2_DR_Addr ((uint32_t)0x4001214C) #define ADC3_DR_Addr ((uint32_t)0x4001224C) 必须按照以上的地址定义,否则独处的数据全部为0。
[单片机]
利用STM32F4和Android控制六足机器人演示介绍
利用和控制六足机器人 六足机器人又叫蜘蛛机器人,是多足机器人的一种。仿生式六足机器人,顾名思义,六足机器人在我们理想架构中,我们借鉴了自然界。
[机器人]
STM32F4 开发笔记4: UART的使用方法
STM32F4内嵌4个通用异步/同步收发器(USART1、USART2、USART3、USART6)和两个通用异步收发器(UART4和UART5)。本文讲解此6个串行口,在异步模式下的使用方法,如不加说明,以USART1为例。 可以按照下述步骤,对通用异步串行口进行设置。 1、打开config.h文件,对如下图所示的宏进行设置,0x0c表示将当前串行口UART1的波特率设为115200bps,无效验。 2、打开main.c文件,可以在其中断服务函数中,完成接收逻辑的代码编写,如下图所示。此代码表明,当串行口收到1个字节的数据后,将触发串行口中断,在中断服务程序中,将接收到的1字节数据取出,送u8_UartDat
[单片机]
<font color='red'>STM32F4</font> 开发笔记4: UART的使用方法
STM32F407中断学习笔记
中断与事件的区别 相同点:中断和事件都是触发的一种,都是可以设置触发的; 异同点: 中断触发后必须有中断处理子程序IRQ handle,例如比如按键中断触发,实现一个LED的闪烁,可以在按键按下后,在中断处理程序中实现某个LED的电平反转 但在事件中,事件是没有中断处理子程序的,事件发生后,会直接发出一个脉冲信号给与之联动的操作,也可以同样实现LED电平的反转,只要有事件发生,就会有一个脉冲信号,这样的好处是,不需要CPU干预了,可以节省CPU的处理资源,相比中断处理,速度还更快,因为硬件的速度总是比软件处理快。 EXTI 功能框图 EXTI 可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所
[单片机]
<font color='red'>STM32F4</font>07中断学习笔记
STM32F4读写内部FLASH【使用库函数】
STM32F4Discovery开发帮使用的STM32F407VGT6芯片,内部FLASH有1M之多。平时写的代码,烧写完之后还有大量的剩余。有效利用这剩余的FLASH能存储不少数据。因此研究了一下STM32F4读写内部FLASH的一些操作。 【STM32F4 内部Flash的一些信息】 STM32F407VG的内部FLASH的地址是:0x08000000,大小是0x00100000。 写FLASH的时候,如果发现写入地址的FLASH没有被擦出,数据将不会写入。FLASH的擦除操作,只能按Sector进行。不能单独擦除一个地址上的数据。因此在写数据之前需要将地址所在Sector的所有数据擦除。 在STM32F4的编程手册上可找到F
[单片机]
<font color='red'>STM32F4</font>读写内部FLASH【使用库函数】

推荐帖子

请教:load program时出错 显示data verification failed at address 0x3fffc0
请教:loadprogram时出错显示dataverificationfailedataddress0x3fffc0,应该怎么解决?说明:我的是2812的板子,仿真器是XDS510PLUS(连接没问题),正在做一个正弦波来着,库文件用的是rts2800_ml.lib。下面是我的CMD文件内容:MEMORY{PAGE0:PROG(R):origin=0x3E8000,length=0x10000PAGE0:BOOT(R)
heyunqingfeng DSP 与 ARM 处理器
求用dds9851设计正弦信号发生器的电路图和代码
本帖最后由paulhyde于2014-9-1509:35编辑小弟是初学者近来要做个正弦信号发生器但是苦于知识还不够时间也紧希望大家能给点帮助求用dds9851设计正弦信号发生器的电路图和代码
lanchanghua 电子竞赛
关于OP放大器详细介绍与应用的书
关于OP放大器详细介绍与应用的书关于OP放大器详细介绍与应用的书谢谢楼主分享。。。顶顶顶顶顶好东西,thanks!!!貌似不错!!!看看谢谢哦!这么好的帖子一定要顶起来只有6个钱,花了4个来买了,好书!谢谢把这么好的资料分享给大家想下载看看~~~没币了呀~~~额这个有点贵了,呜呜不过应该是好东西哎,哥早卖了这书!谢谢楼主分享!芯币不多了。。。谢谢~支持好东西太感谢了谢谢楼主谢谢楼主~希望物有所值好贵的书啊。。可以看下可以看下好东西
jiangbihao 模拟电子
如何读懂电路图精品资源推荐十三、读手机电路图的一些基本方法
如何读懂电路图精品资源推荐十三、读手机电路图的一些基本方法一张电路图通常有几十乃至几百个元器件,它们的连线纵横交叉,形式变化多端,初学者往往不知道该从什么地方开始,怎样才能读懂它。其实电子电路本身有很强的规律性,不管多复杂的电路,经过分析可以发现,它是由少数几个单元电路组成的。好象孩子们玩的积木,虽然只有十来种或二三十种块块,可是在孩子们手中却可以搭成几十乃至几百种平面图形或立体模型。同样道理,再复杂的电路,经过分析就可发现,它也是由少数几个单元电路组成的。因此初学者只
tiankai001 下载中心专版
C6XX优化经验总结
1、原程序:for(i=LO_CHAN;i=HI_CHAN;i++){norm_shift=norm_l(st-ch_noise);Ltmp=L_shl(st-ch_noise,norm_shift);norm_shift1=norm_l(st-ch_enrg);Ltmp3=L_shl1(st-ch_enrg,norm_shift1-1);Ltmp2=L_divide(Ltmp3,Ltmp);
fish001 DSP 与 ARM 处理器
摩托罗拉推出新款T305蓝牙Car Kit
本帖最后由jameswangsynnex于2015-3-319:59编辑  正在新加坡举行的2006亚洲电信展上来自美国的摩托罗拉公司正式对外推出了该公司最新的手持式蓝牙车载免提系统(CarKit)MotorolaT305。从相关的资料中我们可以得知摩托罗拉此次推出的这款CarKit产品能够够支持噪音抵制以及回声效果此外该款产品扬声器的功率为1W,因此将可以为用户带来非常清晰的通话效果。  在功能方面,MotorolaT305除了可以通过内置的Bluetooth2.0
mdreamj 移动便携
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved