数字温湿度传感器DHT11--操作源代码
//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--操作源代码的更多相关文章
- STM32—驱动DHT11数字温湿度传感器
文章目录 DHT11模块简介 DHT11数据传输 DHT11通信时序 代码实现 相关引脚初始化 复位模块 判断响应模块 读取数据包模块 DHT11模块简介 DHT11数字温湿度传感器,用来测量环境的温 ...
- STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题
1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...
- DH11数字温湿度传感器
DH11数字温湿度传感器是一种集温度.湿度一体的复合传感器,它能把温度和湿度物理量通过温.湿度敏感元件和相应电路转化成方便计算机.PLC.智能仪表等数据采集设备直接读取的数字量.DHT11由电阻式感湿 ...
- 温湿度传感器DHT11程序示例
DHT11概述 HT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器. 它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性.传感器包括一个电阻式 ...
- 进阶之路(中级篇) - 016 温湿度传感器DHT11
如果想使用 Arduino 开发板驱动 DHT11 来获取温湿度的时候建议使用第三方的库,这样可以加快程序的开发速度,而且不容易出错,下面的代码我已经安转了第三方的库了.详细的安装方法请参考极客先锋的 ...
- [转载] 树莓派读取温湿度传感器DHT11
原文地址: http://blog.csdn.net/liang890319/article/details/8739683 硬件: 树莓派 2.0 DHT模块 接树莓派5V GND GPIO1 功 ...
- 玩转X-CTR100 l STM32F4 l DHT11温湿度传感器
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] DHT11数字温湿度传感器是一款含有已校准数字信号输 ...
- 在树莓派上读取DHT11温湿度传感器-python代码实现及常见问题(全面简单易懂)
最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...
- Arduino和C51开发DHT11温湿度传感器
技术:51单片机.Arduino.DHT11.温湿度传感器.传感器 概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...
随机推荐
- Riak VClock
Riak VClock 关于向量时钟的概念.在这里就多讲了,大家能够參照一下Dynamo的论文了解一下,向量时钟在分布式主要用于解决一致性性问题.能够和CRDTs一起看. 以下的源码是參照riak中的 ...
- ACM学习-POJ-1125-Stockbroker Grapevine
菜鸟学习ACM,纪录自己成长过程中的点滴. 学习的路上,与君共勉. ACM学习-POJ-1125-Stockbroker Grapevine Stockbroker Grapevine Time Li ...
- ARM9嵌入式学习笔记(2)-Vi使用
ARM9嵌入式学习笔记(2) 实验1-1-3 Vi使用 vi创建文件vi hello.c:vi smb.conf-打开文件smb.conf i键-插入模式:esc键-命令行模式::-底行模式: 底行模 ...
- 关于vnc连接闪退问题的设置
设置如下: 依次点Option-->Advanced-->Expert找到ColourLevel,默认值是pal8,修改为rgb222或full.
- 查询ID为5的数据的前后各一行数据,ID不连续
首先假如有一张表 test 那么我们要查的就是 3 和 7 这里我的思路是 用SQL Server 自带的Row_Number 函数把 ID=5 的 RowNo 查出来,因为RowNo是连续的,所以它 ...
- html标签之meta标签
1 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ...
- 【web开发--js学习】functionName 如果是一个属性值,函数将不会被调用
<html> <head> <meta http-equiv="Content-Type" Content="text/html; char ...
- 2014年1月24日 Oracle 事务导读
形象举例: 从 A 账户向 B 账户转账 10000 元 步骤: 1. A - 10000 2. B + 10000 事务的作用就是确保这两步无误执行后提交,若有一个执行不成功则失败. 结束事务的5 ...
- Long,String类型的两个值进行比较,注意点!!!
一: . Long 类型指的是 java.util.Lang 对象,而不是基本类型 long (注意大小写)Java中如果使用 == 双等于比较对象,等于比较的是两个对象的内存地址,也就是比较两个对象 ...
- 【python学习笔记02】python的数据类型2
列表和元组之间的主要区别是:列表括在括号([])和它们的元素和大小是可以改变的,而元组在圆括号(),不能被更新.元组可以被认为是只读列表. 存储在一个列表中的值可以使用切片操作符来访问([]和[:]) ...