历史上的今天
返回首页

历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2021年09月10日 | stm32F4使用温湿度传感器模块-->DHT11

2021-09-10 来源:eefocus

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

太耽误开发周期了

在这里插入图片描述

我们用的模块是四线 转三线的(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;

}

}     

}

推荐阅读

史海拾趣

Holt Integrated Circuits公司的发展小趣事

在军事和商用航空领域,MIL-STD-1553标准是一项至关重要的通信协议。Holt的MIL-STD-1553解决方案以其小巧的体积和高性价比,在行业内脱颖而出。这些解决方案在单个芯片上集成了整个MIL-STD-1553接口,为用户提供了极大的便利。Holt的旗舰IC产品更是因其易用性和高性能而广受好评,成为业界内的标杆产品。

Dynastream公司的发展小趣事

成为Garmin全资子公司后,Dynastream并没有停止前进的步伐。相反,公司更加注重技术创新和产品研发。在保持传统优势产品的基础上,Dynastream不断推出新产品、新技术,以满足市场的不断变化和客户的多样化需求。同时,公司还积极拓展国际市场,将产品销往全球各地。

Applied Micro Circuits (MACOM)公司的发展小趣事

Applied Micro Circuits(MACOM)公司的历史可以追溯到其创立之初。MACOM最初名为Microwave Associates,成立于上世纪某个时期,以磁控管作为首创产品,主要应用于微波雷达领域。随着技术的不断进步,公司逐步扩展产品线,推出了包括真空管、高功率PIN二极管/晶体管和移相器等一系列产品。然而,上世纪九十年代,由于经营不善,MACOM被AMP公司收购,随后又经过多次转手,最终成为Tyco旗下的一部分。

BH Electronics公司的发展小趣事

近年来,随着环保意识的提高,BH Electronics积极响应国家绿色发展的号召,开始了绿色转型之路。公司加大了对环保技术的研发和应用力度,推出了一系列绿色环保产品。同时,BH Electronics还优化了生产流程,减少了能源消耗和废物排放。这些举措不仅提升了公司的环保形象,也为公司的可持续发展注入了新的动力。

这五个故事只是BH Electronics发展历程中的一部分,但它们却生动地展现了这家公司在电子行业中的崛起之路。从初创时期的筚路蓝缕,到技术创新的突破;从国际化战略的拓展,到品质管理的提升;再到绿色发展的转型,BH Electronics始终保持着敏锐的市场洞察力和不懈的创新精神。正是这些因素的共同作用,使得BH Electronics能够在激烈的市场竞争中脱颖而出,成为电子行业中的佼佼者。

台湾晶豪(ESMT)公司的发展小趣事

晶豪科技一直将研发作为公司的核心竞争力。公司成功建立了各种容量及接口规格的特定型DRAM产品线,包括SDRAM、DDR I/II/III及PSRAM、低耗电的Mobile DRAM等。这些产品广泛应用于各种电子设备和系统,赢得了市场的广泛认可。此外,公司还针对系统级封装(SiP)的需求,成功开发了所需的“良品晶粒”(Known-Good-Die, KGD)产品及多芯片模块封装(MCP)的解决方案,满足了客户的多样化需求。

晨晶电子(Chenjing Electronics)公司的发展小趣事

晨晶电子始终将品质放在首位,坚持以客户为中心的服务理念。公司建立了严格的质量管理体系,从原材料采购到生产过程控制,再到产品出厂检验,每一个环节都严格把关,确保产品的品质稳定可靠。正是凭借这种对品质的执着追求,晨晶电子赢得了客户的广泛认可和好评,也为企业赢得了良好的口碑。

问答坊 | AI 解惑

LCD的一点资料

本帖最后由 paulhyde 于 2014-9-15 08:54 编辑 大家好 这是我收集到的一些LCD的资料 希望对大家有用!  …

查看全部问答>

linux下i2c控制radio的问题

目前用ut6410想实现 radio的功能使用si47xx的模块 ut6410本身有提供i2c的接口和驱动 kernel linux2.6.24 硬件部份問題排除 有用示波器 sda sck脚位有讯号出来. 现在遇到的状况是想从user space透过i2c对si47xx丢cmd 但是write read回传都是-1 部 ...…

查看全部问答>

wince5.0 2440背光问题

背光代码 volatile S3C2440A_IOPORT_REG * v_pIOPregs= NULL; BOOL BacklightInitialize() {     BOOL    bRet = TRUE;     BL_PowerOn(TRUE);               & ...…

查看全部问答>

第三方控件如何部署到wince中,在运行时提示无法找到第三方控件的dll

第三方控件如何部署到wince中 在运行时提示无法找到第三方控件的dll…

查看全部问答>

晶振运行正常吗?

我用示波器测量了一下F149的PIN9,X1OUT波形,有一个在2V范围,幅度在0。2V左右的锯齿波,频率有26US左右。而在PIN52,X2OUT上没有波形。我LXT1上接得是32678HZ的晶振,X2上接得是8M晶振。 请问这样状态正常吗?…

查看全部问答>

【求助】msp430芯片RAM居然不能外扩??

msp430芯片RAM居然不能外扩??很郁闷,最近程序大了,需要大于2K的RAM了,可是msp430芯片RAM不能外扩,这个怎么办呢?课题做到一半,555555555555 谢谢各位,请出出主意!…

查看全部问答>

TinyOS在MSP430F2618+CC2520平台上移植交流

目前TinyOS还仅支持MSP430低端的MCU比如f1611,以及CC2420等射频芯片。针对MSP430高端系列单片机,以及TI推出的第二代射频芯片CC2520还未能支持 前段时间把TinyOS移植到了上述平台上,基本功能都已经实现,针对无线协议栈还需要进一步优化!希望有 ...…

查看全部问答>

关于CC2530串口中断接收的问题

CC2530串口中断接收的自定义缓存BUF最大可以定义多大? 我现在需要一个最少160字节的BUF存接收到的数据进行解析;但是定义buf[160]后用IAR编译总是提示IDATA空间不够;后来通过调节IAR-option -stack/heap 中的设置;但是最大也是只能设置到buf[135 ...…

查看全部问答>

用七段数码管显示26个字母的方案

一般来说,七段数码管(也有称日字管)只能显示10个阿拉伯数字和部分英文字母,但是,按排列组合来算,七段数码管可以有128个组合,因此,就七段数码管可包含的信息量来说,显示26个字母加10个数字共36个字符是没问题的,只是人们没有建立一套显示 ...…

查看全部问答>

CC2500发射很正常,但是接收的数据异常

做了块CC2500模块,模块发射数据很正常,但是接收的数据全部异常,找了两天了还没找到原因,程序问题已经排除(用别人的模块发射和接受都正常),请懂的人帮下小弟,小弟搞开始搞RF…

查看全部问答>