基于51单片机全自动洗衣机设计
(仿真+程序+原理图+设计报告)
功能介绍
具体功能:
1.设置4种洗衣模式“标准”、“经济”、“单独”、“排水”。
2.分强洗和弱洗(电机转速快慢)。
3.过程分为“进水”、“漂洗”、“洗涤”、“脱水”。
4.按键控制启动、暂停、继续。
5.不同洗衣模式分成不同洗涤过程。
演示视频:
基于51单片机全自动洗衣机设计
具体过程
使用元器件:
单片机:STC89C51;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar num=0,num1=0,num2=0,num3=0,num4=0,num5=0,num6=0,flag=0,flag1=0,flag4=0,flag5=0,circle=0;
sbit ledbiaozhun=P1^0; //LED指示灯
sbit ledjingji =P1^1;
sbit leddandu =P1^2;
sbit ledpaishui =P1^3;
sbit ledqiangxi =P1^4;
sbit ledruoxi =P1^5;
sbit ledxidi =P1^6;
sbit ledpiaoxi =P1^7;
sbit ledtuoshui =P2^0;
sbit sshuiwei =P3^6; //水位开关
sbit sgai =P3^7; //盖开关
sbit paishui=P2^3; //排水阀控制
sbit jinshui=P2^2; //进水阀控制
sbit U2=P2^4;
sbit U3=P2^5;
sbit k1=P3^0; // 步进改变"标准、经济、单独、排水"四种方式
sbit k2=P3^1; //强洗、弱洗
sbit k3=P3^2; //运行、暂停和解除报替功能
void init()
{
uchar a=0,b=0,c=0;
TMOD=0x01; //T0工作于方式1
TH0=(65536-50000)/256; //定时时间50ms
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开T0中断
TR0=0; //关闭T0
EX0=1; //开外部中断0
IT0=1; //外部中断0边沿触发方式
U2=1; //电机停转
U3=1;
P0=0xff;
}
void delayms(uint xms) //延时
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void key() //控制按键
{
circle=1;
if(k1==0) //标准、经济、单独、排水按下
{
delayms(10); //延时消抖
if(k1==0) //再判
{
num++; //K1按下次数加1
if(num==4)
num=0; //等于4,按下次数清0
while(!k1); //等待按键释放
}
}
if(k2==0) //强弱选择
{
delayms(10); //延时消抖
if(k2==0) //再判
{
num1++; //按下次数加1
if(num1==2)
num1=0; //等于2,按下次数清0
while(!k2); //等待按键释放
}
}
}
void qiang() //强
{
if(flag4==0) //电机正转
{
U2=0;
U3=1;
}
if(flag4==1) //电机反转
{
U2=1;
U3=0;
}
}
void ruo() //弱
{
if(flag5==0) //电机正转
{
U2=0;
U3=1;
}
if(flag5==1) //电机反转
{
U2=1;
U3=0;
}
}
void qbiaozhun() //强标准
{
/*******洗涤********/
num=0;
num1=0;
ledbiaozhun=0;//标准洗LED亮
ledqiangxi=0; //强洗LED亮
jinshui=0; //打开进水阀
ledxidi=1; //洗涤
ledpiaoxi=1; //漂洗LED亮
ledtuoshui=1; //脱水LED亮
delayms(5000);//水位监测
jinshui=1; //关闭进水阀
ledxidi=0;
flag1=1; //
TR0=1; //启动定时器T0
while(flag==0)//flag为洗涤次数标志位
{
if(flag==0&&num2==1)
{
TR0=1;
flag1=1; //
qiang();
}
if(flag==0&&num2==2)
{
TR0=0; //关闭定时器T0
U2=1; //电机停止
U3=1;
}
};
//漂洗
U2=1;
U3=1;
TR0=0;
flag1=0;
paishui=0; //排水
ledtuoshui=1;
ledpiaoxi=1;
ledxidi=1;
delayms(5000);
paishui=1; //关闭排水
delayms(100);
jinshui=0; //打开进水
delayms(5000);
jinshui=1; //关闭进水
ledpiaoxi=0;
flag1=2;
TR0=1;
num3=0;
num4=0;
while(flag==1)
{
if(flag==1&&num2==1)//强漂洗
{
TR0=1;
flag1=2;
qiang();
}
if(flag==1&&num2==2)//暂停强漂洗
{
TR0=0;
U2=1;
U3=1;
}
};
//漂洗
U2=1;
U3=1;
TR0=0;
flag1=0;
paishui=0;
ledtuoshui=1;
ledpiaoxi=0;
delayms(5000);
paishui=1;
delayms(100);
jinshui=0;
delayms(5000);
jinshui=1;
flag1=2;
TR0=1;
num3=0;
num4=0;
while(flag==2)
{
if(flag==2&&num2==1)
{
TR0=1;
flag1=2;
qiang();
}
if(flag==2&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
} ;
//脱水
U2=1;
U3=1;
TR0=0;
flag1=0;
paishui=0;//打开排水
ledtuoshui=0;
ledpiaoxi=1;
while(sgai);
paishui=1;
delayms(1000);
flag1=3;
TR0=1;
num3=0;
num4=0;
while(flag==3)
{
if(flag==3&&num2==1)
{
TR0=1;
U2=0;
U3=1;
flag1=3;
}
if(flag==3&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
ledtuoshui=1;
U2=1;
U3=1;
flag1=0;
}
void qjingji() //强经济
{
/*******洗涤********/
num=0;
num1=0;
ledjingji=0;
ledqiangxi=0;
ledtuoshui=1;
ledpiaoxi=1;
ledxidi=1;
jinshui=0;
delayms(5000);
jinshui=1;
flag1=1; //控制定时器中的洗涤指示灯
TR0=1;
while(flag==0)
{
if(flag==0&&num2==1)
{
TR0=1;
flag1=1;
qiang();
}
if(flag==0&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
//漂洗
TR0=0;
U2=1;
U3=1;
flag1=0;
paishui=0;
ledjingji=0;
ledtuoshui=1;
ledxidi=1;
delayms(5000);
paishui=1;
delayms(100);
jinshui=0;
delayms(5000);
jinshui=1;
ledpiaoxi=0;
flag1=2;
TR0=1;
num3=0;
num4=0;
while(flag==1)
{
if(flag==1&&num2==1)
{
TR0=1;
flag1=2;
qiang();
}
if(flag==1&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
//脱水
TR0=0;
U2=1;
U3=1;
flag1=0;
paishui=0; //打开排水
ledjingji=0;
ledtuoshui=0;
ledpiaoxi=1;
delayms(5000);
while(sgai);
paishui=1;
delayms(1000);
flag1=3;
TR0=1;
flag=2;
num3=0;
num4=0;
while(flag==2)
{
if(flag==2&&num2==1)
{
TR0=1;
U2=0;
U3=1;
flag1=3;
}
if(flag==2&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
ledtuoshui=1;
U2=1;
U3=1;
flag1=0;
}
void qdandu() //强单独
{
num=0;
num1=0;
ledqiangxi=0;
ledxidi=0;
leddandu=0;
jinshui=0;
delayms(5000);
jinshui=1;//关闭进水阀
flag1=1;
TR0=1;
while(flag==0)
{
if(flag==0&&num2==1)
{
TR0=1;
flag1=1;
qiang();
}
if(flag==0&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
flag1=0;
U2=1;
U3=1;
}
void rbiaozhun() //弱标准
{
/*******洗涤********/
num=0;
num1=0;
ledbiaozhun=0;
ledruoxi=0;
ledtuoshui=1;
ledpiaoxi=1;
jinshui=0;
delayms(5000);
jinshui=1;
ledxidi=0;
flag1=1;
TR0=1;
while(flag==0)
{
if(flag==0&&num2==1)
{
TR0=1;
flag1=1;
ruo();
}
if(flag==0&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
//漂洗
U2=1;
U3=1;
TR0=0;
flag1=0;
paishui=0;
ledtuoshui=1;
ledxidi=1;
delayms(5000);
paishui=1;
delayms(100);
jinshui=0;
delayms(5000);
jinshui=1;
ledpiaoxi=0;
flag1=2;
TR0=1;
num3=0;
num4=0;
while(flag==1)
{
if(flag==1&&num2==1)
{
TR0=1;
flag1=2;
ruo();
}
if(flag==1&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
//漂洗
U2=1;
U3=1;
TR0=0;
flag1=0;
paishui=0;
ledtuoshui=1;
ledpiaoxi=0;
delayms(5000);
paishui=1;
delayms(100);
jinshui=0;
delayms(5000);
jinshui=1;
flag1=2;
TR0=1;
num3=0;
num4=0;
while(flag==2)
{
if(flag==2&&num2==1)
{
TR0=1;
flag1=2;
ruo();
}
if(flag==2&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
}
//脱水
U2=1;
U3=1;
TR0=0;
flag1=0;
paishui=0;
delayms(5000);
ledtuoshui=0;
ledpiaoxi=1;
while(sgai);
paishui=1;
delayms(1000);
flag1=3;
TR0=1;
num3=0;
num4=0;
while(flag==3)
{
if(flag==3&&num2==1)
{
TR0=1;
U2=0;
U3=1;
flag1=3;
}
if(flag==3&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
ledtuoshui=1;
U2=1;
U3=1;
flag1=0;
}
void rjingji() //弱经济
{
/*******洗涤********/
num=0;
num1=0;
ledjingji=0;
ledruoxi=0;
ledtuoshui=1;
ledpiaoxi=1;
ledxidi=1;
jinshui=0;
delayms(5000);
jinshui=1; //打开进水阀,进水
flag1=1;
TR0=1;
while(flag==0)
{
if(flag==0&&num2==1) //弱经济洗
{
TR0=1;
flag1=1;
ruo();
}
if(flag==0&&num2==2) //弱经济洗暂停
{
TR0=0;
U2=1;
U3=1;
}
};
//漂洗
TR0=0;
U2=1;
U3=1;
flag1=0;
paishui=0; //排水阀打开
ledjingji=0;
ledtuoshui=1;
ledxidi=1;
delayms(5000);
paishui=1; //排水阀关闭
delayms(100);
jinshui=0; //进水阀打开
delayms(5000);
jinshui=1; //进水阀关闭
ledpiaoxi=0;
flag1=2;
TR0=1;
num3=0;
num4=0;
while(flag==1)
{
if(flag==1&&num2==1)//漂洗
{
TR0=1;
flag1=2;
ruo();
}
if(flag==1&&num2==2)//漂洗暂停
{
TR0=0;
U2=1;
U3=1;
}
};
//脱水
TR0=0;
U2=1;
U3=1;
flag1=0;
ledjingji=0;
ledtuoshui=0;
ledpiaoxi=1;
paishui=0; //排水阀打开
delayms(5000);
while(sgai);
paishui=1;
delayms(3000);
flag1=3;
TR0=1;
num3=0;
num4=0;
while(flag==2)
{
if(flag==2&&num2==1)
{
TR0=1;
U2=0;
U3=1;
flag1=3;
}
if(flag==2&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
ledtuoshui=1;
U2=1;
U3=1;
flag1=0;
}
void rdandu() //弱单独
{
num=0;
num1=0;
ledruoxi=0;
ledxidi=0;
leddandu=0;
jinshui=0; //打开进水阀,进水
delayms(5000);
jinshui=1;
flag1=1;
TR0=1; //启动定时器T0
while(flag==0)
{
if(flag==0&&num2==1) //弱单独洗
{
TR0=1;
flag1=1;
ruo();
}
if(flag==0&&num2==2)//弱单独洗暂停
{
TR0=0;
U2=1;
U3=1;
}
};
flag1=0;
U2=1;
U3=1;
}
void dpaishui() //排水/脱水
{
num=0;
num1=0;
ledpaishui=0;
ledtuoshui=0;
jinshui=1;
paishui=0;
delayms(3000);
while(sgai);
delayms(3000);
flag1=3;
TR0=1;
num3=0;
num4=0;
while(flag==0)
{
if(flag==0&&num2==1) //脱水
{
TR0=1;
flag1=3;
U2=0;
U3=1;
}
if(flag==0&&num2==2)//暂停脱水
{
TR0=0;
U2=1;
U3=1;
}
};
U2=1;
U3=1;
flag1=0;
ledtuoshui=1;
paishui=1; 排水阀关闭
}
按键功能要求
(1)通过“K1”键步进改变“标准、经济、单独、排水”四种方式,执行相应的程序。对应指示灯亮。
(2)通过“K2”键步进改变“强洗、弱洗”两种方式,执行相应的程序,对应指示灯亮。
(3)通过“K3”键控制洗衣机运行、暂停和解除报警功能。
方式功能选择要求
(1)标准方式:进水—> 洗涤 —> 排水 —> 进水 —> 漂洗 —> 排水 —>进水 —> 漂洗—> 排水 —> 脱水。
(2)经济方式:进水 —> 洗涤 —> 排水 —> 进水 —> 漂洗 —> 排水 —> 脱水。
(3)单独方式:进水 —> 洗涤。
(4)排水方式:排水 —> 脱水。
流程图:
设计资料
01 仿真图
本设计使用proteus7.8和proteus8.9两个版本设计,向下兼容,无需担心!具体如图!
02 原理图
本系统原理图为PDF版,具体如图!
03 程序
本设计使用软件keil4和keil5两个版本编程设计,无需担心!具体如图!
04 设计报告
四千字设计报告,具体如下!
05 设计资料
资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)、设计报告等。具体内容如下,全网最全! !
资料获取请观看前面演示视频!
点赞分享一起学习成长。