CC2530之DHT11温湿度测量

  DHT11数字温湿度传感器内部含一个电阻式感湿元件和一个NTC(Negative Temperature Coefficient,负温度系数)测温元件,与一个高性能8位单片机相连接。采用单线制串行接口,通信接口简单,具有小体积、低功耗、响应速度快等优点。实物图如下图所示:

DHT11实物图

需注意的是:湿度测量量程为20-90%RH,精度+-5%RH;温度测量量程为0~50℃,精度+-2℃(精度有点差,个人不喜欢用^-^)。

1. 接口说明:
  建议连接线长度小于20米时采用5K的上拉电阻,大于20米根据实际情况选择合适的上拉电阻。典型应用电路如下图所示:
DHT11与MCU连接图

2. 程序编写说明:
  DHT11与MCU通讯采用单总线数据格式,一次传输5字节即40位数据,高位在先。具体数据格式如下(当前小数部分留作扩展,现读出为零):
8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。

  若数据传送正确,则(8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据)所得结果的末8bit与8bit校验和相等。通信过程如下图所示:

这里写图片描述

  MCU控制相关引脚产生一个大于18ms的负脉冲为一个起始信号,DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。  

这里写图片描述

  若总线线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后。然后总线被拉高,当总线被拉低时,准备发送数据。每一bit数据都以50us低电平时隙开始,高电平持续时间的长短决定了数据位是0还是1(26~28μs为数据0,70μs为数据1)。
    

3. 测试程序如下:

#define DHT11_SDA   P0_0

void delay_us(void);
void delay_10us(void); 
void delay_ms(uint Time);


uchar datBuf[5] = {0};  // 存储5字节的数据 

/**
 * DHT11数据读取
 * @return 读取成功返回1    
 */
uchar dht11ReadDat()
{
    uchar i, tmp = 0, WAIT_FLAG = 0, checkOut = 0;

    P0DIR |= 0x01;  // 设置为输出模式
    DHT11_SDA = 0;
    delay_ms(19);   // 总线拉低时间大于18ms为起始信号
    DHT11_SDA = 1;
    P0DIR &= ~0x01;   // 设置为输入模式
    delay_10us();  delay_10us();  delay_10us();  delay_10us();  // 延时等待20~40us,等待从机响应信号

    if (!DHT11_SDA) {
        WAIT_FLAG = 2;
        while ((!DHT11_SDA) && WAIT_FLAG++);  // 等待高电平信号结束,开始接收数据
        if (WAIT_FLAG == 1)  return 0;  // 等待超时,退出本次操作
        WAIT_FLAG = 2;
        while (DHT11_SDA && WAIT_FLAG++);  

       for (i=0; i<40; i++) {
            WAIT_FLAG = 2;
            while ((!DHT11_SDA) && WAIT_FLAG++);   // 等待下一位数据开始发送 
            delay_10us();  delay_10us();  delay_10us(); 
            tmp = 0;
            if(DHT11_SDA) tmp = 1;  // 延时30us后仍为高电平,则为数据1
            WAIT_FLAG = 2;
            while (DHT11_SDA && WAIT_FLAG++);  // 等待高电平结束
            if(WAIT_FLAG == 1)  break;  // 等待超时,退出本次操作
            datBuf[i/8] <<= 1;
            datBuf[i/8] |= tmp;
        }

        P0DIR |= 0x01;  // 设置为输出模式
        DHT11_SDA = 1;

        for (i=0; i<4; i++) {
            checkOut += datBuf[i];
        }    
        if (checkOut == datBuf[4]) {
            return 1;  // 数据校验正确
        }
        else 
          return 0;
    } 
    else 
        return 0;
}

void delay_us(void) 
{
    asm("nop"); asm("nop"); asm("nop"); asm("nop");
    asm("nop"); asm("nop"); asm("nop"); asm("nop");    
    asm("nop");
}

void delay_10us(void) 
{
    delay_us(); delay_us(); delay_us(); delay_us(); delay_us();
    delay_us(); delay_us(); delay_us(); delay_us(); delay_us();
}

void delay_ms(uint Time)
{
    uchar i;
    while (Time--) {
        for(i=0; i<100; i++)
        delay_10us();
    }
}
  • 9
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是基于CC2530芯片和DHT11温湿度传感器的示例代码: ```c #include "ZComDef.h" #include "OSAL.h" #include "OSAL_PwrMgr.h" #include "ZGlobals.h" #include "AF.h" #include "APS.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h" #include "OnBoard.h" #include "hal_lcd.h" #include "hal_led.h" #include "hal_key.h" #include "hal_uart.h" #include "dht11.h" #define DHT11_PIN P0_4 // 定义消息类型 #define DHT11_READ_EVT 0x01 // 定义延时函数 void delay_ms(uint16 ms) { halMcuWaitMs(ms); } // 定义事件处理函数 UINT16 devEventLoop(devStates_t state, UINT16 events) { if (events & SYS_EVENT_MSG) { uint8 *msgPtr; while ((msgPtr = osal_msg_receive(AppTaskID)) != NULL) { switch (((osal_event_hdr_t *)msgPtr)->event) { case DHT11_READ_EVT: // 读取温湿度数据 dht11_read_data(DHT11_PIN); // 发送数据到串口 halUARTWrite(HAL_UART_PORT_0, (uint8 *)dht11_get_data_str(), strlen(dht11_get_data_str())); osal_start_timerEx(AppTaskID, DHT11_READ_EVT, 5000); break; } osal_msg_deallocate(msgPtr); } return (events ^ SYS_EVENT_MSG); } return 0; } // 定义主函数 void main(void) { // 初始化系统 halBoardInit(); osal_init_system(); // 初始化DHT11传感器 dht11_init(DHT11_PIN); // 注册事件处理函数 ZDO_RegisterForZDOMsg(AppTaskID, ZDO_NWK_DEVICE_IND); ZDO_RegisterForZDOMsg(AppTaskID, ZDO_STATE_CHANGE); // 开始读取数据 osal_start_timerEx(AppTaskID, DHT11_READ_EVT, 5000); // 进入循环 osal_start_system(); } ``` 该代码使用了dht11库,需要自行下载并添加到工程中。同时,也需要将CC2530DHT11连接好才能正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值