一.硬件介绍

RH是相对湿度,是用零点温度来定义的,一般,RH在45%~65%之间最为合适。

注:NTC为热敏电阻,输出为:单总线数字信号,单线双向串行通讯。

注:上拉电阻情况下,配置为开漏输出,可以增加驱动能力,减小CPU功耗。

二.程序关键点:1)引脚输入与输出的准确切换,2)输出电平的准确延迟,3)输入电平的等待与延迟读取以及等待的时间限制。

1.MCU如何设置开始信号?

/*
由MCU向DHT11发送一次开始信号,总线空闲状态为高电平,MCU把总线拉低至少18ms,
保证DHT11能检测到开始信号,主机发送开始信号后,可以切换到输入模式,或者切换到
高电平均可,切换到高电平时间通常为20~40us,然后开始读取响应信号.
*/
void DHT11_Rst(void)   
{                 
DHT11_IO_OUT(); 
//配置引脚为通用推挽输出模式
DAOBB = 0;  //拉低DQ
    SysTickDelay(20000);//至少18ms
DAOBB = 1; 
SysTickDelay(30);//主机拉高20~40us
}

2.MCU如何接受响应信号?

/*
等待DHT11的回应
返回1:未检测到DHT11的存在
返回0:存在DHT11接受到主机的开始信号后,等待主机的开始信号结束,
然后发送80us的低电平响应信号,发送响应信号后,在把总线拉高80us,准备发送数据*/
u8 DHT11_Check(void)   
{   
u8 retry=0;
DHT11_IO_IN();//将A11口设为输入
  /*&&与<的优先级是<高于&&*/
    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
{
retry++;
SysTickDelay(1);//这里系统滴答函数要配置为1US的中断

if(retry>=100)return 1;
else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
{
retry++;
SysTickDelay(1);
}
if(retry>=100)return 1;   
return 0;
}

3.如何读取一个位的高低电平?前提是已经有响应信号,这样去读取数据才有意思。
一个位的高低电平是根据总线上的高电平的时间长度来判断的,说白了,就是低电平一旦结束,再过28us,总线上的电平为高,这个位的电平就是高电平,总线上的电平为低,这个位的电平就是低电平。所以我们只要等待总线上的低电平结束,过了28us以后再70us之前去读总线上的电平,就能知道具体的一位的电平是多少了。但我们不能无限制的等待低电平结束,假如器件故障或其他原因,总线上始终低电平,这样程序就会在等待中死去,所以我们必须加一个等待时间的限制,超过等待时间,我们就放弃这次等待。为了使读取后总线上的高低电平不影响下一次的读取数据,我们还加了一个高电平的限时等待。

/*从DHT11读取一个位,返回值:1/0。
每一bit数据都以50us的低电平时序开始,高电平的宽度决定了bit数据位的0或1,
高电平状态在26~28us时,表示数据位为0,高电平状态在70us时,表示数据位为1.
DHT11_DQ_IN是读取对应端口引脚的输入电平,在读之前,该引脚要配置为上拉下拉输入模式
*/
u8 DHT11_Read_Bit(void)  
{
  u8 retry=0;
while(DHT11_DQ_IN&&retry<100)//读取高电平中,等待变为低电平,/*&&与<的优先级是<高于&&*/
{
retry++;
SysTickDelay(1);
}
retry=0;
while(!DHT11_DQ_IN&&retry<100)//读取低电平中,等待变高电平
{
retry++;
SysTickDelay(1);
}
SysTickDelay(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温湿度传感器的更多相关文章

  1. Arduino和C51开发DHT11温湿度传感器

    技术:51单片机.Arduino.DHT11.温湿度传感器.传感器   概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...

  2. DHT11温湿度传感器编程思路以及代码的实现(转载)

    源自:https://blog.csdn.net/qq_34952376/article/details/81193938 在我们刚开始进入单片机的学习中,练习写传感器的时序是必不可少的,其实我比较推 ...

  3. STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载

    //为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 ​ //************************** //程序说明:stc ...

  4. 在树莓派上读取DHT11温湿度传感器-python代码实现及常见问题(全面简单易懂)

    最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...

  5. 树莓派使用DHT11温湿度传感器

    一.相关介绍 DHT11介绍: DHT11是一款比较便宜的温湿度传感器模块.读取数据只需要占用一个IO口.能够同时测量温度和相对湿度. DHT11的数据手册可以看这里:http://wenku.bai ...

  6. 玩转X-CTR100 l STM32F4 l DHT11温湿度传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] DHT11数字温湿度传感器是一款含有已校准数字信号输 ...

  7. DHT11温湿度传感器模块使用方法和驱动代码实现

    DHT11模块简介 DHT11是一款价格便宜,易于使用的温度湿度测量二合一传感器.它具有超小体积.极低功耗的特点.它使用单根总线与单片机进行双向的串行数据传输,信号传输距离可达20米以上.非常适用于对 ...

  8. 【雕爷学编程】Arduino动手做(55)--DHT11温湿度传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...

  9. 四博智慧物联系统入门示例-1.增加一个DHT11温湿度传感器

    1.准备工作 DOIT农业控制开发板或者esp32模组,并下载 四博智慧物联系统快速入门-2.准备工作 章节中的固件 DHT11连接在端口01 使用快速入门注册的管理账号和用户 2.配置网络 3.绑定 ...

  10. STM32驱动DHT11温湿度传感器

    DHT11 是一款湿温度一体化的数字传感器.该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接.通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温 ...

随机推荐

  1. bzoj 3489: A simple rmq problem k-d树思想大暴力

    3489: A simple rmq problem Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 551  Solved: 170[Submit][ ...

  2. 【POJ】【2891】Strange Way to Express Integers

    中国剩余定理/扩展欧几里得 题目大意:求一般模线性方程组的解(不满足模数两两互质) solution:对于两个方程 \[ \begin{cases} m \equiv r_1 \pmod {a_1} ...

  3. java 的 (PO,VO,TO,BO,DAO,POJO) 解释

    最近在给Android写接口,其中服务器数据需要定义VO(Value Object)对象进行封装传输 对于VO ,PO , BO , QO,DAO,POJO概念还是比较模糊,所以在这里记录一下: O/ ...

  4. share干什么的

    share到底干什么的 //--------------------打开GameServer,share中加载------------------------- .加载nBodyID //玩家的nBo ...

  5. frequentism-and-bayesianism-chs-iv

    frequentism-and-bayesianism-chs-iv 频率主义与贝叶斯主义 IV:Python的贝叶斯工具   这个notebook出自Pythonic Perambulations的 ...

  6. Configuration Management小结

    一.git branch和patch区别 patch,只是把diff部分创建一个分支.Detail: http://www.cnblogs.com/y041039/articles/2411600.h ...

  7. UML组件图(转载)

    概述: 组件图是不同的性质和行为.组件图用于模拟物理方面的系统. 现在的问题是什么,这些物理方面?物理方面的元素,如可执行文件,库,文件,证件等它位于在一个节点. 因此,组件图用于可视化的组织和系统组 ...

  8. cache应用(asp.net 2.0 SQL数据缓存依赖 [SqlCacheDependency ] )

    Asp.net 2.0 提供了一个新的数据缓存功能,就是利用sql server2005 的异步通知功能来实现缓存 1.首先在sqlserver2005 中创建一个test的数据库. 在SQL Ser ...

  9. 用于主题检测的临时日志(b42e98ba-eb4f-4099-a54c-7aee3f29c3dd - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

    这是一个未删除的临时日志.请手动删除它.(184c28c9-c88e-48fe-9713-6891e2d15044 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

  10. C#&java重学笔记(变量与操作符)

    声明:自用参看读物 C#部分 1.C#中的byte和sbyte并不是二进制的比特,而是无符号 和 有符号的 8位整数. 2.decimal和float double都用来表示小数,前者用e的10的几次 ...