引言
本文将详细介绍如何使用STC89C51单片机设计并实现一个全自动洗衣机控制系统。该系统具备多种洗涤模式、水位检测、电机控制等功能,并通过LCD1602显示屏提供用户界面。我们将从硬件设计、软件实现和系统仿真三个方面进行全面讲解。仿真电路
系统硬件设计
1. 核心硬件组成
-
主控芯片:STC89C51单片机
-
显示模块:LCD1602液晶显示屏
-
输入设备:按键矩阵(启动/停止、模式选择等)
-
执行机构:
-
继电器控制(进水阀、排水阀)
-
直流电机(正反转控制)
-
-
传感器:
-
水位检测传感器
-
门开关检测
-
2. 硬件接口分配
// 继电器控制
sbit relay4 = P3^7;
// 蜂鸣器
sbit beep = P2^0;
// 按键接口
sbit open = P1^0; // 开机
sbit stop = P1^1; // 暂停
sbit close = P1^2; // 关门检测
sbit ye = P1^3; // 洗衣液检测
sbit set = P1^4; // 模式设置
sbit gao = P1^5; // 高水位检测
sbit state = P1^6; // 启动
// 洗衣机功能控制
sbit xidi = P1^7; // 洗涤
sbit piaoxi = P3^7; // 漂洗
sbit tuoshui = P3^6;// 脱水
// 电机控制
sbit IN0_1 = P2^3; // 方向控制
sbit IN1_1 = P2^4; // 方向控制
sbit E_1 = P2^5; // 使能端
// 状态指示灯
sbit LED1 = P3^0; // 模式1指示
sbit LED2 = P3^1; // 模式2指示
// ...其他LED指示灯
软件设计与实现
1. 系统初始化
void init() {
TMOD = 0x11; // 设置定时器0和1为工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
TH1 = (65536-50000)/256;
TL1 = (65536-50000)%256;
EA = 1; // 开总中断
ET0 = 1; // 开定时器0中断
ET1 = 1; // 开定时器1中断
}
2. 电机控制逻辑
系统实现了电机的正转、反转和停止控制:
void Motor_cw() { // 正转
IN0_1 = 1;
IN1_1 = 0;
E_1 = 0;
Delay_mous(speed1);
E_1 = 1;
Delay_moms(speed2);
}
void Motor_acw() { // 反转
IN0_1 = 0;
IN1_1 = 1;
E_1 = 0;
Delay_mous(speed1);
E_1 = 1;
Delay_moms(speed2);
}
void Motor_stop() {
E_1 = 0;
}
3. 洗涤模式实现
系统提供了5种洗涤模式:
-
棉质洗
-
羊毛洗
-
混合洗
-
快速洗
-
仅脱水
每种模式有不同的洗涤时间、漂洗时间和脱水时间参数:
// 棉质洗模式示例
if(setn == 0) {
speed1 = 1000;
speed2 = 1;
TR0 = 1;
// 洗涤阶段
if(flag_bu == 0) {
xidi = 0; piaoxi = 1; tuoshui = 1;
if(sec < 12) {
// 显示洗涤倒计时
} else {
flag_bu = 1; sec = 0;
}
}
// 漂洗阶段
if(flag_bu == 1) {
xidi = 1; piaoxi = 0; tuoshui = 1;
if(sec < 12) {
// 显示漂洗倒计时
} else {
flag_bu = 2; sec = 0;
}
}
// 脱水阶段
if(flag_bu == 2) {
xidi = 1; piaoxi = 1; tuoshui = 0;
if(sec < 12) {
// 显示脱水倒计时
} else {
flag_bu = 3; sec = 0;
}
}
}
4. 水位检测与控制
系统通过水位传感器检测水位,并在LCD上实时显示:
if(level < 100 && setn != 5) {
buzz = 1;
TR1 = 1;
lcd_write_char(13,0,(level+1)/100+0x30);
lcd_write_char(14,0,(level+1)%100/10+0x30);
lcd_write_char(15,0,(level+1)%10+0x30);
}
level = num2;
5. 定时器中断服务程序
系统使用两个定时器分别处理洗涤计时和水位检测:
void time0() interrupt 1 {
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
num++;
if(num == 20) {
num = 0;
sec++;
}
}
void time1() interrupt 3 {
TH1 = (65536-50000)/256;
TL1 = (65536-50000)%256;
num2++;
}
系统仿真与测试
1. Proteus仿真电路
在Proteus中搭建的仿真电路包括:
-
STC89C51单片机
-
LCD1602显示模块
-
按键输入电路
-
电机驱动电路
-
水位传感器模拟电路
系统资料获取: