0 卖盘信息
BOM询价
您现在的位置: 首页 > 电子资讯 >基础知识 > STM8单片机读取DHT11温湿度传感器

STM8单片机读取DHT11温湿度传感器

来源:
2024-12-30
类别:基础知识
eye 20
文章创建人 拍明芯城

STM8单片机读取DHT11温湿度传感器

一、引言

随着物联网技术的发展,各类传感器在智能家居、气象监测、环境监控等领域得到了广泛的应用。温湿度传感器是其中重要的一类传感器,它能够实时检测环境的温度和湿度数据。DHT11是一款常见的数字式温湿度传感器,具有体积小、功耗低、价格便宜等优点,广泛应用于气象站、智能家居、仓库环境监控等场景。STM8系列单片机作为ST公司推出的一款低功耗、高性能的微控制器,广泛应用于工业控制、家居自动化和物联网设备中。本篇文章将详细介绍如何使用STM8单片机读取DHT11温湿度传感器的数据,包括硬件连接、软件编程及其实现原理。

image.png

二、DHT11温湿度传感器介绍

DHT11是一款数字式温湿度传感器,通过单线数字信号输出温湿度数据。它内部集成了温度和湿度的传感器单元、A/D转换器、单片机控制电路等,因此用户只需读取其输出的数字信号即可获得对应的温度和湿度值。

DHT11的主要参数:

  • 测量范围:温度:0-50°C,湿度:20%-90% RH

  • 精度:温度±2°C,湿度±5% RH

  • 输出形式:单总线数字信号

  • 工作电压:3.5V至5.5V

DHT11通过单总线协议与主控设备(如STM8单片机)通信,通过一根数据线发送温湿度数据。数据传输时,数据包包含温度、湿度的整数和小数部分,以及校验和。

三、STM8单片机概述

STM8单片机是意法半导体(STMicroelectronics)推出的一系列8位微控制器,具有丰富的外设、低功耗和高性价比的特点。STM8单片机采用STM8内核,支持多种通信协议,包括I2C、SPI、UART等,且具有多个定时器、PWM输出、模拟输入等功能。STM8系列单片机广泛应用于家庭自动化、工业控制、汽车电子等领域。

STM8系列单片机的关键特点:

  • 内核:8位,时钟频率最大可达24MHz

  • 内存:多种内存配置,从1KB Flash到64KB Flash不等

  • 外设:支持I2C、SPI、UART、GPIO等多种外设接口

  • 功耗:低功耗设计,适合电池供电应用

四、硬件连接

要使用STM8单片机读取DHT11温湿度传感器,首先需要完成硬件连接。DHT11传感器的工作电压为3.5V至5.5V,而STM8单片机一般工作在3.3V或5V电压下。为了简化接线和避免电压不匹配,我们可以直接将DHT11传感器的VCC脚连接到STM8的5V引脚,GND脚连接到STM8的GND引脚,数据脚连接到STM8的GPIO引脚(如PA0)。

DHT11的引脚说明:

  1. VCC:电源引脚,接5V电源

  2. GND:地引脚,接地

  3. DATA:数据引脚,传输温湿度数据

  4. NC:未连接

硬件连接如下:

  • DHT11 VCC → STM8 5V引脚

  • DHT11 GND → STM8 GND引脚

  • DHT11 DATA → STM8 GPIO引脚(如PA0)

此外,DHT11传感器与STM8单片机之间通过单总线协议进行数据通信,因此,数据线连接的GPIO引脚需要支持数字输入输出(如PA0、PB0等)。在接线过程中,建议在DHT11的数据引脚和STM8的数据引脚之间串联一个4.7kΩ的上拉电阻,以确保数据传输的稳定性。

五、软件设计

STM8单片机读取DHT11传感器的数据需要通过GPIO引脚与DHT11进行通信。DHT11通过一种特殊的单总线协议与外部设备交换数据,数据传输包括以下几个步骤:发送起始信号、传输温湿度数据、校验和校验。我们将逐步解析如何通过STM8单片机编写程序来完成这一过程。

1. 初始化

在程序开始时,我们首先需要初始化STM8的GPIO引脚。以PA0为数据传输引脚,我们需要将其配置为输出模式,并发送一个起始信号来启动数据传输。

// 初始化GPIO引脚为输出模式
GPIO_Init(GPIOA, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);
2. 发送起始信号

DHT11传感器要求主机发送一个至少18ms的低电平信号,作为起始信号。在STM8单片机上,我们可以通过延时函数实现这一要求。

// 发送起始信号,拉低PA0引脚18ms
GPIO_ResetBits(GPIOA, GPIO_PIN_0);
Delay_ms(20); // 延时20ms
GPIO_SetBits(GPIOA, GPIO_PIN_0); // 拉高PA0引脚
3. 等待DHT11响应

DHT11传感器收到起始信号后,会等待一定时间并响应。它会通过将数据引脚拉低80微秒,然后再拉高80微秒的方式向主机发送响应信号。我们需要用STM8单片机检测DHT11的响应信号。

// 等待DHT11响应信号
GPIO_Init(GPIOA, GPIO_PIN_0, GPIO_MODE_IN_FL_NO_IT); // 配置PA0为输入模式
while (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_0) == RESET); // 等待引脚从低电平变为高电平
4. 读取数据

DHT11通过一系列的高低电平脉冲传输8位数据。每个数据位由一个50微秒的高电平和一个可变长度的低电平组成。如果低电平的时长大于26微秒,表示该位为1,否则为0。我们需要用定时器或延时函数来测量低电平的时长,判断每一位的数据。

uint8_t ReadByte(void) {
   uint8_t byte = 0;
   for (int i = 0; i < 8; i++) {
       // 等待低电平结束
       while (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_0) == RESET);
       
       // 等待高电平
       TimerStart();
       while (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_0) == SET);
       
       // 计算高电平时长,判断是0还是1
       if (TimerElapsed() > 40) { // 判断高电平持续时间
           byte |= (1 << (7 - i)); // 设置为1
       }
   }
   return byte;
}
5. 校验和

DHT11数据传输完成后,会发送一个校验和,校验和是前面传输的湿度和温度数据字节按位相加的低8位。我们需要对接收到的数据进行校验,确保数据的正确性。

uint8_t checksum = humidity1 + humidity2 + temperature1 + temperature2;
if (checksum != checksum_received) {
   // 校验失败,重新读取数据
}
6. 完整程序

完整的程序代码包括初始化、数据传输、数据读取和校验等部分。通过程序,我们可以实现从DHT11传感器读取温度和湿度数据,并在串口输出。

#include "stm8s.h"

// 延时函数
void Delay_ms(uint16_t ms) {
   while (ms--) {
       for (int i = 0; i < 1000; i++);
   }
}

// 读取数据
uint8_t ReadByte(void) {
   uint8_t byte = 0;
   for (int i = 0; i < 8; i++) {
       // 等待低电平结束
       while (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_0) == RESET);
       
       // 等待高电平
       TimerStart();
       while (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_0) == SET);
       
       // 计算高电平时长,判断是0还是1
       if (TimerElapsed() > 40) {
           byte |= (1 << (7 - i));
       }
   }
   return byte;
}

int main(void) {
   uint8_t humidity1,uint8_t humidity2, temperature1, temperature2, checksum;
   
   // 初始化GPIO
   GPIO_Init(GPIOA, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST); // 配置PA0为推挽输出
   while (1) {
       // 发送起始信号
       GPIO_ResetBits(GPIOA, GPIO_PIN_0); // 拉低PA0
       Delay_ms(20); // 延时20ms,DHT11要求至少18ms
       GPIO_SetBits(GPIOA, GPIO_PIN_0); // 拉高PA0
       
       // 等待DHT11响应
       GPIO_Init(GPIOA, GPIO_PIN_0, GPIO_MODE_IN_FL_NO_IT); // 配置PA0为输入
       while (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_0) == RESET); // 等待PA0从低电平变为高电平
       while (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_0) == SET); // 等待高电平结束
       
       // 读取湿度数据
       humidity1 = ReadByte();
       humidity2 = ReadByte();
       
       // 读取温度数据
       temperature1 = ReadByte();
       temperature2 = ReadByte();
       
       // 读取校验和
       checksum = ReadByte();
       
       // 校验数据
       if (checksum == (humidity1 + humidity2 + temperature1 + temperature2)) {
           // 输出温度和湿度数据
           printf("Humidity: %d.%d%%, Temperature: %d.%d°C ", humidity1, humidity2,
           temperature1, temperature2);
       } else {
           // 校验和错误,重新读取
           printf("Data error, retrying... ");
       }
       
       // 延时1秒钟
       Delay_ms(1000);
   }
}

六、程序解析

在上述代码中,我们进行了如下操作:

  1. GPIO初始化:

    • 我们将STM8的PA0引脚设置为推挽输出模式,用来发送信号给DHT11。

    • 在接收数据时,将PA0设置为输入模式,读取DHT11传输的数据。

  2. 发送起始信号:

    • 通过将PA0拉低并保持20ms以上,我们向DHT11传感器发送起始信号。这是DHT11开始数据传输的必要条件。

  3. 等待DHT11响应:

    • DHT11在收到起始信号后,会先将数据线拉低80μs,然后拉高80μs,表示准备好传输数据。程序通过检测PA0的电平变化来判断DHT11是否准备好响应。

  4. 读取数据:

    • DHT11通过一系列高低电平脉冲传输8位数据。每个数据位的传输方式是:首先一个50μs的高电平,然后紧接着一个长度可变的低电平。若低电平时间超过26μs,则表示这一位是1;否则是0。

    • 为了确保数据的正确性,我们读取湿度、温度和校验和数据。

  5. 数据校验:

    • 在读取到湿度、温度和校验和数据后,我们通过计算湿度和温度字节之和,来验证数据的有效性。如果校验和匹配,说明数据正确,可以进行后续处理;如果校验和不匹配,则重新获取数据。

  6. 输出数据:

    • 如果数据验证成功,程序会通过串口输出温湿度数据。在此程序中,我们通过printf函数将结果打印到终端或调试工具。

  7. 延时:

    • 为了防止频繁读取,程序每隔1秒重新读取一次DHT11传感器数据。

七、常见问题及解决方案

在实际应用中,可能会遇到一些常见的问题,如数据不准确、无法读取数据或校验和错误等。以下是一些常见问题及解决方案:

  1. 数据传输不稳定:

    • 如果数据传输过程中出现丢包或错误,可能是因为传感器与STM8之间的连线不稳定。检查数据线的连接,确保DHT11的VCC和GND引脚正确连接,并且数据引脚没有松动。

    • 在数据线和STM8之间添加一个4.7kΩ的上拉电阻,这对于确保稳定的数据传输非常重要。

  2. 数据校验失败:

    • 如果校验和验证失败,可能是由于DHT11传输过程中发生了干扰或数据丢失。在这种情况下,可以尝试增加延迟时间,或通过软件重试机制来确保数据完整性。

  3. 读取速度过快:

    • DHT11每次读取后需要一定时间的冷却期。通常,DHT11每秒只能提供一次测量数据,因此不建议每隔太短的时间读取传感器数据。增加读取间隔时间可以提高稳定性。

  4. 温湿度数据不准确:

    • DHT11的精度较低,尤其在高湿度或低温度环境中,测量的准确度可能会有所下降。如果需要更高精度的温湿度数据,可以考虑使用其他传感器,如DHT22。

八、总结

本篇文章详细介绍了如何使用STM8单片机读取DHT11温湿度传感器的数据。我们从硬件连接、软件编程、数据读取到数据校验等方面进行了详细的讲解。STM8单片机通过GPIO引脚与DHT11传感器进行单总线通信,完成了温湿度数据的获取与校验,并通过串口输出到终端。

在实际应用中,DHT11传感器具有较低的精度和测量范围,适合用于一些低成本的项目。若需要更高精度的温湿度数据,可以考虑使用DHT22、SHT21等更高性能的传感器。通过掌握这项技术,您可以将STM8单片机与各种传感器连接,构建更多智能应用,提升物联网项目的效果和效率。


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

资讯推荐
云母电容公司_云母电容生产厂商

云母电容公司_云母电容生产厂商

开关三极管13007的规格参数、引脚图、开关电源电路图?三极管13007可以用什么型号替代?

开关三极管13007的规格参数、引脚图、开关电源电路图?三极管13007可以用什么型号替代?

74ls74中文资料汇总(74ls74引脚图及功能_内部结构及应用电路)

74ls74中文资料汇总(74ls74引脚图及功能_内部结构及应用电路)

芯片lm2596s开关电压调节器的中文资料_引脚图及功能_内部结构及原理图_电路图及封装

芯片lm2596s开关电压调节器的中文资料_引脚图及功能_内部结构及原理图_电路图及封装

芯片UA741运算放大器的资料及参数_引脚图及功能_电路原理图?ua741运算放大器的替代型号有哪些?

芯片UA741运算放大器的资料及参数_引脚图及功能_电路原理图?ua741运算放大器的替代型号有哪些?

28nm光刻机卡住“02专项”——对于督工部分观点的批判(睡前消息353期)

28nm光刻机卡住“02专项”——对于督工部分观点的批判(睡前消息353期)

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
拍明
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告