基于51单片机的智能家居控制系统仿真设计 环境监测 实现功能: 1、通过按键可设置温湿度数据的阈值上下限,设置烟雾浓度的阈值上限 2、将温湿度传感器(DHT11)的数据实时显示在LCD上。 当温湿度数据高于上限或低于下限,触发声光报警 3、将烟雾浓度数据实时显示在LCD上。 当烟雾浓度数据高于上限时,触发声光报警 包含仿真+源码+原理图+报告 仿真软件:Proteus8.9 编程软件:Keil5 编程语言:C语言 原理图 :Altium Designer 20.2.6

最近用51单片机折腾了个智能家居控制系统,Proteus仿真效果相当带感。核心玩法就是让单片机同时盯着温湿度和烟雾浓度,超标就发警报。直接上干货,聊聊代码里那些有意思的操作。


硬件全家桶清单

  • 核心板:STC89C52老伙计
  • 传感器三兄弟:DHT11(温湿度)、MQ-2(烟雾)、电位器(模拟浓度信号)
  • 显示设备:LCD1602液晶屏
  • 交互组件:4x4矩阵按键、LED警报灯、蜂鸣器

!Proteus仿真界面


核心代码拆解

1. 按键与阈值设置

矩阵按键扫描是基本功,但保存阈值到EEPROM才是灵魂。每次设置完参数,得让单片机记住这些数值,断电也不丢失。

// 按键扫描核心代码
uint8_t KeyScan() {
    uint8_t keyVal = 0xFF;
    for(uint8_t i=0; i<4; i++) {
        ROW = ~(0x01<<i);
        if(COL1 == 0) keyVal = i*4+0;
        if(COL2 == 0) keyVal = i*4+1;
        //...省略其他列检测
    }
    return keyVal;
}

// EEPROM存储函数
void Save_Threshold() {
    IapErase(0x2000);  // 擦除扇区
    IapProgram(0x2000, tempHigh);  // 存温度上限
    IapProgram(0x2001, tempLow);
    //...其他参数类似
}

骚操作:STC的EEPROM其实是Flash模拟的,写之前必须先擦除整个扇区。曾经因为没擦直接写,数据乱飞了一下午...

2. 温湿度攻防战

DHT11这老古董对时序要求极其严格,代码里各种微妙级延时不是摆设。数据脚切输入输出模式时,记得先给高电平。

// DHT11读取函数
void DHT11_Read() {
    DQ = 0;
    delay_ms(18);   // 主机拉低18ms
    DQ = 1;
    delay_us(30);   // 等待传感器响应
    while(DQ);      // 等待低电平
    //...后续读取40位数据
}

避坑指南:如果读出来的湿度突然变成255%,检查是不是没等传感器准备好就开读。这个传感器启动需要1秒预热,急不得。

3. 烟雾浓度监测

用ADC0832做模数转换,电位器模拟烟雾浓度变化。注意模拟信号需要软件滤波,不然LCD显示会疯狂跳变。

// ADC读取函数
uint8_t Read_ADC(uint8_t ch) {
    uint8_t dat = 0;
    CLK = 0;
    DI = 1;
    //...时序生成代码
    for(i=0;i<8;i++) {
        dat <<= 1;
        if(DO) dat++;
        CLK = 1;
        delay_us(2);
        CLK = 0;
    }
    return dat;
}

调参心得:MQ-2需要预热3分钟才能稳定,仿真时直接给模拟信号省事,但真做实物得注意这个特性。

4. 报警器暴走时刻

报警逻辑简单但容易翻车——记得加状态标志位,不然会触发重复报警。

void Check_Alarm() {
    if(temp>tempHigh || temp<tempLow || smoke>smokeMax) {
        Alarm_Flag = 1;
        BEEP = 0;  // 开蜂鸣器
        LED = 0;   // 开报警灯
    } else {
        Alarm_Flag = 0;
        BEEP = 1;  // 关蜂鸣器
        LED = 1;   // 关报警灯
    }
}

血泪教训:蜂鸣器要用三极管驱动,直接接IO口小心烧芯片。仿真里随便搞,实物必翻车!


仿真翻车实录

  1. LCD显示乱码:八成是数据线接反了,或者初始化时序不对
  2. 按键设置无效:检查矩阵按键的扫描周期,太快了可能漏检
  3. 报警常响:阈值数据没正确从EEPROM读出,可能是存储地址越界了

资源大礼包

整套方案包含:

  • Proteus仿真工程文件(8.9版本)
  • Keil完整源码(C语言)
  • Altium Designer原理图
  • 万字实验报告(含电路分析)

需要源码的朋友可以戳这里[假装有个下载链接],调参时遇到玄学问题欢迎评论区交流。下期可能加个WiFi模块搞远程监控,有没有人想看?

基于51单片机的智能家居控制系统仿真设计 环境监测 实现功能: 1、通过按键可设置温湿度数据的阈值上下限,设置烟雾浓度的阈值上限 2、将温湿度传感器(DHT11)的数据实时显示在LCD上。 当温湿度数据高于上限或低于下限,触发声光报警 3、将烟雾浓度数据实时显示在LCD上。 当烟雾浓度数据高于上限时,触发声光报警 包含仿真+源码+原理图+报告 仿真软件:Proteus8.9 编程软件:Keil5 编程语言:C语言 原理图 :Altium Designer 20.2.6

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐