历史上的今天
返回首页

历史上的今天

今天是:2025年02月25日(星期二)

正在发生

2020年02月25日 | msp430和stm32 dht11驱动程序

2020-02-25 来源:eefocus

最近使用msp430f5529读取dht11的温度和湿度数据,记录下驱动程序,需要可移植。

dht11模块是一块温湿度传感器模块,可以采集温度和湿度信息转化为数据发送出来,模块介绍如下:


概述:DHT11 是广州奥松有限公司生产的一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,5V 电源电压下,工作平均最大电流 0.5mA。


性能参数

工作电压范围:3.5V-5.5V

工作电流 :平均 0.5mA

湿度测量范围:20-90%RH

温度测量范围:0-50℃

湿度分辨率 :1%RH 8 位

温度分辨率 :1℃ 8 位

采样周期 :1S

单总线结构

与 TTL 兼容(5V)


典型应用电路

在这里插入图片描述

串行接口

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:

一次完整的数据传输为40bit,高位先出。


数据格式 : 8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和

数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。


用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集, 用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集, 如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。

通讯过程:

在这里插入图片描述

总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必

须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后, 等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束

后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换

到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。

在这里插入图片描述

总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉

高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定

了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有

响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线

50us,随后总线由上拉电阻拉高进入空闲状态。

在这里插入图片描述

信号表示方法:

在这里插入图片描述

驱动程序:

头文件:


/*

 * dht11.h

 *

 *  Created on: 2019年7月10日

 *      Author: 23605

 */


#ifndef DHT11_H_

#define DHT11_H_


#define     DHT_Direction_IN      {P3DIR &= ~BIT3;P3REN |= BIT3;P3OUT |= BIT3;}

#define     DHT_Direction_OUT     P3DIR |=  BIT3;


#define     O_DHT_DAT_H       P3OUT |=  BIT3

#define     O_DHT_DAT_L       P3OUT &= ~BIT3


#define     I_DHT_DAT         (P3IN & BIT3)



void delay_ms(uint16_t ms);

void delay_us(uint32_t us);

void DHT11_Reset(void);

uint8_t DHT11_IsOnline(void);

uint8_t DHT11_ReadBit(void);

uint8_t DHT11_ReadByte(void);

uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *temps,uint8_t *humi);

void DHT11_INIT(void);


#endif /* DHT11_H_ */


源文件:


/*

 * dht11.c

 *

 *  Created on: 2019年7月10日

 *      Author: 23605

 */


#include

#include "LCD.h"

#include "hal_ucs.h"

#include "hal_pmm.h"

#include "ff.h"

#include "SHT20.h"

#include "IIC.h"

#include "dht11.h"

#include


#define SYSCLK  25000000/1000   //_delay_cycles(SYSCLK) [系统时钟/1000] 1ms'Ticks

#define SYSCLK2    25


void delay_ms(uint16_t ms)

{

    uint16_t k;

    for(k=0;k    _delay_cycles(SYSCLK);                  // 25000即当前时钟设在25MHz

}


void delay_us(uint32_t us)

{

    uint32_t k;

    for(k=0;k    _delay_cycles(SYSCLK2);                  // 25即当前时钟设在25MHz

}


//复位DHT11

void DHT11_Reset(void)

{

    DHT_Direction_OUT;

    O_DHT_DAT_L;

    delay_ms(20);

    O_DHT_DAT_H;

    delay_us(30);

}


//等待DHT11的回应

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

//返回0:存在

uint8_t DHT11_IsOnline(void)

{

    uint8_t retry = 0;

    DHT_Direction_IN;


    while (I_DHT_DAT && retry < 100)//DHT11会拉低40~80us

    {

        retry ++;

        delay_us(1);

    }


    if(retry >= 100)

    {

        return 1;

    }

    else

    {

        retry = 0;

    }


    while (!I_DHT_DAT && retry < 100)//DHT11拉低后会再次拉高40~80us

    {

        retry ++;

        delay_us(1);

    }


    if(retry >= 100)

    {

        return 1;

    }

    return 0;

}


uint8_t DHT11_ReadBit(void)

{

    uint8_t retry = 0;

    while(I_DHT_DAT && retry < 100)

    {

        retry ++;

        delay_us(1);

    }

    retry = 0;

    while(!I_DHT_DAT && retry < 100)

    {

        retry ++;

        delay_us(1);

    }


    delay_us(40);//等待40us


    if(I_DHT_DAT)

    {

        return 1;

    }

    else

    {

        return 0;

    }

}


uint8_t DHT11_ReadByte(void)

{

    uint8_t i,dat;

    dat = 0;

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

    {

        dat <<= 1;

        dat |= DHT11_ReadBit();

    }

    return dat;

}


//从DHT11读取一次数据

//temp:温度值(范围:0~50°)

//humi:湿度值(范围:20%~90%)

//返回值:0,正常;1,读取失败

uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *temps,uint8_t *humi)

{

    uint8_t buf[5];

    uint8_t i;


    DHT11_Reset();


    if(DHT11_IsOnline() == 0)

    {

        for(i = 0; i < 5; i ++)//读取40位数据

        {

            buf[i] = DHT11_ReadByte();

        }

        if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])

        {

            *humi  = buf[0]-2;

            *temp  = buf[2]-3;

            *temps = buf[3];

        }

    }

    else

    {

        return 1;

    }


    return 0;

}


void DHT11_INIT(void)

{

    P3DIR |= BIT3;

    P3OUT |= BIT3;


    DHT11_Reset();


}

推荐阅读

史海拾趣

Edcon Components Netherlands Cv公司的发展小趣事

为了进一步扩大市场份额,Edcon Components Netherlands Cv开始积极拓展国际市场。公司通过对不同国家和地区的市场进行深入分析,制定了精准的市场拓展策略。通过与当地经销商建立合作关系,Edcon的产品逐渐进入国际市场,并在多个国家和地区取得了成功。国际市场的拓展不仅为公司带来了更多的商机,也提升了公司的品牌影响力。

Densitron公司的发展小趣事

在电子行业的激烈竞争中,Densitron公司始终坚持技术创新作为发展的核心动力。早期,公司投入大量研发资源,成功开发出一种新型的铟锡氧化物(ITO)材料,这种材料在触摸屏领域具有出色的性能,使得公司的产品在市场上脱颖而出。随着技术的不断升级,Densitron公司又相继推出了一系列创新产品,不仅满足了客户日益增长的需求,也推动了整个行业的进步。

CLAIREX公司的发展小趣事

Clairex Technologies成立于1993年,当时的市场上,航空电子部件的供应存在着严重的质量问题。老David Catter和一位商业伙伴发现了这一商机,他们提议改进并供应财富500强公司通用航空航空电子部门所需的零件。然而,创业的道路并非一帆风顺。他们面临着资金短缺、技术难题以及市场竞争激烈等多重挑战。但凭借对技术的深入理解和不懈的努力,Clairex团队成功设计出了一款性能卓越的光电导体,并在得克萨斯州普莱诺开始了生产。这一创新产品很快便赢得了市场的认可,为Clairex的发展奠定了坚实的基础。

Cornerstone Sensors公司的发展小趣事

品质是Cornerstone Sensors的生命线。公司建立了严格的质量管理体系,从原材料采购、生产制造到产品测试等各个环节都进行严格把控。同时,公司还注重品牌建设,通过参加行业活动、发布技术文章、提供专业培训等方式提升品牌影响力。Cornerstone Sensors的产品逐渐成为行业内公认的高品质代表,赢得了广泛的口碑和市场份额。

AAC [American Accurate Components]公司的发展小趣事

AAC公司的创立可以追溯到上世纪90年代初,当时电子音响器件市场正迎来快速发展的机遇。AAC公司敏锐地捕捉到了这一市场趋势,迅速行动,与德国投资者共同成立了中德合资常州威利来电子音响器件有限公司。这一合资举措为AAC带来了先进的生产技术和管理经验,使其生产的讯响器和微型扬声器迅速打开了德国市场的大门。这一成功的合资经验为AAC后续的发展奠定了坚实的基础。

EAO公司的发展小趣事

在电子制造行业日益重视环保和可持续发展的背景下,EAO公司积极响应号召,致力于研发和生产环保型电子产品。公司投入大量资源研发新型环保材料,优化生产工艺,减少生产过程中的废弃物排放。同时,EAO公司还建立了完善的电子垃圾回收体系,对废弃电子产品进行专业处理,确保资源得到合理利用,减少对环境的负面影响。

问答坊 | AI 解惑

“大学生电子设计竞赛”版块试行版规

本帖最后由 paulhyde 于 2014-9-15 09:17 编辑 Dear all: 欢迎大家来到我们电子工程世界“大学生电子设计竞赛”版块,我有幸成为了“大学生电子设计竞赛”版块的版主,希望大家今后多多配合我的工作。 在本论坛讨论毕业设计问题时,请说明设计的内 ...…

查看全部问答>

proteus仿真中有湿度传感器吗?

大家有没有用过啊,可不可以把源程序让我参考一下?对单片机对外部计数不是太懂,是不是要查询TF1(或TF0)为1啊,那么不同频率,如何计数呢?…

查看全部问答>

询问关于AD9430的问题

哪位高手用过AD9430?希望您能指点迷津。 我用两片AD9430采样数据,单片时钟150M, 用的是COMS并行方式(数据率75M), 四路数据拼成一路数据(300M), 可是总是好像拼不到一起去,有时对,有时错位, 怎么也调整不过来。如何调整啊?…

查看全部问答>

台湾新茂(SyncMOS)与爱特梅尔(ATMEL) 8051内核单片机替换

台湾新茂(SyncMOS)与爱特梅尔(ATMEL)8051内核单片机替换表SM8952AC40PP/JP/QP=AT89S52-24PU/JP/AUSM8958AC40PP/JP=AT89C55WD-24PU/JPSM894051C25PP/SP=AT89C2051-24PU/SUSM894051C25PP/SP=AT89C4051-24PU/SU深圳市鼎尚电子有限公司,新茂大陆代理商 ...…

查看全部问答>

如何截获系统拨打电话的按键消息?

如题,我的目的是在我自己的程序界面里面截获系统拨打电话的按键消息,自己处理直接拨打指定电话,而不调用系统自己默认的电话程序,希望知道的大虾多多帮忙,谢谢!…

查看全部问答>

如何让我的设备驱动程序不能被卸载?

如何让文件过滤驱动程序(WDM)安装后不能被Windows卸载,只能被我提供的程序卸载,请高手多指教!!!…

查看全部问答>

STM32F103C8T6的芯片ID有没有可能被擦掉?

vu8 data[64] = {0};int main(void){  //RCC_Config();  for(u32 i=0;i<12;i++){    data = ((vu8*)0x1FFFF7E8);  }}把上面这段代码通过J-Link下载 ...…

查看全部问答>

STM32的VDD和VSS脚短路的问题(不是焊接造成的)急

我一共焊了12块STM32F103C8T6的板子,其中有11块,不能用,经过割线和测试空板子和用放大镜看,我发现不是板子和焊接的问题,而是STM32芯片的VDD和VSS脚短   路。   板子上公有4对VDD和VSS,其中的VDDA(9脚)和VSSA(8 ...…

查看全部问答>

针对DDR2-800和DDR3的PCB信号完整性设计

针对DDR2-800和DDR3的PCB信号完整性设计…

查看全部问答>

为什么函数不能递归调用

以前有一篇帖子提到函数不能递归调用, 想请教一下各位,为什么不能递归调用, 是绝对不行还是可以有条件的使用?…

查看全部问答>