采用STC89C54RD的智能家居控制系统设计

采用STC89C54RD的智能家居控制系统设计

一、概述

以STC89C54RD(增强型51单片机)为核心,构建一套低成本、高可靠性的智能家居控制系统。系统集成环境监测、设备控制、安防报警、人机交互四大功能,支持本地按键/LCD操作和远程手机APP控制,适用于家庭、办公室等小型场景的智能管控。

二、系统架构与核心功能

1. 系统架构

┌─────────────────────────────────────────────────────┐
│                智能家居控制系统架构                    │
├─────────────────────────────────────────────────────┤
│ 核心控制层:STC89C54RD单片机                         │
│  ↓  ↓  ↓  ↓  ↓                                       │
│ 环境监测层:温湿度(DHT11)、光照(BH1750)、烟雾(MQ-2)   │
│ 设备执行层:灯光(继电器)、窗帘(步进电机)、空调(继电器) │
│ 人机交互层:LCD1602显示、按键输入、蜂鸣器报警         │
│ 通信层:ESP8266(WiFi)、HC-05(蓝牙)                   │
│ 电源层:5V稳压电源、继电器驱动电路                     │
└─────────────────────────────────────────────────────┘

2. 核心功能

功能模块 实现方式
环境监测 DHT11采集温湿度(精度±2℃/±5%RH),BH1750采集光照强度(0-65535 lux),MQ-2检测烟雾浓度
设备控制 继电器控制灯光/插座(220V AC),步进电机控制窗帘开合,PWM调节空调风速
安防报警 干簧管检测门窗开关,红外热释电传感器检测人体移动,触发蜂鸣器+短信报警
人机交互 LCD1602实时显示环境数据,4×4矩阵按键设置阈值,LED指示灯显示系统状态
远程控制 ESP8266连接WiFi接入云平台(如阿里云IoT),手机APP远程查看数据/控制设备

三、硬件设计

1. 核心器件选型

器件 型号 参数/功能 接口
主控制器 STC89C54RD 8位51内核,4KB Flash,32 I/O,11.0592MHz晶振 全系统控制
温湿度传感器 DHT11 单总线,温度0-50℃(±2℃),湿度20-90%RH(±5%RH) P1.0(单总线)
光照传感器 BH1750 I2C接口,0-65535 lux,精度1 lux P1.2(SCL)/P1.3(SDA)
烟雾传感器 MQ-2 模拟输出,检测范围300-10000 ppm P3.0(ADC输入)
显示模块 LCD1602 16×2字符,5×7点阵,黄绿背光 P0(数据)/P2.0(RS)/P2.1(RW)/P2.2(EN)
执行器 5V继电器 控制220V AC设备(灯光/空调) P2.3-P2.5(低电平触发)
窗帘电机 28BYJ-48步进电机 5V驱动,减速比1:64,四相八拍 P2.6-P2.7(ULN2003驱动)
通信模块 ESP8266-01S WiFi透传,支持STA/AP模式,波特率115200 P3.1(TXD)/P3.0(RXD)
电源模块 LM7805+AMS1117 220V AC转5V/3.3V,最大输出1A 系统供电

2. 电路设计要点

(1)STC89C54RD最小系统

(2)传感器接口电路

(3)执行器驱动电路

(4)通信模块电路

四、软件设计

1. 主程序框架

#include "reg52.h"
#include "lcd1602.h"
#include "dht11.h"
#include "bh1750.h"
#include "uart.h"
#include "key.h"
#include "relay.h"
#include "stepper.h"

// 全局变量
float temp, humi, light;  // 温湿度、光照
bit mode_auto = 1;        // 1-自动模式,0-手动模式
bit alarm_flag = 0;       // 报警标志

void main() {
    System_Init();  // 系统初始化(定时器、串口、LCD、传感器)
    
    while(1) {
        // 1. 采集环境数据
        DHT11_Read(&temp, &humi);  // 读取温湿度
        light = BH1750_ReadLight();  // 读取光照
        
        // 2. 显示数据到LCD
        LCD_ShowString(0, 0, "T:");
        LCD_ShowNum(2, 0, (int)temp, 2);
        LCD_ShowChar(4, 0, '.');
        LCD_ShowNum(5, 0, (int)(temp*10)%10, 1);
        LCD_ShowString(6, 0, "C H:");
        LCD_ShowNum(8, 0, (int)humi, 2);
        LCD_ShowString(10, 0, "%");
        
        LCD_ShowString(0, 1, "Lux:");
        LCD_ShowNum(4, 1, (int)light, 5);
        
        // 3. 自动模式控制逻辑
        if(mode_auto) {
            Auto_Control();  // 根据阈值控制设备
        }
        
        // 4. 处理按键输入
        Key_Process();
        
        // 5. 通信处理(接收APP指令)
        UART_Process();
        
        // 6. 安防检测
        Security_Check();
        
        DelayMs(1000);  // 1秒刷新一次
    }
}

2. 核心模块驱动代码

(1)DHT11温湿度读取

#include "dht11.h"

sbit DHT11_PIN = P1^0;

// 读取温湿度
void DHT11_Read(float *temp, float *humi) {
    uint8_t buf[5];
    uint8_t i;
    
    // 主机发送起始信号
    DHT11_PIN = 0;
    DelayMs(18);  // 拉低18ms
    DHT11_PIN = 1;
    DelayUs(30);  // 拉高30us
    
    // 等待DHT11响应
    if(DHT11_PIN == 0) {
        while(DHT11_PIN == 0);  // 等待低电平结束
        while(DHT11_PIN == 1);  // 等待高电平结束
        
        // 读取40位数据
        for(i=0; i<5; i++) {
            buf[i] = DHT11_ReadByte();
        }
        
        // 校验数据
        if(buf[0]+buf[1]+buf[2]+buf[3] == buf[4]) {
            *humi = buf[0] + buf[1]/10.0;  // 湿度整数部分+小数部分
            *temp = buf[2] + buf[3]/10.0;  // 温度整数部分+小数部分
        }
    }
}

(2)BH1750光照读取(I2C)

#include "bh1750.h"
#include "i2c.h"

sbit SCL = P1^2;
sbit SDA = P1^3;

// 初始化BH1750
void BH1750_Init() {
    I2C_Start();
    I2C_WriteByte(0x46);  // 器件地址+写
    I2C_WriteByte(0x01);  // 上电
    I2C_Stop();
    DelayMs(10);
    
    I2C_Start();
    I2C_WriteByte(0x46);
    I2C_WriteByte(0x10);  // 连续高分辨率模式
    I2C_Stop();
}

// 读取光照强度
uint16_t BH1750_ReadLight() {
    uint8_t high, low;
    uint16_t light;
    
    I2C_Start();
    I2C_WriteByte(0x47);  // 器件地址+读
    high = I2C_ReadByte(1);  // 读高8位,ACK
    low = I2C_ReadByte(0);   // 读低8位,NACK
    I2C_Stop();
    
    light = (high<<8) | low;
    return light / 1.2;  // 转换为lux(BH1750输出单位为1.2 lux/LSB)
}

(3)ESP8266 WiFi通信(串口透传)

#include "uart.h"

// 串口初始化(波特率115200)
void UART_Init() {
    TMOD |= 0x20;  // T1工作方式2(8位自动重装)
    TH1 = 0xFD;    // 11.0592MHz晶振,波特率115200
    TL1 = 0xFD;
    TR1 = 1;       // 启动T1
    SM0 = 0; SM1 = 1;  // 串口方式1
    REN = 1;       // 允许接收
    EA = 1; ES = 1;  // 开总中断和串口中断
}

// 串口中断服务函数(接收APP指令)
void UART_ISR() interrupt 4 {
    if(RI) {
        RI = 0;
        uint8_t cmd = SBUF;
        Process_CMD(cmd);  // 处理指令(如开关灯、调温度)
    }
}

// 发送数据到APP
void UART_SendString(char *str) {
    while(*str) {
        SBUF = *str++;
        while(!TI); TI = 0;
    }
}

3. 自动控制逻辑(阈值控制)

// 自动模式控制函数
void Auto_Control() {
    // 光照低于50 lux开灯
    if(light < 50 && !Relay_GetState(1)) {
        Relay_Control(1, 1);  // 开灯(继电器1)
    } else if(light >= 50 && Relay_GetState(1)) {
        Relay_Control(1, 0);  // 关灯
    }
    
    // 温度高于28℃开风扇(继电器2)
    if(temp > 28 && !Relay_GetState(2)) {
        Relay_Control(2, 1);
    } else if(temp <= 26 && Relay_GetState(2)) {
        Relay_Control(2, 0);
    }
    
    // 湿度高于70%开窗通风帘(步进电机正转)
    if(humi > 70 && curtain_state != OPEN) {
        Stepper_Control(OPEN);  // 开窗帘
        curtain_state = OPEN;
    } else if(humi < 60 && curtain_state != CLOSE) {
        Stepper_Control(CLOSE); // 关窗帘
        curtain_state = CLOSE;
    }
}

参考代码 采用STC89C54RD设计的智能家居控制系统 www.youwenfan.com/contentcnt/135524.html

五、系统测试与优化

1. 测试方案

测试项目 测试方法 合格标准
传感器精度 用标准温湿度计、照度计对比DHT11/BH1750读数 误差≤±5%(温湿度)、≤±10%(光照)
继电器响应时间 按键触发继电器,用示波器测量动作延迟 延迟≤100ms
通信稳定性 手机APP发送100条指令,统计丢包率 丢包率≤1%
续航能力(电池版) 用18650电池供电,记录连续工作时间 工作时间≥24小时(低功耗模式下)

2. 常见问题解决

问题 原因分析 解决方法
DHT11读取失败 单总线时序错误或上拉电阻缺失 调整延时函数,确保4.7kΩ上拉电阻接入
BH1750数据跳变 I2C总线干扰或电源不稳 增加100Ω串联电阻,电源端并联100μF电容滤波
ESP8266连不上WiFi 波特率不匹配或WiFi密码错误 确认波特率为115200,重新配置WiFi名称和密码
步进电机堵转 驱动电流不足或机械卡滞 ULN2003输出端并联续流二极管,润滑窗帘轨道

六、扩展功能

1. 低功耗设计

2. 智能场景联动

七、总结

设计基于STC89C54RD实现了低成本、高性价比的智能家居控制系统,具有以下特点:

  1. 功能全面:集成环境监测、设备控制、安防报警、远程通信于一体;
  2. 扩展性强:预留I2C/SPI接口,可添加更多传感器(如CO₂、PM2.5);
  3. 易于部署:支持本地/远程双控制模式,适合家庭、办公室等场景。

专注于matlab/simulink,电子电路,编程