//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. zabbix windows angent安装:

    zabbix windows angent安装:1.下载zabbix agent for windows客户端,直接解压到C盘下.C:\zabbix 的目录015/04/21 11:16 <DI ...

  2. idea maven jetty插件热部署

    maven tomcat插件好像无法进行热部署,jetty可以如下配置实现热部署,但是idea无法进行自动编译,所以需要如下快捷键 Ctrl+Shift+F9,编译 Ctrl+F9,生成项目 < ...

  3. onvif规范的实现:onvif开发常用调试方法 和常见的segmentation fault错误

    在前几篇中,虽然已经实现了rtsp视频流的对接,但是还要做的工作还非常多,onvif本来就是一个覆盖面非常广的一个协议,每一个功能都要填充大量的函数.而且稍不注意就会出现segmentation fa ...

  4. @@IDENTITY在加触发器时返回错误的ID值

    表ID是自增的,所以在添加时要查一下,之前是用@@IDENTITY来查,最近在加触发器时发现返回的会是在触发器中插入语句的数据ID值,上网找了下资料,发现是因为@@IDENTITY 将返回在当前会话中 ...

  5. CSS的base文件常用代码

    article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body,but ...

  6. 图文讲解基于centos虚拟机的Hadoop集群安装,并且使用Mahout实现贝叶斯分类实例 (7)

    接下来,我们开启hadoop集群. 如果之前打开过Hadoop,可能会发生lock的问题,解决方案:http://blog.csdn.net/caoshichaocaoshichao/article/ ...

  7. 二维数组在text,image的应用

    NSArray *imageArr = @[@[@"查看地图",@"map_hy.png"], @[@"联系号码",@"phone ...

  8. 在C#实现托盘效果(转)

    桌面程序的开发中,经常考虑能在状态栏实现托盘快捷操作,托盘程序的实现在API时代,还是相对复杂的,首先在MSDN中可以查看其函数细节, 然后在根据其要求的参数进行复杂的设置.      在.NET时代 ...

  9. E - Number Sequence(第二季水)

    Description A single positive integer i is given. Write a program to find the digit located in the p ...

  10. AdapterView及其子类之三:基于ListView及ArrayAdapter实现列表

    见归档项目ListViewDemo.zip. 基本步骤如下: 1.创建主布局文件,里面包含一个ListView元素. <RelativeLayout xmlns:android="ht ...