//IO定义
#define P_DataIN_DHT11 PB0_IN
#define P_DataOUT_DHT11 PB0_OUT
//宏定义
#define BSET_DHT11 P_DataOUT_DHT11 = 1
#define BCLR_DHT11 P_DataOUT_DHT11 = 0 //***************************************
// 模块功能:读取DHT11的数据
// 该模块为温湿度传感器 当主机给启动信号后
// 该模块会连续发出5个字节的数据 共耗时约4MS
// 第一二个字节为湿度数据的整数与小数部分
// 第三四个字节为温度数据的整数与小数部分
// 第五个字节为校验码 它是前四个数据相加后的后8位的数值
// 程序带未传感器未连接检测 及读数据超时处理
//*************************************** //*************************************
// 函数名称:VerificaDHT11Data
// 函数功能:效验DHT11所读的数据是否正确
// 入口参数:
// 出口参数:校验正确返回1 否则返回0
// 备注:
//***************************************/
uint8 VerificaDHT11Data(uint8 *a)
{
uint8 i ;
uint8 Tmp = 0 ;
uint16 wTmp = 0 ; for(i=0;i<4;i++)
{
wTmp += a[i] ;
}
Tmp = (uint8)(wTmp & 0x00ff) ; //取低8位数据 if(Tmp == a[4])
{
return 1 ;
}
else
{
return 0 ;
}
}
//*************************************
// 函数名称:ReadPinDHT11
// 函数功能:读管脚并滤波
// 入口参数:
// 出口参数:返回管脚状态 Fcpu=16M时 耗时6US
//***************************************/
uint8 ReadPinDHT11(void)
{
uint8 Tcon = 0 ;
uint8 i ; for(i=0;i<5;i++) //读5次
{
_asm("nop") ;//延时
_asm("nop") ;
_asm("nop") ;
_asm("nop") ;
_asm("nop") ; if(P_DataIN_DHT11 == 1)
{
Tcon ++ ;
}
}
if(Tcon >= 3) //读状态为1的次数大于3次
{
return 1 ;
}
else
{
return 0 ;
}
}
//=====读一字节数据======
uint8 ReadDHT11DataByte(uint8 InValue)
{
uint8 Data = 0 ;
uint8 i = 0 ;
uint8 ucTOver = 0 ; //等待超时时间 for(i=0;i<8;i++)
{
ucTOver = 30 ; //200U
while(!ReadPinDHT11()&&(ucTOver--)) ; //等待高电平的到来
Nopt(VT_DLY40U) ; //延时40U Data <<= 1; ucTOver = 30 ; //200U
if(ReadPinDHT11()&&(ucTOver--)) //判断IO是否还是被拉高的状态
{
Data |= 0x01 ;
//读最后一BIT数据时 不等待高电平
ucTOver = 30 ; //200U
while(ReadPinDHT11()&&(ucTOver--)) ; //等待IO被外设拉低
}
} return Data ;
}
//*************************************
// 函数名称:ReadDH11Data
// 函数功能:读取DHT
// 入口参数:
// 出口参数:返回读取的数据
// 当读取到数据时 返回1 未读取到数据返回0
//***************************************/
uint8 ReadDHT11Data(uint8 *a)
{
uint8 i ;
uint8 ucTOver = 0 ; //等待超时时间 Nopt(VT_DLY40U) ; //延时40U if(ReadPinDHT11())
{
Nopt(VT_DLY40U) ; //延时40U
//从机一直没有回应 直接退出
if(ReadPinDHT11())
{
return 0 ;
}
} //等待从机回应信号结束
ucTOver = 30 ; //200U
while(!ReadPinDHT11()&&(ucTOver--)) ; //从机拉低时一直等待
ucTOver = 30 ; //200U
while(ReadPinDHT11()&&(ucTOver--)) ; //从机拉高时一直等待 for(i=0;i<5;i++) //读5字节数据
{
*a = ReadDHT11DataByte(i) ;
a++ ;
} return 1 ;
} //*************************************
// 函数名称:CmdDHT11Data
// 函数功能:读DHT11的湿度 温度
// 入口参数:延时时间
// 出口参数:无
//***************************************/
void CmdDHT11Data(void)
{
static uint16 Tcyc = 0 ;
static uint8 Tcon = 0 ;
static uint8 TNum = 0 ;
uint8 Tmp = 0 ;
uint16 wTmp = 0 ;
uint8 i ; Tcyc ++ ;
if(Tcyc >= (VT_1S*VT_READDHT11)) //1s读取一次数据
{
Tcyc = 0 ;
F_ReadD11 = 1 ;
Tcon = 0 ;
} if(F_ReadD11) //准备启动从机 1S动作一次
{
if(Tcon < 4) // 主机启动 拉低40ms
{
Tcon ++ ;
BCLR_DHT11 ;
}
else
{
F_ReadD11 = 0 ; F_TestDH11 = 0 ; //读数据前清掉工作正常标志 for(i=0;i<5;i++) //清空数据缓存
{
aDHT11Data[i] = 0 ;
} BSET_DHT11 ; //主机拉高 等待从机回应
//从DHT11读数据
Tmp = ReadDHT11Data(aDHT11Data) ;// BSET_DHT11 ; //释放总线 if(Tmp != 0)//读数据有效
{
if(VerificaDHT11Data(aDHT11Data))
{
F_ReadD11OK = 1 ;//校验 成功
TNum = 0 ;
}
}
else //传感器未连接出错
{
TNum ++ ;
if(TNum >= 4)
{
TNum = 0 ;
F_ERRD11 = 1 ;
}
} }
}
}
//*************************************
// 函数名称:CountDHT11
// 函数功能:计算湿度
// 入口参数:延时时间
// 出口参数:无
//***************************************/
void CountHumidity(void)
{
uint8 Tmp ;
static uint8 R_Save[3]; if(!F_ReadD11OK) return ;
F_ReadD11OK = 0 ;
//对数据进行滤波取中值处理
RMovData_Byte(R_Save,3);
R_Save[0] = aDHT11Data[0] ;
//保存结果
Humidity = Order_Byte(R_Save); //处理位数最大3位 F_TestDH11 = 1 ; //DHT11 工作正常
}
//======================================================
//=======main========================================
//======================================================
void main(void)
{
while(1)
{
while(!F_10MS); // 主程序10MS跑一次
F_10MS = 0 ; CmdDHT11Data() ; //读DHT11数据
CountHumidity() ; // 计算湿度
} }

数字温湿度传感器DHT11--操作源代码的更多相关文章

  1. STM32—驱动DHT11数字温湿度传感器

    文章目录 DHT11模块简介 DHT11数据传输 DHT11通信时序 代码实现 相关引脚初始化 复位模块 判断响应模块 读取数据包模块 DHT11模块简介 DHT11数字温湿度传感器,用来测量环境的温 ...

  2. STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题

    1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...

  3. DH11数字温湿度传感器

    DH11数字温湿度传感器是一种集温度.湿度一体的复合传感器,它能把温度和湿度物理量通过温.湿度敏感元件和相应电路转化成方便计算机.PLC.智能仪表等数据采集设备直接读取的数字量.DHT11由电阻式感湿 ...

  4. 温湿度传感器DHT11程序示例

    DHT11概述 HT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器. 它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性.传感器包括一个电阻式 ...

  5. 进阶之路(中级篇) - 016 温湿度传感器DHT11

    如果想使用 Arduino 开发板驱动 DHT11 来获取温湿度的时候建议使用第三方的库,这样可以加快程序的开发速度,而且不容易出错,下面的代码我已经安转了第三方的库了.详细的安装方法请参考极客先锋的 ...

  6. [转载] 树莓派读取温湿度传感器DHT11

    原文地址: http://blog.csdn.net/liang890319/article/details/8739683 硬件: 树莓派 2.0 DHT模块  接树莓派5V GND GPIO1 功 ...

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

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

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

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

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

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

随机推荐

  1. VMware 虚拟机的网络连接方式详解

         VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作 ...

  2. HMM的学习笔记1:前向算法

    HMM的学习笔记 HMM是关于时序的概率模型.描写叙述由一个隐藏的马尔科夫链随机生成不可观測的状态随机序列,再由各个状态生成不可观測的状态随机序列,再由各个状态生成一个观測而产生观測的随机过程. HM ...

  3. 安装sql server 2008 management studio时,提示升级VS2008 到 SP1

    安装sql server 2008 management studio时,提示错误:此计算机上安装了 Microsoft Visual Studio 2008 的早期版本.请在安装 SQL Serve ...

  4. html5的改变

    html5的改变 新增的元素 新增的结构元素 section.article.aside.header.hgroup.footer.nav.figure 新增的其他元素 video.audio.emb ...

  5. 表设计与SQL优化

    1. 说说分区表的主要好处是什么,为什么会有这些好处. 分区功能能够将表.索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区.每个分区有自己的名称,还可以选择自己的存储特性. 从数据库管理员的 ...

  6. centos添加sudoers

    CentOS添加sudoers 1.chmod 740 /etc/sudoers 2. ## Allow root to run any commands anywhere     root    A ...

  7. <转>maven发布第三方jar的一些问题

    在创建maven中私有仓库过程中,需要发布一些第三方jar到nexus仓库,使用命令的是 deploy:deploy-file 有许多参数,具体可查看 http://maven.apache.org/ ...

  8. Android系统五大布局详解Layout

    我们知道Android系统应用程序一般是由多个Activity组成,而这些Activity以视图的形式展现在我们面前, 视图都是由一个一个的组件构成的.组件就是我们常见的Button.TextEdit ...

  9. C++标准程序库读书笔记-第四章通用工具

    1.Pairs(对组) (1)class pair可以将两个值视为一个单元.任何函数需返回两个值,也需要pair. (2)便捷地创建pair对象可以使用make_pair函数 std::make_pa ...

  10. php中Maximum execution time of 120 seconds exceeded时间超时错误解决方案

    1.修改php的配置文件,找到php.ini文件 max_execution_time = 120 ;//设置成你想要的值,单位是秒 2.使用ini_set()函数,使用这个函数来改变你的最大执行时间 ...