基于单片机的洗衣机设计说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机原理及系统课程设计
专业:自动控制
班级:
姓名:
学号:
指导教师:
交通大学自动化与电气工程学院
2014年 1 月12日
基于AT89C51单片机的全自动洗衣机设计
1 设计目的及要求
1.1设计目的
洗衣机已成为人们日常生活中必不可少的一部分,但是传统的基于继电器的控制,已不能满足人们对洗衣机的要求。
因此设计了基于单片机的洗衣机控制电路系统,由单片机控制实现洗衣机的各项功能。
单片机的体积小,控制功能灵活,因此,设计出基于单片机的全自动洗衣机控制电路系统具有很强的实用性。
由于个人能力有限,所设计的洗衣机比前沿科技产品要差很远。
所以这次课程设计的主要目的在于通过亲手操作,查找资料,培养自己的分析设计能力,把这学期课程中零散的知识进行整合,将理论的知识联系到实际的生活中,在实例中深入理解一些理论知识,并从中有所收获。
1.2设计要求
模拟全自动洗衣机工作过程。
以电机替代洗衣机电机。
显示洗衣机工作的状态(进水、浸泡、洗衣、脱水、结束)。
显示工作剩余时间(洗衣程序可自定义,时间精度:秒)。
洗衣时交替正、反转。
2 设计方案及原理
2.1设计方案
利用AT89C51单片机的P0,P1,P2,P3串行口的输入输出功能,控制数码管、电动机、发光二极管的工作状态,进而模拟洗衣机的基本工作过程。
洗衣机的主要工作过程是:进水—洗涤—漂洗—换水—漂洗—换水—漂洗—换水—脱水—结束。
上述工作过程中,包含三个过程:洗涤过程、漂洗过程、脱水过程。
(1) 洗涤过程:放好待洗物,启动开关,进水阀通电,向洗衣机供水,供水结束后,洗涤电动机接通电源,通过电机不停的正转、反转,形成洗涤水对洗涤物产生强烈的翻滚作用;同时衣物之间、衣物与四周桶壁之间产生互相摩擦和撞击力,达到洗涤衣物的目的。
(2) 漂洗过程:漂洗的目的在于清除衣物上的洗涤液,因此,漂洗过程与洗涤过程的电机动作是完全相同的。
(3) 脱水过程:漂洗过程结束后,电动机停止转动,排水阀通电,打开排水阀门排水。
当排水到一定程度,满足安全条件时,脱水电动机接通,电机带动脱水桶高速旋转,利用离心力把衣服上的水从桶壁的小眼里甩出。
全部洗衣工作完成后,结束指示的LED灯点亮,表示衣物已经洗好,洗衣机就会自动停止工作。
2.2 设计原理
系统设计包括晶振和复位模块,电机驱动模块,LED显示模块,按键控制模块以及数码管显示模块五部分。
利用AT89C51单片机芯片,芯片左排引脚外接晶振和复位电路,通过74LS245锁存器连接至数码管,控制数码管稳定显示。
右排引脚外接电机驱动电路和各开关以及LED灯。
通过人工按压相应的开关,接通电机驱动电路相应的接线端子,实现电机正反转以及LED显示。
总体设计原理框图如图1所示。
图1 系统原理框图
通过对开关的操作实现选择想要进行的任何操作。
当选择好模式后进入该模式。
该模式的参数已装入在单片机中,在单片机中程序的控制下进行工作。
程序实现的主要功能是洗涤,漂洗和脱水的控制。
其中洗涤时间设初值为136s,由于洗衣过程中电机要不停的正反转,所以用P3.2和P3.3控制。
通过流经电机两端电平的高低控制电流的流向,从而改变电机的转向,实现正反转。
漂洗过程和洗涤过程较为相似,由于漂洗要多次进行,所以用进水次数标志位
flag1控制,当flag1为2,3,4时为漂洗过程。
脱水过程是在出水次数flag2的控制下进行。
当flag2为4时脱水,当脱水时间到达0后,脱水结束,洗衣结束。
上述三个过程中电机工作利用晶体管组成的驱动电路进行驱动。
3 硬件设计
3.1主要元器件
在本设计中主要使用了以下元器件:AT89C51单片机芯片、74LS245芯片、晶体振荡器、数码管、发光二极管、直流电动机、三极管。
3.2 硬件连接图
该设计主要应用80C51单片机,外接一些必要的扩展电路,构成系统电路原理图,如图2所示。
图2 硬件连接图
3.3 系统设计原理
该设计采用模块化的方法,系统原理图分为五个模块,分别为晶振和复位模块,电机驱动模块,LED显示模块,按键控制模块以及数码管显示模块。
晶振和复位模块主要通过51单片机的部振荡方式,产生原始的时钟频率。
电机驱动模块主要包含电阻、三极管放大器和一个电机,通过与51单片机的P3.0-P3.3引脚连接,用于驱动相应的洗衣、漂洗和脱水程序。
LED显示模块主要通过与51单片机的P0口8个引脚连接,当按下相应按键时,对应的LED指示灯点亮,实现对洗衣机控制过程的指示。
按键控制模块,其连接于P3口部分引脚上,实现对洗衣过程的选择及控制。
数码管显示模块,其直接与单片机的P2口相连。
4 软件设计
4.1 主程序流程图
按下K1键,洗衣机进入待命状态;当按下K2键后,洗衣机才进入工作状态。
其主程序及流程图见附录2.1。
4.2 洗涤过程流程图
电机正反转均为15s,程序及流程图见附录2.2。
4.3 漂洗过程流程图
漂洗前先打开排水阀排水5s。
然后启动电动机漂洗,一次漂洗结束后,接着判断漂洗次数即flag3的值,若flag3 为3则漂洗结束,若flag3不为3,则再次执行漂洗操作,进入下一循环。
程序及流程图见附录2.3。
5 系统仿真及实际调试
系统仿真结果图如图3所示。
图3 系统仿真结果图
6 总结
经过一个学期的时间完成了基于单片机的洗衣机控制系统的设计,本系统是基于单片机及其接口技术、计算机技术、微电子技术综合应用的设计。
实现了对洗衣机整个洗衣过程的控制包括用户参数输入、洗衣、脱水和结束演奏四个阶段。
控制系统主要由电源电路、控制电路两大模块构成。
电源电路为控制电路提供稳定的5V直流电压,为电动机提供电;控制电路负责控制洗衣机的工作过程,主要由AT89C51单片机、四位共阳数码管、按键、LED指示灯、电动机、进水排水电磁阀组成。
在系统设计中查阅了大量相关的中文和外文资料以及各芯片的厂家技术资料手册借鉴了很多前人成熟的经验。
对于以上之粗浅体会进一步的总结和提高,需要有更多的社会实践来提供,我也相信在不久的将来踏入社会,类似这样的设计绝不在少数,只要我们努力学习、勇于实践、勤学好问我们就会懂得以前不明白或不懂的道理,就会很快地成
长和成熟起来。
我也相信凭着我自强不息勇于拼搏的精神一定能够很快的适应类似设计的需要,适应这个多变的社会,充分发挥长处朝我们的方向不断前进前进再前进!
参考文献
[1] 王思明,金敏,苟军年等单片机原理及应用系统设计[M] 科学
2012:176-189
[2] 谭浩强 C程序设计(第四版) [M] 清华大学 2010:36-60
附录
附录一
源程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//***************************//
sbit mo_r=P3^2; //电机右控制线
sbit mo_l=P3^3; //电机左控制线
//****************************//
sbit key_menu=P3^4; // 菜单按键
sbit key_on=P3^5; // 开始按键
sbit key_off=P3^6; // 结束按键
sbit key_se=P3^7; // 菜单选择按键
//***************************//
sbit led_in=P0^0; // 进水指示灯
sbit led_xi=P0^1; // 洗衣指示灯
sbit led_pao=P0^2; // 泡洗指示灯
sbit led_xx=P0^3; // 脱水指示灯
sbit led_out=P0^4; // 出水指示灯
sbit led_over=P0^5; // 洗衣结束指示灯
sbit led_work=P0^6; // 电机工作指示灯
sbit other=P3^1; // 脱水电源控制开关
sbit anther=P3^0; // 洗衣电源控制开关
//******************************//
uchar code num[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//*****************************//
char sec=0; // 时间秒
char min=0; // 时间分
uchar count=0; // 中断计数
uchar flag0=0; // 洗衣机工作状态标志
uchar flag1=0; // 进水次数标志
uchar flag2=0; // 出水次数标志
uchar flag3=0; // 泡洗次数标志
uchar quan=0; // 正反转计数
//**********************************//
void delay(); // 延时函数
void in(); // 进水子程序
void out(); // 出水子程序
void over(); // 结束子程序
void xi(); // 洗衣子程序
void pao(); // 泡衣子程序
void xx(); // 脱水子程序
void on(); // 工作on处理子程序
void se(); // 显示菜单选择
void SEG_display(); // 显示时间子程序void key_scan(); // 按键扫描子程序void delay(uint i)
{
uint x,y;
for(x=i;x>0;x--)
for(y=120;y>0;y--);
}
// 工作on处理子程序
//********************************// void on()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
P0 = 0xff;
if(flag0==0)
in();
if(flag0==1)
xi();
if(flag0==2)
pao();
if(flag0==3)
xx();
if(flag0==4)
out();
}
// 结束子程序
//*********************************// void over()
{ other=0;
anther=0;
P0=0xff;
mo_r=0;
mo_l=0;
led_over=0;
EA=0;
}
// 进水子程序
//*********************************// void in()
other=0;
P0=0xff;
led_in=0;
flag1++;
mo_r=0;
mo_l=0;
min=0;
sec=8;
}
// 洗衣子程序
//*********************************// void xi()
{ anther=1;
other=0;
P0=0xff;
led_work=0;
led_xi=0;
mo_r=1;
mo_l=0;
min=1;
sec=36;
quan=0;
}
// 泡衣子程序
//*********************************// void pao()
{
anther=1;
other=0;
P0=0xff;
led_pao=0;
led_work=0;
flag3++;
mo_r=1;
mo_l=0;
min=1;
sec=35;
quan=0;
}
// 脱水子程序
//*********************************// void xx()
{ other=1;
P0=0xff;
led_xx=0;
mo_r=0;
mo_l=1;
min=0;
sec=50;
}
// 出水子程序
//*********************************// void out()
{ anther=0;
other=0;
P0=0xff;
led_out=0;
flag2++;
mo_r=0;
mo_l=0;
min=0;
sec=5;
}
// 显示菜单选择
//*********************************// void se()
{
P0=0xff;
if(flag0 >= 5)
flag0=0;
if(flag0==0)
{
led_in=0;
}
if(flag0==1)
{
led_xi=0;
}
if(flag0==2)
{
led_pao=0;
}
if(flag0==3)
{
led_xx=0;
}
if(flag0==4)
{
led_out=0;
}
}
// 菜单处理子程序
//**********************************// void menu()
{
min=0;
sec=0;
mo_r=0;
mo_l=0;
SEG_display();
while(1)
{
if(key_on==0)
{
delay(5);
if(key_on==0)
{
while(!key_on);
on();
break;
}
}
//**************************//
if(key_off==0)
{
delay(5);
if(key_off==0)
{
while(!key_off);
over();
break;
}
}
//****************************//
if(key_se==0)
{
delay(5);
if(key_se==0)
{
while(!key_se);
flag0++;
se();
}
}
}
}
// 按键扫描子程序
//*********************************// void key_scan()
{
if(key_menu==0)
{
delay(5);
if(key_menu==0)
{
while(!key_menu);
menu();
}
}
//********************************// if(key_on==0)
{
delay(5);
if(key_on==0)
{
while(!key_on);
on();
}
}
//*********************************// if(key_off==0)
{
delay(5);
if(key_off==0)
{
while(!key_off);
over();
}
}
}
// 显示子程序
//*********************************// void SEG_display()
{
P1=0x01;
P2=num[min/10];
delay(10);
P1=0x02;
P2=num[min%10];
delay(10);
P1=0x04;
P2=num[sec/10];
delay(10);
P1=0x08;
P2=num[sec%10];
delay(10);
}
// 主函数
//*********************************//
void main()
{
led_in=0;
anther=0;
other=0;
while(1)
{
SEG_display();
key_scan();
}
}
// 定时器0中断处理程序
//**********************************// void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
sec--;
if((flag0==1)||(flag0==2))
{
quan++;
switch(quan)
{
case 1:mo_r=1;mo_l=0;break;
case 10:mo_r=0;mo_l=0;break;
case 15:mo_r=0;mo_l=1;break;
case 25:mo_r=0;mo_l=0;break;
default:;
}
if(quan==30)
{
quan=0;
}
}
//**********************************//
if((sec==0)&&(min != 0))
{
min--;
sec=59;
}
//**********************************// if((sec<0)&&(min==0)&&(flag0==0)) //进水结束{
switch(flag1)
{
case 1:flag0=1;xi();break;
case 2:flag0=2;pao();break;
case 3:flag0=2;pao();break;
case 4:flag0=2;pao();break;
}
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==1)) //洗衣结束{
flag0=4;
out();
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==2)) //泡衣结束{
switch(flag3)
{
case 1:flag0=4;out();break;
case 2:flag0=4;out();break;
case 3:flag0=4;out();break;
}
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==4)) //出水结束
{
switch(flag2)
{
case 1:flag0=0;in();break;
case 2:flag0=0;in();break;
case 3:flag0=0;in();break;
case 4:flag0=3;xx();break;
}
}
//***********************************//
if((sec<0)&&(min==0)&&(flag0==3))
{ sec=0;
over();
}
}
}
附录2
附录2.1主程序
void main()
{
led_in=0;
anther=0;
other=0;
while(1)
{
SEG_display();
key_scan();
}
}
// 定时器0中断处理程序
//**********************************//
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
sec--;
if((flag0==1)||(flag0==2))
{
quan++;
switch(quan)
{
case 1:mo_r=1;mo_l=0;break;
case 10:mo_r=0;mo_l=0;break;
case 15:mo_r=0;mo_l=1;break;
case 25:mo_r=0;mo_l=0;break;
default:;
}
if(quan==30)
{
quan=0;
}
}
//**********************************//
if((sec==0)&&(min != 0))
{
min--;
sec=59;
}
//**********************************// if((sec<0)&&(min==0)&&(flag0==0)) //进水结束{
switch(flag1)
{
case 1:flag0=1;xi();break;
case 2:flag0=2;pao();break;
case 3:flag0=2;pao();break;
case 4:flag0=2;pao();break;
}
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==1)) //洗衣结束{
flag0=4;
out();
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==2)) //泡衣结束{
switch(flag3)
{
case 1:flag0=4;out();break;
case 2:flag0=4;out();break;
case 3:flag0=4;out();break;
}
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==4)) //出水结束
{
switch(flag2)
{
case 1:flag0=0;in();break;
case 2:flag0=0;in();break;
case 3:flag0=0;in();break;
case 4:flag0=3;xx();break;
}
}
//***********************************//
if((sec<0)&&(min==0)&&(flag0==3))
{ sec=0;
over();
}
}
}
附录图2.1主程序流程图2.2洗涤过程程序
void xi()
{ anther=1;
other=0;
P0=0xff;
led_work=0;
led_xi=0;
mo_r=1;
mo_l=0;
min=0;
sec=30;
quan=0;
}
附录图2.2洗涤程序流程图2.3 漂洗子程序
void pao()
{
anther=1;
other=0;
P0=0xff;
led_pao=0;
led_work=0;
flag3++;
mo_r=1;
mo_l=0;
min=0;
sec=10;
quan=0;
}
附录图2.3漂洗程序流程图。