采用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最小系统
- 晶振电路:11.0592MHz晶振+2×30pF瓷片电容(P3.4/P3.5)
- 复位电路:10kΩ上拉电阻+10μF电解电容(高电平复位)
- 电源滤波:0.1μF瓷片电容并联在VCC/GND间,抑制高频干扰
(2)传感器接口电路
- DHT11单总线:数据线接P1.0,串联4.7kΩ上拉电阻至VCC
- BH1750 I2C:SCL接P1.2,SDA接P1.3,VCC接3.3V(需电平转换)
- MQ-2模拟输出:OUT接P3.0(STC89C54RD内置ADC,需外接10kΩ分压电阻)
(3)执行器驱动电路
- 继电器控制:P2.3-P2.5接继电器线圈,线圈两端反向并联1N4007续流二极管
- 步进电机驱动:28BYJ-48接ULN2003达林顿阵列,ULN2003输入接P2.6-P2.7
(4)通信模块电路
- ESP8266-01S:TXD接P3.1(STC89C54RD RXD),RXD接P3.0(STC89C54RD TXD),VCC接3.3V(需独立供电)
四、软件设计
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. 低功耗设计
- 休眠模式:无操作时,STC89C54RD进入空闲模式(功耗≤5mA),按键唤醒
- 传感器间歇工作:DHT11/BH1750每5分钟采集一次数据(非实时模式)
- 太阳能供电:增加5V/10W太阳能板+锂电池,实现离网运行
2. 智能场景联动
- 回家模式:手机APP发送“回家”指令,自动开灯、开空调、开窗帘
- 离家模式:一键关闭所有设备,布防安防系统(门窗传感器+红外探测)
- 睡眠模式:22:00后自动关窗帘、调暗灯光、空调设为26℃
七、总结
设计基于STC89C54RD实现了低成本、高性价比的智能家居控制系统,具有以下特点:
- 功能全面:集成环境监测、设备控制、安防报警、远程通信于一体;
- 扩展性强:预留I2C/SPI接口,可添加更多传感器(如CO₂、PM2.5);
- 易于部署:支持本地/远程双控制模式,适合家庭、办公室等场景。