//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. find -exec

    find -exec 的标准写法 find ./ -name "*.tmp" -exec rm -rf "{}" \; find -exec 这个命令组合很好用 ...

  2. IEEE发布2016年度编程语言排行榜

    C 语言占据榜首,但大数据类是最大赢家. IEEE Spectrum 的第三次"最受欢迎编程语言"交互式排行榜新鲜出炉.因为不可能顾及到每一个程序员的想法,Spectrum 使用多 ...

  3. structs2标签

    Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的 ...

  4. POJ 1987 Distance Statistics(树的点分治)

      转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 上场CF的C题是一个树的分治... 今天刚好又 ...

  5. SQL Server 2000 函数使用---CAST 和 CONVERT

    本文来自:http://www.cnblogs.com/xh831213/category/47654.html 将某种数据类型的表达式显式转换为另一种数据类型.CAST 和 CONVERT 提供相似 ...

  6. 使用jqMobi开发app基础:弹出内容的设计

    设计APP,因为屏幕非常小.在PC网页山能够放在一体的内容.在APP中就不能放在一起了. 比如例如以下.项目出勤人员非常多,须要弹出一个panel.然后让用户选择,怎样设计呢? 项目出勤panel的内 ...

  7. indesign 注意事项

    画册 42 * 28.5加出血 42.6 * 29.1用纸 889 * 1194 注意事项:indd文件打印需转曲线 快捷键:ctrl+shift+O ctrl+shift+G (2)应用图片需单独创 ...

  8. NDK下 将Platinum SDK 编译成so库 (android - upnp)

    Platinum UPnP SDK 是一个跨平台的C++库,利用该库,可以很容易就构建出DLNA/UPnP控制点(DLNA/UPnP Control Point)和DLNA/UPnP设备(DLNA/U ...

  9. [转载]android中The connection to adb is down,问题和解决

    原网址:http://blog.sina.com.cn/s/blog_5fc93373010164p3.html 今天我出现了第3个错误,于是百度了一下.感觉这篇博客对我挺有帮助,推荐给大家.以下是原 ...

  10. c# 面相对象1-概括

    面向对象和面向过程的区别 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了.  面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为 ...