51单片机自动洗衣机控制系统.docx

上传人:b****5 文档编号:30017084 上传时间:2023-08-04 格式:DOCX 页数:24 大小:113.67KB
下载 相关 举报
51单片机自动洗衣机控制系统.docx_第1页
第1页 / 共24页
51单片机自动洗衣机控制系统.docx_第2页
第2页 / 共24页
51单片机自动洗衣机控制系统.docx_第3页
第3页 / 共24页
51单片机自动洗衣机控制系统.docx_第4页
第4页 / 共24页
51单片机自动洗衣机控制系统.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

51单片机自动洗衣机控制系统.docx

《51单片机自动洗衣机控制系统.docx》由会员分享,可在线阅读,更多相关《51单片机自动洗衣机控制系统.docx(24页珍藏版)》请在冰豆网上搜索。

51单片机自动洗衣机控制系统.docx

51单片机自动洗衣机控制系统

项目一

洗衣机控制

一、项目内容及要求。

内容:

设自动洗衣机的控制要求是:

启动后先开启进水阀进水,水位到达设定值后关闭,然后波轮按正转5秒、反转5秒,正、反转之间停3秒的规律不断循环转动,直至达到设定时间停止,之后打开排水阀放水,水放完后洗衣桶旋转脱水,1分钟后停止并关闭排水阀,洗衣过程结束。

要求水位设置不少于高、中、低三档,洗衣时间在3——12分钟范围内可调,以1分钟为单位,排水时间定为1分钟。

运动执行器用指示灯模拟,水位用开关模拟,试设计该洗衣机的控制电路。

要求:

⑴画出控制系统的框图,说明系统方案设计的思路、理由或依据;

⑵选择、确定组成控制系统的各个单元,并阐述选择确定的原则或依据;

⑶画出完整的电气原理图,介绍整体电路的工作原理、性能或特点;

⑷如采用单片机控制,给出单片机程序的流程图和清单,说明程序的工作原理。

⑸制作实物电路,验证设计、制作是否正确。

二、题目分析及设计思路。

1.技术要点:

①要对自动洗衣机的整个流程要清楚,要清楚哪些步骤比较重要。

对于洗衣机优先级最高的应该是暂停这个功能。

因为一旦当洗衣机盖子被打开或者发生什么意外情况,洗衣机必须马上停止工作,这也是出于对安全问题的考虑。

②洗衣机在洗衣的过程中波轮按正转5秒、反转5秒,正、反转之间停3秒的规律不断循环转动,直至达到设定时间停止。

当到了设定的时间以后洗衣机便要进入下一个的洗衣流程。

③设置洗衣机时间和水位必须要显示结果,方便用户查看。

④单片机程序中的设计洗剂时间这些要做到比较精确,这样才能保证洗衣机能将衣服洗的比较干净。

⑤水位设置的处理,因为考虑到身边没有水位传感器,这里我用限时的方法来完成低、中、高三个水位的设置。

⑥进水和出水的电磁阀我这里都是用LED灯显示来代替了,进水和出水我会将对应的LED点亮来表示进水和出水。

三、方案设计说明。

本系统实现了对洗衣机整个洗衣过程的控制,包括用户参数输入、洗衣、排水和脱水等阶段。

控制系统主要由电源模块、单片机控制系统和外部硬件电路构成。

电源采用三端集成固定稳压器7805提供+5V电源,单片机控制系统负责控制洗衣机的工作过程,主要由AT89S51单片机、2位共阳数码管、按键、LED指示灯组成;外部硬件电路有继电器、三极管、电动机。

 

1、按键 

洗衣机面板上有5个按钮K1、K2、K3、K4、K5。

 

K1为水位设置。

 

K2洗剂时间设定。

 

K3启动。

 

K4停止(模拟洗衣机的盖板,盖板打开时洗衣机将停止工作)。

K5返回。

 

2、 洗衣过程

⑴洗涤过程 

通电后,只要用户对水位和洗剂时间设定后,按下启动按钮,洗衣机就进入了洗剂过程。

首先进水阀LED灯点亮,开始向洗衣机供水,当到达要求水位时,进水阀LED熄灭,停止进水;电机M接通,带动波轮旋转,形成洗衣水流。

电机M是一个正反转电机,可以形成往返水流,有利于洗涤衣物。

⑵排水过程 

电机停止转动,排水阀的LED指示灯点亮。

这里会有一分钟的排水时间。

⑶脱水过程 

洗涤或排水过程结束后,排水阀LED接通,开始脱水。

排水阀动作的同时,电机M也接通,此时电机是朝着一个方向高速的旋转,使电机可以带动内桶转动。

从而将衣服上的水脱掉。

3、设计总体方框图

四、单元设计说明。

1、单片机的时钟电路、和复位电路。

时钟电路

时钟电路由晶振元件与单片机内部电路组成,产生的振荡频率为单片机提供时钟信号,供单片机信号定时和计时。

 

在AT89S51单片机内部有一个高增益反相放大器,其输入端引脚为XTAL1,其输出端为XTAL2。

只要在两引脚之间跨接晶体振荡器和微调电容C1、C2,就可以构成一个稳定的自激振荡器。

本设计采用如图所示电路。

 

一般地,电容C1和C2取33pf左右;晶体振荡器,简称晶振,频率范围是1.2~12MHz。

晶振频率越高,系统的时钟频率也就越高,单片机的运行速度也就越快。

在通常情况下,使用振荡频率为6MHz或12MHz的晶振。

如果系统中使用了单片机的串行口通信,则一般使用频率为11.0592MHz的晶振。

而在本次设计中采用的是频率为11.0592MHz的晶振。

单片机上电自动复位电路

上电复位是利用电容充电来实现复位,其工作原理是:

上电瞬间RST端的电位与VCC相同,随着电容C3充电电流的减小,+5V的电压立即加到了RST端,该高电平使得单片机复位。

2、LED显示电路。

LED(LightEmitingDiode)是发光二极管英文名称的缩写。

本次设计中我们采用发光二极管主要是用来指示洗衣机的工作状态。

4个发光二极管分别跟单片机的P2.6、P2.7、P3.0、P3.1连接,如图3所示。

当发光二极管的阳极所对应的单片机管脚为高电平时,发光二极管导通。

3、数码管显示电路。

常用的LED为8段或7段。

每一个段对应一个发光二极管。

这种显示器有共阳极和共阴极2种。

共阴极LED显示器的发光二极管的阴极连在一起,通常此公共阴极接地。

当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。

同样,共阳极LED显示器的发光二极管的阳极连接在一起,通常此公共阳极接正电压,当某个发光二极管接低电平时,发光二极管被点亮,相应的段被显示。

为了使LED显示器显示不同的符号或数字,就要把不同段的发光二极管点亮,这样就要为LED显示器提供代码,因为这些代码可使LED相应的段发光,从而显示不同字型,因此该代码称之为段码(或称为字型码)。

4、电机正反转控制电路。

这里我采用的是利用两个12V的继电器来实现电机的正反转。

当P2.4为高电平,P2.5为低电平时NPN型的三极管Q1导通,Q2截止,电机就正转。

反过来当Q1截止,Q2导通,电机就反转。

这里采用的原理就是H桥的一个原理。

如下图。

当SW1和SW4同时导通的时候电机就会正转,当SW2和SW3同时导通的时候电机就会反转。

五、完整电路原理分析。

自动洗衣机完整电路设计图

在Proteus7.9中仿真结果。

给模块上电后上电指示灯会点亮。

说明上电正常。

分别按下水位设置开关、洗剂时间设置开关、启动开关。

洗衣机就开始自动的洗剂过程。

水位设置开关盒洗剂时间设置开关都是采用重复按来让水位循环和设置时间循环。

如果不设定水位和洗剂时间,直接按下启动开关,系统就会以默认的值来洗剂。

当打开洗剂盖板和有紧急情况的时候按下停止开关就能瞬间停止下来。

再按下返回按键,洗衣机就能继续之前的洗剂过程。

6、软件设计流程。

开始

初始化

键盘扫描

设置水位按键按下设置洗剂时间按键按下

Y

设置洗剂时间子程序

设置水位子程序

启动

启动按钮按下

洗衣程序

洗剂时间结束

排水程序

排水一分钟结束

脱水程序

脱水一分钟结束

洗衣结束

 

七、程序清单

#include

#defineucharunsignedchar

#defineuintunsignedint

//******************//

sbitmoto_r=P2^4;//电机右控制器

sbitmoto_l=P2^5;//电机左控制器

sbitkey_sw=P1^0;//水位设置

sbitkey_xjsj=P1^1;//设置漂洗时间

sbitkey_qidong=P1^2;//启动按钮

sbitdul1=P3^6;

sbitdul2=P3^7;

//******************//

sbitled_in=P2^6;//进水指示灯

sbitled_out=P2^7;//出水指示灯

sbitled_sw_h=P2^0;//高水位指示灯

sbitled_sw_m=P2^1;//中水位指示灯

sbitled_sw_l=P2^2;//低水位指示灯

sbitled_xi=P3^0;

sbitled_tuo=P3^1;

sbitwring=P2^3;//警告

sbitkey_fanhui=P1^4;

//******************//

ucharcodenum[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管显示数组

//******************//

charmin=1;//时间

ucharflag0=0;//洗衣标志

ucharflag1=0;//启动按键标志

ucharflag2=0;//出水标志

ucharflag3=0;//启动按钮的按下次数计数

ucharerro=0;//报警标志

uinta=0;

uintb=1;

uintnum0=2;

uintc;

uintd;

uinte;

uintf;

uintg;

uinth;

uinti;

uintj;

uintk;

//*********函数声明*********//

//voiddelay(uintxms);//延时函数

voidin();//进水子程序

voidout();//出水子程序

voidover();//结束子程序

voidxi();//洗衣程序

voidkey_scan();//按键扫描子程序

voidSED_display();//显示时间子程序

voidon();//工作程序

//*********延时函数*********//

voiddelay(uintxms)

{

uinti,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);

}

//*********脱水子程序*********//

voidover()

{

while(num0!

=0)

{

led_out=1;

moto_r=1;

moto_l=0;

led_tuo=1;

delay(5000);

num0--;

}

num0=2;

led_out=0;

led_tuo=0;

moto_r=0;

moto_l=0;

flag1=0;

min=1;

P0=0;

P2=0;

P3=0xFC;

EA=1;

ET0=1;

ET1=1;

EX0=1;

IT0=0;

TMOD=0x01;

dul1=0;

dul2=0;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

//*********进水子程序*********//

voidin()

{

led_in=1;

delay(5000);

led_in=0;

}

//*********出水子程序*********//

voidout()

{

while(num0!

=0)

{

led_xi=0;

moto_r=0;

moto_l=0;

led_out=1;

delay(5000);

num0--;

}

num0=2;

}

//*********洗衣子程序*********//

voidxi()

{

TR0=1;

b=min*1200;

while(flag0==0)

{

led_xi=1;

moto_r=1;

moto_l=0;

delay(5000);

moto_r=0;

moto_l=0;

delay(3000);

moto_r=0;

moto_l=1;

delay(5000);

moto_r=0;

moto_l=0;

delay(3000);

}

}

//*********中断子程序*********//

voidT0_time()interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

b=b-1;

if(b==0)

{

led_xi=0;

moto_r=0;

moto_l=0;

led_sw_h=0;

led_sw_m=0;

led_sw_l=0;

flag0=1;

TR0=0;

}

}

//*********中断子程序*********//

voidINT_0()interrupt0

{

TR0=0;

EX0=0;

c=moto_r;

d=moto_l;

e=led_sw_h;

f=led_sw_m;

g=led_sw_l;

h=led_xi;

i=led_tuo;

j=led_in;

k=led_out;

led_sw_h=0;

led_sw_m=0;

led_sw_l=0;

led_xi=0;

led_tuo=0;

led_in=0;

led_out=0;

moto_r=0;

moto_l=0;

while

(1)

{

if(key_fanhui==0)

{

delay(10);

if(key_fanhui==0)

{

while(!

key_fanhui);

moto_r=c;

moto_l=d;

led_sw_h=e;

led_sw_m=f;

led_sw_l=g;

led_xi=h;

led_tuo=i;

led_in=j;

led_out=k;

}

}

}

}

//*********显示子程序*********//

voidSED_display()

{

dul1=1;

P0=num[min/10];

delay(5);

dul1=0;

dul2=1;

P0=num[min%10];

delay(5);

dul2=0;

}

//*********按键扫描子程序*********//

voidkey_scan()

{

{

if(key_sw==0)

{

delay(10);

if(key_sw==0)

{

while(!

key_sw);

a=a+1;

}

if(a==1)

{

led_sw_l=1;

}

if(a==2)

{

led_sw_m=1;

led_sw_l=0;

}

if(a==3)

{

led_sw_h=1;

led_sw_m=0;

}

if(a==4)

{

a=0;

led_sw_h=0;

}

}

//********************************/

if(key_xjsj==0)

{

delay(10);

if(key_xjsj==0)

{

while(!

key_xjsj);

min++;

SED_display();

if(min==13)

{

min=1;

}

}

}

//*********************************/

if(key_qidong==0)

{

delay(10);

if(key_qidong==0)

{

while(!

key_qidong);

flag1=1;

flag0=0;

}

}

}

}

//*********主函数*********/

voidmain()

{

P0=0;

P2=0;

P3=0xFC;

EA=1;

ET0=1;

ET1=1;

EX0=1;

IT0=1;

TMOD=0x01;

dul1=0;

dul2=0;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

while

(1)

{

key_scan();

SED_display();

if(flag1==1)

{

in();

xi();

out();

over();

}

}

}

end;

八、制作、调试情况。

遇到的问题:

1、电机的正反转电路不能正常工作,上电之后就会一直死在那里。

解决办法:

最后发现是单片机在上电的情况下所有管脚默认都是高电平,这样就会出现控制正反转电路中的两个单片机管脚就会同时是高电平。

最后是在初始化程序中将所有管脚开始的状态都强制拉为低电平才正常工作。

2、按下停止时不能一直停着,只是停了一会就自己又开始工作了。

解决办法:

最后是在按钮模块又加了一个按钮,只有当返回按钮按下的时候中断程序才会返回。

九、实训成果。

在Proteus7.9中能完整的仿真出整个的洗衣过程,经过调试没有发现什么bug。

开始设置水位和设置洗剂时间都正常。

在仿真中在洗衣的过程中也能看到电机正转正转5秒反转5秒中间停三秒的现象。

工作状态的指示灯也都能到相应的过程中点亮来指示。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1