第五部分 外设篇 - 基础实验 第2章 CC2530温湿度传感器DHT11
1理论分析
1.1 DHT11 介绍
DHT11 数字温湿度传感器,如图所示,是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个 DHT11 传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在 OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达 20 米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。
1.2 CC2530 读取 DHT11
1、串行接口 (单线双向)
DHT11 模块的数据管脚用于 MCU 与 DHT11 之间的通讯和同步,采用单总线数据
格式,一次通讯时间 4ms 左右,一次完整的数据传输为 40bit,高位先出,数据分小数部分和整数部分,具体格式是:
8bit 湿度整数数据+8bit 湿度小数数据+8bi 温度整数数据+8bit 温度小数数据 +8bit校验和数据传送正确时校验和数据等于 8bit 湿度整数数据+8bit 湿度小数数据+8bi 温度整数数据+8bit 温度小数数据所得结果的末 8 位。
用户 MCU 发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,等待主机
开始信号结束后,DHT11 发送响应信号,送出 40bit 的数据,并触发一次信号采集,用户可选择读取部分数据。从模式下,DHT11 接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11 不会主动进行温湿度采集.采集数据后转换到低速模式。
总线空闲状态为高电平,主机把总线拉低等待 DHT11 响应,主机把总线拉低必须大于 18 毫秒,保证 DHT11 能检测到起始信号。DHT11 接收到主机的开始信号后,等待主机开始信号结束,然后发送 80us 低电平响应信号。主机发送开始信号结束,延时等待 20-40us 后,读取 DHT11 的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高,如图中黑色线所示
总线为低电平,说明 DHT11 发送响应信号,DHT11 发送响应信号后,再把总线拉高 80us,准备发送数据,每一 bit 数据都以 50us 低电平时隙开始,高电平的长短定了数据位是 0 还是 1。格式如图中灰色线所示。如果读取响应信号为高电平,则 DHT11 没有响应,请检查线路是否连接正常。当最后 1bit 数据传送完毕后,DHT11 拉低总线 50us,随后总线由上拉电阻拉高进入空闲状态。
另外,数字 0 信号表示方法如图所示
数字 1 信号表示方法如图所示
2实验详解
2.1实验目的
1) 通过实验掌握CC2530 芯片GPIO 的配置方法
2) 掌握温湿度传感器DHT11 的使用
2.2实验设备
硬件:PC 机一台;ZB2530(底板、核心板、仿真器、USB 线) 一套 DHT11 一个
软件:2000/XP/win7 系统,IAR 8.20 集成开发环境、串口助手
2.3实验相关电路图
注意:传感器模块上面从左到右是 VCC DATA GND ,板子上面从左到右是3V3 P07 GND 刚好是对应起来的。
DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
请按:3V3 接模块VCC、GND 接模块的GND、P07 接到模块数据输出脚。
2.4实验分析
实验中用到了串口和P0_7,见下表.
T1STAT(0xAF)-定时器1状态
位 | 名称 | 复位 | R/W | 描述 |
7:6 | - | 0 | R0 | 保留 |
5 | OVFIF | 0 | R/W0 | 定时器1计数器溢出中断标志。当计数器在*运行或按模计数模式下达到最终计数值时设置,当在正/倒计数模式下达到零时倒计数。写1没有影响。 |
4 | CH4IF | 0 | R/W0 | 定时器1通道4中断标志,当通道4中断条件发生时设置,写1没有影响。 |
3 | CH3IF | 0 | R/W0 | 定时器1通道3中断标志,当通道3中断条件发生时设置,写1没有影响。 |
2 | CH2IF | 0 | R/W0 | 定时器1通道2中断标志,当通道2中断条件发生时设置,写1没有影响。 |
1 | CH1IF | 0 | R/W0 | 定时器1通道1中断标志,当通道1中断条件发生时设置,写1没有影响。 |
0 | CH0IF | 0 | R/W0 | 定时器1通道0中断标志,当通道0中断条件发生时设置,写1没有影响。 |
U0DBUF | USART 0接收/发送数据缓存 |
2.5源码分析
/**Includes*********************************************************************/
#include <ioCC2530.h>
#include <string.h>
#include "UART.H"
#include "DHT11.H"
#include "LCD.h"
/**
* @brief 主函数
* @param None
* @retval None
*/
void main(void)
{
uchar temp[3];
uchar humidity[3];
uchar strTemp[13]="Temperature:";
uchar strHumidity[10]="Humidity:";
Delay_ms(1000); //让设备稳定
InitUart(); //串口初始化
LCD_Init(); //oled 初始化
LCD_CLS(); //屏全亮
LCD_welcome();
while(1)
{
memset(temp, 0, 3);
memset(humidity, 0, 3);
DHT11(); //获取温湿度
/*
将温湿度的转换成字符串
将十进制数转换成 ASCII 码,0x30 就是 ASCII 码里的 0 ,
然后通过串口将最终温湿度值发送给电脑显示出来。
*/
temp[0]=wendu_shi+0x30;
temp[1]=wendu_ge+0x30;
humidity[0]=shidu_shi+0x30;
humidity[1]=shidu_ge+0x30;
//获得的温湿度通过串口输出到电脑显示
UartSendString(strTemp, 12);
UartSendString(temp, 2);
UartSendString(" ", 3);
UartSendString(strHumidity, 9);
UartSendString(humidity, 2);
UartSendString("\n", 1);
Delay_ms(500);
LCD_P8x16Str(16, 2, "Humidity:");
LCD_P8x16Str(86, 2, (unsigned char*)humidity);
Delay_ms(500);
LCD_P8x16Str(16, 4, "Temp:");
LCD_P8x16Str(64, 4, (unsigned char*)temp);
Delay_ms(1000); //延时函数使用定时器方式
}
}
注意:本教程只给出了部分代码,想了解具体细节请参看源码。
2.6实验现象
通过串口可以查看温湿度信息,如果有OLED屏,直接可以看到温湿度的显示。
注意:左边是温度,手摸可以改变温度数据。右边是湿度,哈气可以改变数据。
本章参考代码
上一篇: PEAR:创建中间的数据库应用层1
下一篇: 用 PHP 读取和编写 XML DOM