51单片机自动洗衣机控制系统副本文档格式.docx
《51单片机自动洗衣机控制系统副本文档格式.docx》由会员分享,可在线阅读,更多相关《51单片机自动洗衣机控制系统副本文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
本题主要是实现一种较为简单的全自动洗衣机的控制。
设计的关键在于单片机的控制,即整个单片机的控制程序的编写。
同时也要注意单片机输出端与受控对象的硬件电路设计问题。
控制系统主要由电源电路、单片机控制系统和外部硬件电路构成。
电源采用三端集成固定稳压器7805提供+5V电源,单片机控制系统负责控制洗衣机的工作过程,主要由AT89S51单片机、2位7段共阳数码管、按键、蜂鸣器、LED指示灯组成;
外部硬件电路有继电器、三极管、电动机、进水电磁阀、排水电磁阀组成。
进水部分没有采用传感器,而是采用定时器控制进水阀,通过不同的进水时间来实现低、中、高的水位控制。
三、方案设计说明
3.1洗衣程序
⑴.洗涤过程
通电后,若不设置洗衣时间和水位要求,则洗衣机默认洗涤三分钟,水位要求为低,从洗涤过程开始。
进入洗涤过程,首先进水阀接通,开始向洗衣机供水,当到达要求水位时,进水阀断电关闭,停止进水;
电机M接通,波轮按正转5秒、反转5秒,正、反转之间停3秒的规律不断循环转动,直至达到设定时间停止。
⑵.漂洗过程
洗涤过程结束之后进入漂洗过程,与洗涤过程操作相同,只是时间短一些,漂洗时间为2分钟。
⑶.脱水过程
漂洗过程结束后,电机M停止转动,排水阀M接通,开始排水。
排水阀动作,排水阀排水一分钟后,排水阀停止工作,电机M开始正转,带动内桶高速旋转,甩干衣物,时间也为一分钟。
洗衣机工作流程如图3.1所示:
图3.1洗衣机流程图
3.2控制系统的电路组成
该电路主要组成部件是由AT89S51单片机、指示灯、电动机、蜂鸣器、电控水龙头、LED显示灯、及3只控制按键组成。
其组成如图3.2所示。
电动机有两个控制端,一端控制电动机正转且该端与P2.0相连,另一端控制电动机的反转且该端与P2.1相连。
电控水龙头共两个,一个为进水水龙头且受P1.6的控制,另一个为排水水龙头而受P1.7的控制,当电控水龙头的控制端为“0”时水龙头打开,当电控水龙头的控制端为“1”时水龙头关闭。
显示器通过74HC573编码与单片机相连,采用动态显示显示洗涤时间。
蜂鸣器有由P3.5控制,当P3.5输出为“1”时蜂鸣器发声,洗涤结束时发出提示音。
本设计采用11.0592MHz的晶体振荡器定时器0和定时器1的设置为每隔50ms产生一次中断,用于水位、洗涤、脱水和排水的定时。
图3.2洗衣机控制系统总体电路图
四、单元电路设计说明
4.1电源电路
单片机系统电源部分的电气原理图如图4.1所示。
市电220V经过变压器T变压为12V交流电,再通过4只二极管全桥整流,经过电容C9、C10滤波得到光滑的直流电压后,经过三端稳压管(7805)稳压得到稳定的+5V电压给各器件供电。
图4.1电源部分电路图
4.2单片机控制电路
AT89S51单片机作为控制部件,该型号单片机共有40个引脚采用双列直插式的,下面是各个引脚的功能:
(1)输入/输出口线
P0.0~P0.7P0口的8位双向口线。
P1.0~P1.7P1口的8位双向口线;
内部具有上拉电阻。
P2.0~P2.7P2口的8位双向口线;
P3.0~P3.7P3口的8位双向口线;
还具有第二功能见表4-2-1。
表4-2-1P3口的第二功能
口线
第二功能
信号名称
P3.0
RXD
串行数据接收
P3.1
TXD
串行数据发送
P3.2
INT0
外部中断0的申请
P3.3
INT1
外部中断1的申请
P3.4
T0
定时器/计数器0计数输入
P3.5
T1
定时器/计数器1计数输入
P3.6
WR
外部RAM写选通
P3.7
RD
外部RAM读选通
2)控制信号线
RST---复位输入信号高电平有效,用以完成单片机的复位初始化操作。
EA/Vpp---外部程序存贮器访问允许信号/编程电压输入端,当EA信号为低电平时,对ROM的读操作限定在外部程序存储器;
当EA信号为高电平时,对ROM的读操作是从内部程序存储器开始的,并可延至外部程序存储器。
PSEN---低电平有效,可实现对外部ROM单元的读操作。
ALE/PROG---低字节地址锁存信号/编程脉冲输入端
3)电源和外部晶振引脚
Vcc---电源电压输入引脚
GND---电源地
XAL1、XTAL2---外部晶振引脚
4)存储器的分配
AT89S51的内部共有256个数据存储单元,通常把这256个单元按其功能划分为两部分:
低128单元和高128单元,其中低128个单元供用户暂存中间数据,可读可写,掉电后数据会丢失;
高128个单元被专用寄存器占用。
其中内部数据存储器的分配情况如图4.2所示:
图4.2数据存储器的分配情况图
4.3单片机的时钟电路
时钟电路由晶振元件与单片机内部电路组成,产生的振荡频率为单片机提供时钟信号,供单片机信号定时和计时。
在AT89S51单片机内部有一个高增益反相放大器,其输入端引脚为XTAL1,其输出端为XTAL2。
只要在两引脚之间跨接晶体振荡器和微调电容C4、C5,就可以构成一个稳定的自激振荡器。
本设计采用图4.3所示电路。
一般地,电容C1和C2取33pf左右;
晶体振荡器,简称晶振,频率范围是1.2~12MHz。
晶振频率越高,系统的时钟频率也就越高,单片机的运行速度也就越快。
在通常情况下,使用振荡频率为6MHz或12MHz的晶振。
如果系统中使用了单片机的串行口通信,则一般使用频率为11.0592MHz的晶振。
而在本次设计中采用的是频率为11.0592MHz的晶振。
图4.3单片机时钟电路
4.4显示电路
显示模块由发光二极管和LED显示器组成。
LED(LightEmitingDiode)是发光二极管英文名称的缩写。
本次设计中我们采用发光二极管主要是用来指示洗衣机的工作状态。
5个发光二极管分别跟单片机的P1口的5个I/O口连接,分别用来显示不同的洗衣机工作状态,如图4.4.1所示。
当发光二极管的负极所对应的P1口为低电平时,发光二极管导通。
图4.4.1LED显示电路
2.LED显示器是由发光二极管构成的,所以在显示器前面冠以“LED”。
本次设计只是显示时间,所以采用LED显示器就可以达到目的了。
如图4.4.2所示:
图4.4.2LED显示电路图
本次设计中我们采用的是2位共阳极数码管,其中段码线占用1个8位I/O口,即为P0口,而位选占用2个I/O口,在P2.6和P2.7口。
由于各位的段码线并联,8位I/O口输出的段码对各个显示位来说都是相同的。
因此,在同一时刻,如果各位位选都处于选通状态的话,2位LED将显示相同的字符。
若要各位LED能够显示出与本位相应的显示字符,就必须采用动态显示,即在某一时刻,只让一位的位选线处于选通状态,而其他各位的位选处于关闭状态,同时,段码线上输出相应位要显示的字符段码。
这样,在同一时刻,2位LED中只有选通的那位显示字符,而其他1位则是熄灭的。
同样,在下一时刻,只让下一位的位选处于选通状态,而其他各位的位选线处于关闭状态,在段码线上输出将要显示字符的段码,则同一时刻,只有选通位显示出相应的字符,而其他各位都是熄灭的。
如此循环下去,就可以使各位显示出将要显示的字符。
虽然这些字符是在不同时刻出现的,而在同一时刻,只有一位显示,其他各位熄灭,但由于LED显示器的余辉和人眼的视觉暂留作用,只要每位显示间隔足够短,则可以造成多位同时亮的假象,达到同时显示的效果。
4.5蜂鸣器报警电路
本设计采用无源蜂鸣器,单片机必须输出固定频率的方波信号,其工作电压范围宽,4-12V,需要外围元件少,电压增益可调范围为20-200。
通过CPU的P3.5输出高电平来控制蜂鸣器报警。
如图4.5所示:
图4.5蜂鸣器电路
4.6电动机的控制电路
1.继电器的作用
继电器是在自动控制电路中起控制与隔离作用的执行部件,它实际上是一种可以用低电压、小电流来控制高电压、大电流的自动开关。
2.电动机控制电路的工作原理
电动机M控制部分的电气原理图如图4.6所示。
电动机有两个控制端,一端控制电机正传该端与P2.0相连,另一端控制电机反转该端与P2.1相连。
系统供电时交流220V电压经过继电器加在电动机的两个控制端。
当洗衣机接到“正转”指令时P2.0输出高电平经过R2、Q4使得继电器RL1线圈得电导通RL1,从而使得电机正转。
当洗衣机接到“反转”的指令时P2.1输出高电平经过R3、Q5使得继电器RL2线圈得电导通RL2,从而使得电机反转。
图4.6电机控制电路
4.7进水/排水电路
如图4.7所示,进水阀受P1.6的控制,出水阀受P1.7的控制。
当电控水龙头的控制端P1.6为“0”时,RL4线圈得电使得进水阀打开。
当电控水龙头的控制端P1.7为“0”时,RL3线圈得电使得出水阀打开。
图4.7进/出水电路图
4.8按键电路
如图4.8所示,按键未按下时单片机P1.5-7均为高电位,有按键按下时,相应的单片机端口就能检测到低电位,从而完成按键的检测。
图4.8按键电路
5、软件设计
5.1主程序设计
根据硬件设计要求控制主程序流程图如图5.1所示。
洗衣机通电之后单片机上电首先进行程序的初始化以及各参数初值的设定。
默认洗衣时间为3分钟,水位为低水位。
然后扫描按键的状态确定洗衣过程。
当发现启动键按下洗衣机从待命状态进入工作状态。
完成进水、洗涤、排水、脱水、提醒的循环过程。
当洗衣结束时控制蜂鸣器发声。
图5.1主程序流程图
5.2洗涤程序的设计
洗涤是洗衣过程中的主要步骤。
当进水结束后进入洗衣状态,洗衣开始,电动机正转-停止-反转一直循环,当洗衣时间等于零时,洗衣结束且进入排水。
程序流程图如图5.2所示:
图5.2洗涤程序流程图
5.3脱水程序的设计
脱水前先打开排水阀排水。
然后启动电动机脱水并保持排水阀开启,然后停止脱水,并且蜂鸣器报警提醒用户洗衣完成。
程序流程图如图5.3所示:
图5.3脱水程序流程图
附整个洗衣程序
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;
sbitwela=P2^7;
sbitkey1=P1^5;
sbitkey2=P1^6;
sbitkey3=P1^7;
ucharcodetalbe[]={//编码LED0-12
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c};
voiddelayms(uint);
//延时子程序
voidkeyscan();
//按键扫描
voidwash(uint,uint);
//洗涤子程序
voiddisplay(uint);
//显示子程序
voidwater(uint);
//进水子程序
voiddry();
//脱水子程序
voidmain()
{
while
(1)
{
keyscan();
while((time*60)>
0)//洗涤过程
{
(time*60)--;
}
P2^3=0;
//打开排水阀
delayms(30000)
delayms(30000)//延时1分钟
P2^3=1;
//关闭排水阀
dry();
//脱水过程
beep();
//蜂鸣提示洗衣结束
}
}
voiddelayms(uintxms)//延时约xms
{
uinti,j;
for(i=xms;
i>
0;
j--);
}
voidbeep()
P1^0=1;
//运行灯熄灭
P1^1=0;
//点亮结束指示灯
P1^2=1;
//关闭水位指示灯
P1^3=1;
P1^4=1;
P3^5=1;
//蜂鸣器启动
voiddisplay(uint)//显示子函数
ucharshiwei,gewei;
shiwei=time%10;
//取时间的十位
gewei=time/10//取时间的个位
whlie
(1)
dula=1;
P0=table[shiwei];
//送十位段选数据
dula=0;
P0=0xff;
//送位选数据前关闭所有显示,防止打乱显示
wela=1;
P0=0xfe;
//送位选数据
wela=0;
delayms(20);
//延时
P0=table[gewei];
//送十位段选数据
P0=0xfd;
voiddry()
uintnum;
TMOD=0x11;
//设置定时器0为工作方式1
TH0=(65536-45872)/256;
//装初值11.0592M晶振定时50ms数为45872
TL0=(65536-45872)%256;
EA=1;
//开总中断
ET0=1;
//开定时器0中断
TR0=1;
//启动定时器0
P2^3=0;
//打开排水阀
P2^0=1;
//开电机正转线圈
voidT0()interrupt1
TH0=(65536-45872)/256;
//重装初值
TL0=(65536-45872)%256;
num++;
if(num==1200)//1分钟后关闭线圈
P2^0=0;
voidkeyscan()
uintx=2,time=3;
if(key1==0)
delayms(10);
if(key1==0)
water(x);
P1^0=0;
//运行灯点亮
if(key2==0)//检查洗涤时间设置
if(key2==0)
time=time+1;
if(time>
12)//最长洗涤时间为12分钟
time=3;
display(time);
if(key3==0)//检查水位设置
if(key2==0);
x=x+1;
P1^(x)=0;
if(x==4)
x=2;
voidwash(uinttime,uintx)
uintnum1,num2;
//设置定时器0为工作方式1,定时器1为工作方式1
//电机正转
while((time*60)>
0)//等待发生
(time*60)--;
num1++;
if(num1==100)//5s
//电机停止正转
ET1=1;
//开定时器1中断
TR1=1;
//启动定时器1
voidT1()interrupt3
num2++;
if(num2==60)//3s
P2^1=1;
//电机反转
voidwater(uintx)//进水子程序
P2^2=0;
//开进水阀
switch(x)
case2:
if(num==1000)//进水50s
{
P2^2=1;
//进水阀关闭低水位
}
break;
case3:
if(num==2000)//进水100s
//进水阀关闭中水位
case4:
if(num==3000)//进水150s
//进水阀关闭高水位
六、调试过程出现的问题
调试的时候,电机可以按照要求正常运转,水位控制也正常,但是7段数码管显示乱码。
经过检查,排除硬件的问题,进而将矛头转向程序。
经过仔细检查,发现在每次送完段选数据后,没有关闭P0口,造成原来保持在P0口的段选数据立即通过位选锁存器直接加在数码管上,在数码管高速显示状态下,数码管就出现显示混乱的现象了。
加上“P0=0xff”之后,再送入位选数据,就不会出现7段数码管显示混乱的现象了。
七、体会与总结
通过本次《运动控制》的实训——洗衣机的控制设计,收获主要为一下几个方面:
(1)、对洗衣机的控制流程有了深刻的认识;
(2)、对于单片机如何控制电机有了更深刻的了解;
(3)、巩固了C语言的知识,尤其是单片机定时器中断方面,认识到C语言对于单片机的编程的重要性;
(4)、巩固了Protues、Keil、Office等专业必备软件的基本操作使用知识;
(5)、通过解决该设计过程中出现的问题,加强了自己独立分析解决问题的能力。
参考文献
《新概念51单片机C语言教程》郭天祥编著电子工业出版社
《西门子PLC开发入门与典型实例》海心马银忠编著人民邮电出版社
《基于单片机的洗衣机智能控制系统》
《MCS-51单片机原理及应用实例》南建辉等编著清华大学出版社