【CC2530开发基础篇】DHT11温湿度传感器

497 阅读14分钟

一、前言

1.1 开发背景

CC2530是一款基于8051内核的片上系统(SoC),广泛应用于低功耗无线通信和物联网设备开发。该芯片集成了丰富的硬件资源,如多功能GPIO、UART、SPI、I2C等通信接口,适合连接各种外部传感器及模块。同时,CC2530还支持ZigBee协议栈,是实现无线数据传输的理想选择。

DHT11是一种数字温湿度传感器,内置电容式湿度传感器和NTC温度传感器,并搭载一个8位单片机,用于处理和输出温湿度数据。它通过单总线接口与主控芯片通信,接口简单且传输可靠,支持环境温湿度的实时检测。DHT11的测量范围覆盖0℃至50℃的温度,以及20%RH至90%RH的湿度,适合普通环境监测场景。

在基于CC2530的开发项目中,通过将DHT11连接到P0.7引脚,可以实现温湿度数据的实时采集。数据采集完成后,通过串口0将测量结果发送到串口调试助手进行显示和分析。这种设计便于开发和调试,同时可以为物联网设备的数据交互提供基础支持。

DHT11的低功耗特性与CC2530的高效性能相结合,使得整体系统具备较高的能效比,适用于对功耗敏感的场景。通过这种模块化设计,可以满足智能家居、环境监测等多种应用需求,为更复杂的系统开发打下坚实的基础。

这是当前实验使用的CC2530板子的实物图:

cke_5113.png

1.2 DHT11传感器

DHT11是一种经济实用的温湿度传感器,广泛应用于环境监测、家用电器、气象站等领域。它体积小巧,功耗低,能够以数字信号形式输出温度和湿度数据,便于与各种主控芯片或单片机的对接,成为入门级开发者和专业设计者的常用选择。

DHT11内部集成了电容式湿度传感器和NTC温度传感器,并配备了一个高性能的8位单片机,用于处理和传输传感器数据。它采用单总线数字信号接口,这种设计极大简化了硬件连接,仅需一根数据线即可完成通信。同时,DHT11支持数据校验功能,在传输过程中附加一个8位校验位,以确保数据的完整性和可靠性。

DHT11的测量范围能够覆盖0℃至50℃的温度,以及20%RH至90%RH的相对湿度,基本满足日常环境监测需求。其温度测量精度为±2℃,湿度测量精度为±5%RH。尽管精度和范围相对较低,但对于对成本和功耗有要求的场景来说,它是一个性价比极高的选择。

DHT11的物理外形采用模块化设计,通常具有四个引脚:VCC、GND、DATA和NC。其中,DATA引脚用于与主控芯片进行单总线通信,数据线既可以输出传感器数据,也能够接收主控芯片发送的指令。模块内部通常会集成一个上拉电阻,方便开发者直接使用而无需外部搭建电路。

DHT11的运行电压范围为3.3V到5.5V,这使得它能够兼容多种主控芯片,包括3.3V的低功耗芯片和传统5V单片机。工作电流极低,通常为0.5mA以下,在休眠模式下则仅消耗几十微安,非常适合低功耗应用。

1.3 项目硬件模块组成

(1) CC2530主控芯片 作为系统的核心控制单元,负责传感器数据的采集、处理和通过串口传输数据。

(2) DHT11温湿度传感器 用于采集环境中的温度和湿度数据,通过单总线接口与CC2530进行通信。

(3) P0.7 GPIO接口 用于连接DHT11传感器的数据引脚,实现传感器与主控芯片的数据交互。

(4) 电源模块 提供系统运行所需的电源,支持3.3V的稳定输出以满足CC2530和DHT11的工作需求。

(5) 串口通信模块 通过CC2530的UART0接口,将采集到的温湿度数据发送到PC端,用于显示和调试。

(6) 串口调试助手 作为调试工具运行在PC端,用于接收和显示CC2530发送的串口数据,便于实时监测和系统验证。

1.4 项目实现的功能

功能模块具体描述实现方式
温湿度数据采集使用DHT11传感器采集环境的温度和湿度信息DHT11传感器通过单总线与CC2530通信获取数据
数据处理对采集的温湿度数据进行解析,提取有效信息在CC2530内通过软件处理传感器输出的数字信号
数据传输将解析后的温湿度数据通过串口发送到串口调试助手进行显示利用CC2530的UART0模块进行串口通信
引脚配置通过配置P0.7为输入端口以接收DHT11传感器的数据通过CC2530寄存器配置GPIO
实时监测系统实现了对环境温湿度的实时采集和输出,方便用户查看当前环境状况数据采集、解析和传输均在程序主循环中实现
低功耗运行系统功耗较低,适合持续运行的环境监测场景CC2530的低功耗特性与DHT11的节能设计相结合
调试支持提供调试数据的串口输出功能,方便开发过程中对系统的验证和问题排查串口调试助手接收和显示串口数据
系统扩展性具备接入其他传感器或模块的潜力,可扩展为更复杂的环境监测或控制系统依托CC2530的多功能引脚和外设资源

二、CC2530基础知识科普

2.1 CC2530 与 ZigBee 的含义

CC2530是什么

CC2530是一款由德州仪器(Texas Instruments,TI)推出的无线微控制器芯片,专为低功耗和无线通信应用设计。它基于8051内核,具有丰富的片上资源,包括128 KB的闪存、8 KB的RAM、多个UART和SPI接口、ADC模块等。此外,CC2530支持IEEE 802.15.4标准,这是ZigBee协议栈的基础。CC2530的低功耗特性和高集成度使其特别适用于智能家居、物联网(IoT)设备和工业自动化等应用场景。

ZigBee是什么

ZigBee是一种基于IEEE 802.15.4标准的无线通信协议,专为低功耗、低数据速率和短距离应用场景设计。它的主要特点是功耗低、组网灵活、支持大规模网络节点(如星型、网状和树形拓扑),并且具有较强的抗干扰能力。ZigBee常用于智能家居(如智能灯控、温湿度传感器)、工业物联网、医疗设备和农业监控等领域。与Wi-Fi和蓝牙相比,ZigBee适合需要低功耗、低数据速率和高网络节点容量的应用。

CC2530与ZigBee的联系

CC2530是支持ZigBee协议的硬件平台之一。CC2530的硬件架构和无线射频模块完全符合IEEE 802.15.4标准,而ZigBee协议栈则是运行在该标准之上的通信协议。通过在CC2530芯片上加载ZigBee协议栈(如TI提供的Z-Stack),用户可以构建完整的ZigBee无线通信系统。

CC2530作为ZigBee设备的实现平台,可以配置为不同类型的ZigBee节点,包括协调器(Coordinator)、路由器(Router)和终端设备(End Device)。协调器负责整个ZigBee网络的建立和管理,路由器用于中继信号扩展网络范围,终端设备通常是低功耗的传感器或执行器。

CC2530是支持ZigBee协议的硬件芯片,而ZigBee是运行在像CC2530这样的硬件平台上的通信协议。CC2530为ZigBee提供硬件支持,ZigBee则为CC2530提供实现复杂网络功能的能力。这种软硬结合使得CC2530成为ZigBee应用中的主流选择之一。

2.2 CC2530的开发环境

CC2530官方推荐的开发环境是 IAR Embedded Workbench(IAR EW8051)

CC2530的开发环境:IAR Embedded Workbench

IAR Embedded Workbench(简称IAR)是开发CC2530的主要集成开发环境(IDE)。它是一款专业的嵌入式软件开发工具,提供了编辑、编译、调试和优化等功能,广泛支持各种嵌入式微控制器平台,包括基于8051内核的CC2530。IAR针对低功耗和无线设备开发进行了深度优化,特别适合CC2530这类资源有限的嵌入式芯片。

IAR支持德州仪器的ZigBee协议栈(如Z-Stack),并提供了配套的调试工具和编译器,使开发者能够轻松集成ZigBee协议、编写应用代码和调试固件。此外,IAR具有良好的代码优化能力,能有效减少CC2530有限内存的占用,提高程序运行效率。


为什么使用IAR开发CC2530

使用IAR开发CC2530主要是由于以下原因:

  1. 官方支持 德州仪器推荐使用IAR开发CC2530,因为其ZigBee协议栈(如Z-Stack)是专门为IAR优化的,许多示例代码和参考项目直接在IAR环境中运行,减少了开发者的移植工作。
  2. 代码优化能力强 IAR的编译器提供了高效的代码优化功能,包括针对代码大小和运行速度的优化选项。对于资源受限的CC2530(如闪存128 KB和RAM 8 KB),IAR可以显著减小二进制文件大小,让更多复杂功能得以实现。
  3. 调试工具完善 IAR集成了强大的调试工具,支持CC2530的片上调试功能(On-Chip Debugging)。通过与TI的调试硬件(如CC Debugger)配合,开发者可以实时查看和控制程序运行状态,进行断点设置、变量监控和性能分析。
  4. 多功能集成 IAR提供了丰富的功能模块,如静态分析、运行时调试和内存分析工具。这些功能特别适合复杂协议栈(如ZigBee)的开发,帮助开发者迅速定位和解决问题。

IAR与Keil的区别

Keil也是一款非常流行的嵌入式开发工具,但在开发CC2530时,IAR相比Keil具有以下显著区别:

  1. 官方适配支持 TI官方的ZigBee协议栈和示例项目主要为IAR设计,Keil并没有直接支持这些协议栈。因此,使用Keil开发CC2530需要进行额外的移植工作,而IAR则可以开箱即用。
  2. 编译器优化效果 IAR的编译器在优化代码大小方面普遍优于Keil,这对于资源有限的CC2530尤为重要。在存储和性能受限的情况下,IAR可以更高效地利用芯片资源。
  3. 协议栈复杂度支持 ZigBee协议栈本身较为复杂,对编译器和开发环境的要求较高。IAR对复杂嵌入式协议的支持更为成熟,而Keil的侧重点更多在通用8051开发。
  4. 工具链兼容性 IAR与CC2530配套的调试工具(如CC Debugger)无缝集成,调试体验更流畅。Keil在支持TI调试硬件方面不够完善,可能需要第三方工具或插件进行适配。

IAR是CC2530开发的首选环境,其强大的优化能力、完善的调试功能和与ZigBee协议的高兼容性,使得开发者能够更加高效地完成项目。而Keil尽管也支持8051平台,但在CC2530开发中的表现和适配性稍逊一筹。

2.3 IAR新建工程的步骤

cke_7563.png

cke_9122.png

cke_11192.png

cke_13353.png

cke_15573.png

cke_17867.png

cke_20226.png

cke_22692.png

cke_25210.png

cke_27807.png

cke_30467.png

cke_33238.png

cke_36070.png

cke_38994.png

cke_41952.png

cke_45011.png

cke_48139.png

cke_51345.png

cke_54408.png

cke_57795.png

cke_61236.png

cke_64772.png

cke_68405.png

三、代码设计

代码的含义看中文注释,这里不再单独写文字介绍代码含义。

3.1 main.c

/****************************************************************************
* 文 件 名: main.c
* 描    述: 将采集到的温湿度通过串口发送到串口调试助手上显示 9600 8N1
****************************************************************************/
#include <ioCC2530.h>
#include <string.h>
#include "UART.H" 
#include "DHT11.H" 

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{  
    uchar temp[3]; 
    uchar humidity[3];   
    uchar strTemp[13]="Temperature:";
    uchar strHumidity[10]="Humidity:";
    
    Delay_ms(1000);          //让设备稳定
    InitUart();              //串口初始化
    while(1)
    {         
        memset(temp, 0, 3);
        memset(humidity, 0, 3);
        
        DHT11();             //获取温湿度

        //将温湿度的转换成字符串
        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(3000);  //延时,2S读取1次 
    }
}

3.2 DHT11.c

#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define DATA_PIN P0_7

//温湿度定义
uchar ucharFLAG,uchartemp;
uchar shidu_shi,shidu_ge,wendu_shi,wendu_ge=4;
uchar ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L,ucharcheckdata;
uchar ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_temp,ucharRH_data_L_temp,ucharcheckdata_temp;
uchar ucharcomdata;

//延时函数
void Delay_us() //1 us延时
{
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");    
    asm("nop");
    asm("nop");
    asm("nop");    
    asm("nop"); 
}

void Delay_10us() //10 us延时
{
  #if 0  
  Delay_us();
  Delay_us();
  Delay_us();
  Delay_us();
  Delay_us();
  Delay_us();
  Delay_us();
  Delay_us();
  Delay_us();
  Delay_us();  
  #else
    int i = 10;
    while(i--);  
#endif  
}

void Delay_ms(uint Time)//n ms延时
{
    unsigned char i;
    while(Time--)
    {
        for(i=0;i<100;i++)
            Delay_10us();
    }
}

//温湿度传感
void COM(void)    // 温湿写入
{     
    uchar i;         
    for(i=0;i<8;i++)    
    {
        ucharFLAG=2; 
        while((!DATA_PIN)&&ucharFLAG++);
        Delay_10us();
        Delay_10us();
        Delay_10us();
        uchartemp=0;
        if(DATA_PIN)uchartemp=1;
        ucharFLAG=2;
        while((DATA_PIN)&&ucharFLAG++);   
        if(ucharFLAG==1)break;    
        ucharcomdata<<=1;
        ucharcomdata|=uchartemp; 
    }    
}

void DHT11(void)   //温湿传感启动
{
    DATA_PIN=0;
    Delay_ms(19);  //>18MS
    DATA_PIN=1; 
    P0DIR &= ~0x80; //重新配置IO口方向
    Delay_10us();
    Delay_10us();                        
    Delay_10us();
    Delay_10us();  
    if(!DATA_PIN) 
    {
        ucharFLAG=2; 
        while((!DATA_PIN)&&ucharFLAG++);
        ucharFLAG=2;
        while((DATA_PIN)&&ucharFLAG++); 
        COM();
        ucharRH_data_H_temp=ucharcomdata;
        COM();
        ucharRH_data_L_temp=ucharcomdata;
        COM();
        ucharT_data_H_temp=ucharcomdata;
        COM();
        ucharT_data_L_temp=ucharcomdata;
        COM();
        ucharcheckdata_temp=ucharcomdata;
        DATA_PIN=1; 
        uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp);
        if(uchartemp==ucharcheckdata_temp)
        {
            ucharRH_data_H=ucharRH_data_H_temp;
            ucharRH_data_L=ucharRH_data_L_temp;
            ucharT_data_H=ucharT_data_H_temp;
            ucharT_data_L=ucharT_data_L_temp;
            ucharcheckdata=ucharcheckdata_temp;
        }
        wendu_shi=ucharT_data_H/10; 
        wendu_ge=ucharT_data_H%10;
        
        shidu_shi=ucharRH_data_H/10; 
        shidu_ge=ucharRH_data_H%10;        
    } 
    else //没用成功读取,返回0
    {
        wendu_shi=0; 
        wendu_ge=0;
        
        shidu_shi=0; 
        shidu_ge=0;  
    } 
    
    P0DIR |= 0x80; //IO口需要重新配置 
}

四、总结

通过CC2530单片机与DHT11传感器的结合,系统实现了对环境温湿度的实时采集与数据输出。利用DHT11的数字化接口和CC2530的强大功能,整个设计结构简洁、通信稳定,满足了环境监测的基本需求。同时,采用串口调试助手进行数据输出与分析,为开发和调试提供了便捷的工具。

该系统的设计不仅充分利用了CC2530的资源优势,还体现了DHT11在成本、功耗和易用性方面的特点。将传感器直接接入CC2530的GPIO端口,结合灵活的软件设计,实现了快速部署和功能扩展的可能性,为类似的物联网项目提供了参考。

这种硬件与软件相结合的方案展示了物联网设备开发的高效路径。在满足基础监测功能的同时,系统的扩展性也为后续接入更多传感器或通信模块奠定了基础。未来,结合无线传输功能或更高精度的传感器,该设计可以进一步拓展应用场景,为环境监控和智能设备开发提供更多可能性。