温度和湿度测量通常在家庭自动化、环境监测、气象站等许多应用中很有用。LM35旁边最常用的温度传感器是 DHT11,我们之前通过与Arduino和Raspberry连接构建了许多DHT11 项目Pi和许多其他开发板。在本文中,我们将学习如何将此DHT11 与 PIC16F87A连接,这是一个 8 位 PIC 微控制器。我们将使用这个微控制器通过 DHT11 读取温度和湿度的值并将其显示在液晶显示器上。
DHT11 – 规范和工作
DHT11 传感器以模块形式或传感器形式提供。在本教程中,我们使用的是传感器,两者之间的唯一区别在于,在模块形式中,传感器具有一个滤波电容和一个连接到传感器输出引脚的上拉电阻。因此,如果您正在使用该模块,则无需在外部添加它们。传感器形式的 DHT11 如下所示。
DHT11 传感器带有蓝色或白色外壳。 在这个外壳内,我们有两个重要的组件 可以帮助我们感知相对湿度和温度。 第一个组件是一对电极;这两个电极之间的电阻由保持水分的基板决定。所以测得的电阻与环境的相对湿度成反比。相对湿度越高,电阻值越低,反之亦然。另外,请注意相对湿度与实际湿度不同。相对湿度测量空气中相对于空气温度的水含量。
另一个组件是表面贴装的 NTC 热敏电阻。术语 NTC 代表负温度系数,随着温度的升高,电阻值将减小。传感器的输出经过工厂校准,因此作为程序员,我们不必担心校准传感器。1-Wire通信给出的传感器输出,我们看一下这个传感器的引脚和连接图。
该产品采用 4pin 单排封装。第 1 个引脚跨接 VDD,第 4 个引脚跨接 GND。第二个引脚是数据引脚,用于通信目的。该数据引脚需要一个 5k 的上拉电阻。但是,也可以使用其他上拉电阻,例如 4.7k 到 10k。第 3 个引脚没有连接任何东西。所以它被忽略了。
数据表提供了技术规格以及可以在下表中看到的接口信息 -
上表显示了温度和湿度的测量范围和精度。它可以测量 0-50 摄氏度的温度,精度为 +/- 2 摄氏度,测量相对湿度 20-90%RH,精度为 +/- 5%RH。详细规格见下表。
与 DHT11 传感器通信
如前所述,为了使用 PIC 从DHT11读取数据,我们必须使用PIC 单线通信协议。有关如何执行此操作的详细信息,可以从其数据表中的 DHT 11 的接口图了解,如下所示。
DHT11 需要来自 MCU 的启动信号来启动通信。因此,每次 MCU 都需要向 DHT11 Sensor 发送启动信号,要求其发送温度和湿度值。在完成启动信号后,DHT11 会发送一个 包含温度和湿度信息的响应信号。数据通信采用单总线数据通信协议。全数据长度为 40 位,传感器先发送高位数据。
由于上拉电阻,数据线在空闲模式下始终保持在 VCC 电平。MCU 需要将此电压从高到低拉低至少 18 毫秒。在此期间,DHT11 传感器检测到启动信号,微控制器将数据线拉高 20-40us。这 20-40us 的时间称为 DHT11 开始响应的等待期。在这个等待期之后,DHT11 将数据发送到微控制器单元。
DHT11 传感器数据格式
数据由组合在一起的小数部分和整数部分组成。传感器遵循以下数据格式 -
8bit 积分 RH 数据 + 8bit 十进制 RH 数据 + 8bit 积分 T 数据 + 8bit 十进制 T 数据 + 8bit 校验和。
可以通过使用接收到的数据检查校验和值来验证数据。可以这样做是因为,如果一切正常,并且传感器已经传输了正确的数据,那么校验和应该是“8 位 RH 积分数据+8 位十进制 RH 数据+8 位积分 T 数据+8 位十进制 T 数据”之和。
所需组件
对于这个项目,需要以下内容 -
PIC单片机(8位)编程设置。
面包板
5V 500mA 电源装置。
4.7k电阻2个
1k电阻
PIC16F877A
20mHz晶体
33pF电容2个
16x2 字符 LCD
DHT11传感器
跳线
示意图
将DHT11 与 PIC16F877A连接的电路图如下所示。
我们使用16x2 LCD来显示我们从 DHT11 测量的温度和湿度值。LCD 采用4 线模式连接,传感器和 LCD 均由 5V 外部电源供电。我使用面包板进行所有必需的连接,并使用了外部 5V 适配器。您还可以使用此面包板电源板为您的电路板供电 5V。
电路准备好后,我们要做的就是上传本页底部给出的代码,我们可以开始读取温度和湿度,如下所示。如果您想知道代码是如何编写的以及它是如何工作的,请进一步阅读。您还可以在本页底部的视频中找到该项目的完整工作。
DHT11 with PIC MPLABX 代码说明
代码使用 MPLABX IDE 编写,并使用 XC8 编译器编译,两者均由 Microchip 提供,可免费下载和使用。请参考基础教程了解编程基础知识,下面只讨论与 DHT11 传感器通信所需的三个重要功能。功能是 -
无效 dht11_init(); 无效查找响应(); char re
第一个函数用于dht11 的启动信号。如前所述,与 DHT11 的每次通信都以启动信号开始,这里首先更改引脚方向以将数据引脚配置为微控制器的输出。然后数据线被拉低,一直等待18mS。之后,微控制器再次将线路设为高电平,并一直等待长达 30us。等待时间过后,数据引脚设置为微控制器的输入以接收数据。
无效 dht11_init(){ DHT11_Data_Pin_Direc
下一个函数用于根据数据引脚状态设置校验位。它用于检测 DHT11 传感器的响应。
无效 find_response(){ Check_bit = 0; __delay_us(40); if (DHT11_Data_Pin == 0){ __delay_us(80); if (DHT11_Data_Pin == 1){ Check_bit = 1; } __delay_us(50);} }
最后是dht11读取函数;此处数据被读取为 8 位格式,其中数据通过位移操作返回,具体取决于数据引脚状态。
char read_dht11(){ char 数据,for_count; for(for_count = 0; for_count < 8; for_count++){ while(!DHT11_Data_Pin); __delay_us(30); if(DHT11_Data_Pin == 0){ data&= ~(1<<(7 - for_count)); //清除位 (7-b) } else{ data|= (1 << (7 - for_count)); //设置位 (7-b) while(DHT11_Data_Pin); } } 返回数据; }
之后,一切都在 main 函数中完成。首先,系统初始化在 LCD 被初始化并将 LCD 引脚端口方向设置为输出的地方完成。应用程序在主函数内部运行
无效 main() { sys
与 DHT11 传感器的通信是在while循环中完成的,在该循环中将启动信号提交给传感器。之后,触发find_response函数。如果Check_bit为 1,则进行进一步的通信,否则 LCD 将显示错误对话框。
根据 40 位数据,read_dht11被调用 5 次(5 次 x 8 位),并按照数据表中提供的数据格式存储数据。校验和状态也被检查,如果发现错误,它也会在 LCD 中通知。最后,数据被转换并传输到 16x2 字符 LCD。
#include
这里还没有内容,您有什么问题吗?
电子电路资源推荐
- 开关电源电路设计入门
来源:大学堂
- CMOS射频集成电路设计
来源:下载中心
- 新编MCS-51单片机应用设计+张毅刚等编着+PDF电子书
来源:下载中心
- 焊接基础知识
来源:大学堂
- 电路的基本物理量:电流,电压,电位,电动势,电功率
来源:电路图
- 电工基础:电路的组成
来源:电路图
推荐帖子 最新更新时间:2024-11-13 08:52
- 测试阻抗时测量错误的潜在来源
- 测试 阻抗时 测量 错误的潜在来源 测试阻抗时测量错误的潜在来源 资料不错
- 天天向上测试/测量
- C2000芯片的ADC(请大家帮忙补充)
- C2000有3代产品2812,28335,28035。他们的ADC说是12位,但是很多人做不到,一般认为他们的ENOB是10.1,10.9,10.4. 但其实针对C2000的ADC说ENOB并没有很大意义。因为在测试交流电时ENOB和实际精度并不是1:1的。而测量直流电的
- hlx3012微控制器 MCU
- 只为uC而生,uS成长历程 2
- 现在,我们要正儿八经地来做 定时器中断 的测试函数了。 首先要说明的事情是 我们测试的 定时中断 是 uSer里的那个植入 定时器中断服务 的函数真的在中断里跑起来了。 而不是我们在Apper里写的中断。 因为从头到尾我们都在开发uSer和测试uSer。 前面说过,测试方法是
- 辛昕编程基础
- 帮忙完成一个简单的需求分析
- 我需要开发一个支持XML的编辑器,需要实现:数据保存为XML格式 能进行基本的数据操作(添加,删除,查看,修改),能让PDA和pc机保持数据同步,开发语言为c#.net,操作系统为wince5.0.现在是需要向开发板厂家提要求,我不知道开发这样的小软件,在厂家提供的win
- helh嵌入式系统
- 我咋没找到BeagleBone的PCB尺寸呢?
- 谁有BeagleBone的PCB尺寸,主要是那两个插座尺寸、几个固定孔尺寸。 谢谢大家,我将以PCB库感谢之 我咋没找到BeagleBone的PCB尺寸呢? 第91页 91页中,没有那个插座的位置尺寸。也没有空的位置。 只是边框尺寸 回复 沙发 damiaa 的帖子 有啊。
- dontiumDSP 与 ARM 处理器
- 转载 鱼J参数计算器
- 转载 鱼J参数计算器 转载 鱼J参数计算器 是什么东西? 是设计电鱼器电路软件, 这不是一个好东西,还是不要分享了。 是不是设计出电路有高圧危险。如果不好可以把资料删除
- yjtyjt下载中心专版
- 74HC138/CD4511数码管显示
- 稳压二极体和LED的搭配
- TI Hercules 安全微控制器(二)
- 走近PI InnoSwitch-CP,答题赢利颁奖!
- 基本电能质量测量方法和常见问题原因
- dsp28335 Ecap
- 求助:定时器计数不够了!!
- 怎么解决电磁流量计信号弱的问题
- STM32上TFT彩屏驱动和JPG解码效果
- 暧昧!牛人解读从未发现爱情与开关电源控制理论的亲密关系(ZT)
- 关于实时性的探讨
- 买了Lanuch Pad的同学们,一起来看视频教程吧。有下载的。
- Altium Designer10中设置了不同的线宽规则为什么布完线后线宽都一样呢?
- 使用C#封装?求助
- 求助DM8148+NVP6124驱动求助(有酬谢)
- PC104设备在纯DOS下跑程序的问题,虚拟软驱引导的纯DOS和实际安装的DOS有区别不?
- 找ise foundation 10.1 的开发软件
- 嵌入式系统技术产品的特点
- 做串口通讯时出现的问题,求大虾指导
- 【STM32H7S78-DK】USB虚拟串口
- LGTISP--LGT单片机下载器
- DC2129A,基于 LTC3119 的演示板 2.5V = VIN = 18V,VOUT = 5V @ 高达 5A 同步降压-升压转换器
- 在长电缆上使用 P82B715 I2C 扩展器的应用电路
- 使用 ROHM Semiconductor 的 BD45285 的参考设计
- EVAL-ADG2128EBZ,用于 PBX 数字基站线路模块的模拟开关评估板
- LTC6262HMS 235 uA 电源电流运算放大器的典型应用
- [夏日必备]更好的暴力风扇
- 徐帆 1810300129 PMM8713
- 【CW32】L5级自动小车
- 基于 INA250A4 传感器板的 i.MX 应用案例研究中的电流测量