单片机原理及系统课程设计专业:自动控制班级:控1102姓名:学号:指导教师:兰州交通大学自动化与电气工程学院2014年1月13日基于51单片机的洗衣机设计1 设计目的、要求及原理1.1设计目的由单片机控制实现洗衣机的各项功能,单片机的体积小,控制功能灵活,因此,设计出基于单片机的全自动洗衣机控制电路系统具有很强的实用性。
用单片机设计出简单操作省水省电的洗衣机,在方便日常生活和节约资源方面都有重要意义。
由于个人能力有限,我能设计的洗衣机比前沿科技产品要差很多。
所以我这次课设的主要目的在于通过亲手操作,查找资料,培养自己的分析设计能力。
把这学期课程中零散的知识进行整合,将理论的知识联系到实际的生活中。
在实例中深入理解一些理论知识,并从中有所收获,就是意义所在。
1.2设计要求通过仿真软件模拟洗衣机的基本工作过程,如进水、洗涤、排水、漂洗、脱水等。
1.3设计方法利用89C51单片机的P0,P1,P2,P3串行输入输出功能,控制数码管、电机、发光二极管的工作状态模拟洗衣机的基本工作过程。
2 设计方案及原理2.1 设计方案洗衣机的主要工作程序是:进水—洗涤—排水—进水—漂洗—排水—脱水—排水。
上述工作程序中,主要包含三个过程,洗涤过程、漂洗过程、脱水过程。
(1) 洗涤过程:放好待洗物,启动开关,进水阀通电,向洗衣机供水,当供水达到预定时间后,进水阀断电关闭,停止供水。
洗涤电动机接通电源,带动波轮(或桶)旋转,产生各种形式的水流搅动衣物进行洗涤。
通过电动机不停的正转、反转,形成洗涤水对洗涤物产生强烈的翻滚作用。
同时,衣物之间、衣物与四周桶壁之间产生互相摩擦和撞击力,以次达到洗涤衣物的目的。
(2) 漂洗过程:漂洗的目的在于清除衣物上的洗涤液。
因此,在洗涤结束之后,换水进行漂洗。
漂洗过程与洗涤过程的电器动作是完全相同的。
为了完全漂净衣服上的洗衣粉等,所以要多次漂洗,在这次设计中漂洗次数设定为三次。
(3) 脱水过程:漂洗后,需要对衣物进行脱水以便晾干,节省水资源,所以脱水是洗衣过程中必不可少的环节。
漂洗过程结束后,电动机停止转动,排水阀通电,打开排水阀门排水。
当排水到达预定时间后,脱水电动机接通,电机带动脱水桶高速旋转,利用离心力把衣服上的水从桶壁的小眼里甩出。
全部洗衣工作完成后,表示结束的LED灯点亮,表示衣物已经洗好,洗衣机在这时就会自动停止工作。
2.2 设计原理本设计用51单片机实现对洗衣机的控制,通过功能选择开关可以选择洗衣机的工作模式。
当选择好模式后洗衣机进入相应的工作状态。
该模式的参数已装入单片机中,洗衣机在单片机中预先装入程序的控制下进行工作。
程序实现的主要功能是洗涤,漂洗和脱水的控制。
其中洗涤时间设为96s,用sec和min控制,其中sec代表分钟min代表秒。
并且通过改变它们的值可以改变洗涤时间。
用P3.2和P3.3控制电机的正反转(通过它们高低不同的电平控制电流的方向,从而改变电机的转向。
漂洗过程和洗涤过程较为相似,由于漂洗要多次进行,所以用进水次数标志位flag1控制漂洗的次数,当flag1=2、3、4时为漂洗过程。
脱水过程是在出水次数flag2的控制下进行。
当flag2=4时脱水,当脱水时间到达0后,脱水结束,洗衣结束,表示停止的指示灯亮。
图1 系统组成框图3 硬件设计3.1系统主要元器件在本设计中主要使用了以下元器件:AT89C51芯片、74LS245芯片、四数码管、发光二极管、直流电动机、三极管等。
3.2 设计原理图洗衣机的各项功能是由单片机控制实现的,单片机的体积小,控制功能灵活,因此,设计出基于单片机的全自动洗衣机控制电路系统具有很强的实用性采用5l 系列单片机作为控制核心,主要包括功能选择及控制电路、洗衣机工作状态显示及输出控制电路。
控制电机正反转以及进水阀和排水阀的开启和关闭。
如图2所示为设计原理图。
图2 硬件连接图4 软件设计4.1 主程序流程图按下K1键,洗衣机从待命状态。
当按下K2键后,51单片机通过预先装入的程序控制各引脚的状态,让洗衣机才进入工作状态,以实现进水、洗衣、排水、漂洗、脱水、报警等基本功能。
主程序流程图如图3所示。
图3 主程序流程图5 系统仿真及实际调试5.1 仿真结果图4 :系统仿真结果5.1 问题分析本电路为模拟洗衣机工作过程,所以进水和排水部分只能用输出引脚上的发光二极管表示工作状态,报警电路为脱水过程的保护电路,当脱水未结束打开洗衣机盖的时候,报警电路工作并断开电机电源,防止发生事故。
6 总结在本设计中通过软,硬件的配合设计,很好的实现了洗衣机的控制功能。
本系统结构简单,控制功能强大,自动化程度高等特点。
系统软硬件设计采用模块化的设计方法,各模块功能相对独立,最后把它们整合在一起,大大的缩短了系统的设计周期。
为保证洗衣机及人身安全,设计了报警电路。
本设计还考虑半自动的设计,用户可以根据自己的需求自由选择洗衣机的工作方式,这一点是通过功能选择键实现的。
通过这次单片机课程设计,不仅巩固了课本上所学的知识,而且更加深刻地认识到了单片机在生活中的重要地位,通过这次课程设计让我对单片机系统设计的过程与方法有了一定的认识,很好的培养了自己的创新设计能力。
参考文献[1] 李朝青.单片机原理及接口技术[M].北京:北京航空航天出版社,1999.[2] 顾滨.单片微计算机原理、开发及应用[M].北京:高等教育出版社,2000.[3] 王思明,张金敏,苟军年等.单片机原理及应用系统设计[M]:科学出版社,2012.[4] 房小翠.单片机实用系统设计技术[M].北京:国防工业出版社,1990.附录1 源程序#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 led_wring=P0^7; // 报警指示灯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 err=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(){ anther=0;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;anther=0;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;default: err=1;led_wring = 0;}}//**********************************//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;default: err=1;led_wring = 0;}}//**********************************//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;default: err=1;led_wring=0;}}//***********************************//if((sec<0)&&(min==0)&&(flag0==3)){ sec=0;over();}}}。