51单片机入门实战视频教程 温湿度传感器数据采集

最近在自学51单片机,想用温湿度传感器做数据采集的实验,但遇到几个问题:1. 视频教程里用的DHT11传感器,我手头只有SHT20,程序需要做哪些修改?2. 采集到的数据通过串口发送到电脑时总是乱码,波特率设置的是9600,还需要检查哪些地方?3. 有没有完整的电路连接图可以参考?我的传感器供电和单片机引脚连接总是不稳定。4. 想用LCD1602显示温湿度数据,但程序编译一直报错,求一个能直接用的例程。哪位大神能帮忙解答一下?

3 回复

作为屌丝程序员,推荐以下学习路径:

首先,你需要了解51单片机的基本原理和开发环境搭建。可以看哔哩哔哩上“51单片机入门到精通”这类免费资源。

对于温湿度传感器的数据采集,DHT11是比较适合初学者的。先从淘宝买块开发板如伟纳智创,集成了按键、LED和温湿度接口,方便练习。

重点代码如下:

#include <reg52.h>

sbit DHT11_PIN = P2^0;

unsigned char humidity_high, humidity_low, temperature_high, temperature_low;
unsigned char checksum;

void delay_ms(unsigned int ms) {
    while(ms--);
}

void read_dht11_data() {
    unsigned char i;
    DHT11_PIN = 0;   // 拉低总线
    delay_ms(20);    // 等待至少18ms
    DHT11_PIN = 1;   // 拉高总线
    delay_ms(40);    // 主机拉高20-40us后释放总线
    if(!DHT11_PIN) { // 等待从机拉低
        delay_ms(80);
        if(DHT11_PIN) {
            // 读取数据
            for(i=0;i<5;i++) {
                for(j=0;j<8;j++) {
                    while(!DHT11_PIN); // 等待数据位开始
                    delay_ms(40);
                    checksum |= DHT11_PIN << j;
                }
            }
        }
    }
}

记得结合实验板实际调试,遇到问题可去51hei论坛求助。坚持实践,你会很快掌握的!


作为一个屌丝程序员,我可以分享一些学习思路。对于51单片机入门,建议先掌握基本硬件结构和C语言编程。温湿度传感器常用DHT11或DHT22,可以搭配51单片机实现数据采集。

推荐的视频教程可以从哔哩哔哩等平台找,关键词“51单片机 温湿度采集”。这类课程通常会教你如何连接电路、初始化传感器、读取数据并显示。

具体步骤如下:首先搭建电路,将温湿度传感器接到单片机IO口;其次编写代码初始化串口,用于数据传输;然后编写读取传感器的程序,最后通过串口助手查看结果。记得注意延时函数的使用,因为传感器需要一定响应时间。

学习时多动手实践,遇到问题去论坛搜索解决方法,比如AVR单片机吧或者嵌入式开发相关社区。坚持下去就能掌握这项技能啦。

51单片机温湿度传感器数据采集入门教程

基本概念

51单片机(如STC89C52)可以通过温湿度传感器(如DHT11)采集环境数据。DHT11是一款常见的数字式温湿度传感器,使用单总线通信协议。

硬件连接

DHT11与51单片机连接方式:

  • VCC → 5V
  • DATA → P2.0(或其他IO口)
  • GND → GND
  • 数据线需要接上拉电阻(4.7K-10K)

代码实现

#include <reg52.h>
#include <intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit DHT11 = P2^0;

void Delay10us() {
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}

void Delay20ms() {
    u16 i;
    for(i=0; i<2000; i++);
}

u8 DHT11_Init() {
    u8 ret = 0;
    DHT11 = 1;
    Delay10us();
    DHT11 = 0;
    Delay20ms();
    DHT11 = 1;
    Delay10us();
    Delay10us();
    Delay10us();
    Delay10us();
    if(!DHT11) {
        Delay10us();
        Delay10us();
        Delay10us();
        Delay10us();
        if(DHT11) {
            ret = 1;
        }
    }
    while(DHT11);
    return ret;
}

u8 DHT11_ReadByte() {
    u8 i, dat = 0;
    for(i=0; i<8; i++) {
        while(!DHT11);
        Delay10us();
        Delay10us();
        Delay10us();
        dat <<= 1;
        if(DHT11) {
            dat |= 1;
        }
        while(DHT11);
    }
    return dat;
}

void DHT11_ReadData(u8 *temp, u8 *humi) {
    u8 buf[5];
    u8 i;
    
    if(DHT11_Init()) {
        for(i=0; i<5; i++) {
            buf[i] = DHT11_ReadByte();
        }
        if((buf[0]+buf[1]+buf[2]+buf[3]) == buf[4]) {
            *humi = buf[0];
            *temp = buf[2];
        }
    }
}

void main() {
    u8 temperature, humidity;
    
    while(1) {
        DHT11_ReadData(&temperature, &humidity);
        // 这里可以添加显示代码或串口发送代码
        Delay20ms(); // 两次采集间隔至少2秒
    }
}

学习建议

  1. 先从理解DHT11的单总线通信协议开始
  2. 注意时序要求,特别是延时函数的准确性
  3. 调试时可先通过串口输出采集的数据
  4. 成功后可以连接LCD1602等显示模块实时显示数据

需要更详细的视频教程的话,可以在B站或YouTube搜索"51单片机 DHT11",有许多不错的实战教学视频。

回到顶部