基于51单片机洗衣机课程设计报告分解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机原理及系统课程设计
专业:自动控制
班级:控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();
}
}
}。