单片机课程设计基于某89C51地全自动洗衣机控制系统器设计.docx
《单片机课程设计基于某89C51地全自动洗衣机控制系统器设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计基于某89C51地全自动洗衣机控制系统器设计.docx(23页珍藏版)》请在冰点文库上搜索。
单片机课程设计基于某89C51地全自动洗衣机控制系统器设计
单片机系统
课程设计
成绩评定表
设计课题基于89C51的全自动洗衣机控制器设计
学院名称:
电气工程学院
专业班级:
学生:
学号:
指导教师:
设计地点:
设计时间:
指导教师意见:
成绩:
签名:
年月日
单片机系统
课程设计
课程设计名称:
基于89C51的全自动洗衣机控制器设计
专业班级:
学生姓名:
学号:
指导教师:
课程设计地点:
课程设计时间:
单片机系统课程设计任务书
学生
专业班级
学号
题目
课题性质
工程设计
课题来源
自拟
指导教师
主要容
(参数)
利用89C51设计全自动洗衣机,实现以下功能:
1.可以实现自动洗涤功能
2.衣物脱水功能
3.洗衣机完成一次洗涤之后会发出警报,提示已经洗完
任务要求
(进度)
第1-2天:
熟悉课程设计任务及要求,查阅技术资料,确定设计方案。
第3-4天:
按照确定的方案设计单元电路。
要求画出单元电路图,元件及元件参数选择要有依据,各单元电路的设计要有详细论述。
第5-6天:
软件设计,编写程序。
第7-8天:
实验室调试。
第9-10天:
撰写课程设计报告。
要求容完整、图表清晰、文理流畅、格式规、方案合理、设计正确,篇幅不少于6000字。
主要参考
资料
[1]迎新.单片微型计算机原理、应用及接口技术(第2版)[M].:
国防工业,2004
[2]熊志奇.微机自动配料控制系统[J].电子技术应用,1997,(10):
30-32
[3]周建洪.自动配料控制系统的研制[J].工矿自动化,2003,(06):
27-29
[4]庆彬,毕丽红,王铸.工业自动配料系统的精度分析[J].自动化技术与应用,2005,(05):
79-81
[5]中国电子网.21IC.
审查意见
系(教研室)主任签字:
年月日
1概述3
2总体方案设计4
2.1全自动洗衣机的工作流程4
2.2硬件组成5
3硬件电路设计5
3.189C515
3.2晶振电路5
3.3复位电路6
3.4启动电路6
3.5注水电路,放水电路6
3.6洗涤电机控制电路7
3.7警报电路10
4软件设计11
4.1主程序流程图11
4.2中断服务程序流程图13
4.3子函数流程图14
5总结14
6参考文献15
附录A16
附录B17
1概述
当今社会,洗衣机已经渗透到各个家庭了,人们对于这种东西已经不会再陌生,也越来越离不开洗衣机。
洗衣机的便利让人们节省了许许多多的时间,而且洗涤之后的效果也比人手洗的更加干净。
而自从推出了全自动洗衣机之后,洗衣机变得更加可靠。
全自动洗衣机就是将洗衣的全过程(泡浸-洗涤-漂洗-脱水)预先设定好N个程序,洗衣时选择其中一个程序,打开水龙头和启动洗衣机开关后洗衣的全过程就会自动完成,无需人操作,只需要按下开始按钮便可。
其工作原理可以简述为:
洗衣机的洗涤过程主要是在机械产生的排渗、冲刷等机械作用和洗涤剂的润湿、分散作用下,将污垢拉入水中来实现洗净的目的。
首先充满于波轮叶片间的洗涤液,在离心力的作用下被高速甩向桶壁,并沿桶壁上升。
在波轮中心处,因甩出液体而形成低压区,又使得洗涤液流回波轮附近。
这样,在波轮附近形成了以波轮轴线为中心的涡流。
衣物在涡流的作用下,作螺旋式回转,吸入中心后又被甩向桶壁,与桶壁发生摩擦。
又由于波轮中心是低压区,衣物易被吸在波轮附近,不断地与波轮发生摩擦,如同人工揉搓衣物,污垢被迫脱离衣物。
其次,当衣物被放进洗涤液之后,由于惯性作用运动缓慢,在水流与衣物之间存在着速度差,使得两者发生相对运动,水流与衣物便发生相对摩擦,这种水流冲刷力同样有助于污垢离开衣物。
再次由于洗衣涌形状的不规则,当旋转着的水流碰到桶壁后,其速度和方向都发生了改变,形成湍流。
在湍流的作用下,衣物做无规则地运动并翻滚,其纤维不断被弯曲、绞纽扣拉长,衣物相互相摩擦,增大了洗涤的有效面积,提高衣物的洗净的均匀性。
简单来说,洗衣机的洗涤功能主要来源于两大原理,相对运动和离心力。
相对运动是指在电机实行正转时,突然反转,使的本来正转的衣物与反转的衣物相互摩擦或者与带有洗衣液的水相撞从而去除污渍。
离心力是指衣物随着水的旋转方向而逐渐离开中心,从而能使得衣物贴近桶壁。
2总体方案设计
2.1全自动洗衣机的工作流程
(1)注入水,待水面达到一定高度的时候将停止注水,触发启动信号;
(2)单片机收到启动信号之后,对单片机的I/O口进行分配,用I/O口的高
低电平来控制电机。
此过程是用单片机控制电机的正反转,正反转时间相同,以达到除去污染物的功能;
(3)应用定时器控制其工作时间,洗涤时间为30分钟;
(4)当定时时间到了,可以停止洗涤了;
(5)放水,启动放水电机;
(6)此步骤为脱水过程,脱水过程就是让电机正转,定时5分钟;
(7)脱水完成之后,将停止电机运作。
图2-1-1
2.2硬件组成
硬件功能图
图2-2-1
3硬件电路设计
各元件电路分析
3.189C51
单片机是本次设计的核心部分,通过对单片机进行编程,从而实现I/O口电平的高低变化,以此来控制要控制的对象;
3.2晶振电路
单片机的工作需要时钟,而晶振电路是给单片机提供时钟的一个外部电路;
图3-1
3.3复位电路
复位电路是当单片机运行时需要恢复至原始状态时而需要设计的电路,实际设计时,只需要给RESET一个10ms以上的高电平就可以实现复位了;
图3-2
3.4启动电路
启动电路比较简单,给I/O口一个低电平即可动作;
图3-3
3.5注水电路,放水电路
如下图所示,单片机P1.2、P1.3口通过1K上拉电阻给8050NPN型三极管的基极供电,M1为供水电机,M2为放水电机;
图3-4
3.6洗涤电机控制电路
该部分电路可设计成两种电路,一种是控制直流电机,另一种是用直流电路控制交流电机。
1控制直流电机法
图3-5
该控制电路为控制直流电机法,这是一个典型的H桥电路,当P1.0输入高电平时,Q21导通,此时Q63的基极得到一个低电平,Q61截止,Q63导通。
P1.1输入低电平,Q22截止,Q60基极得到一个高电平,Q60导通,Q62截止,此时电机M10得到一个向左的电流,此时为反转,正转则反之。
此法简单容易控制,不过有缺点,因为受到三极管的耐压限制,只能运用于低压直流电机上,实际可靠性不高。
2直流电流控制三相交流电动机法
图3-6
图3-7
这种方法需要用到电气控制,用直流中间继电器控制交流接触器的线圈通断。
该部分分为两个电路,一个直流部分,一个交流部分。
直流部分见图3-6,交流部分见图3-7。
当P1.0口为高电平,Q20导通,KA1无电流通过,KM1不得电。
当P1.0为低电平,Q20截止,此时KA1线圈得电吸合,KA1常开闭合,KM1得电,此为正转,反转则控制P1.1口为0,P1.0为1。
经查证,该款直流中间继电器MY2NJ-DC24V额定电压220VAC,最大开关电压250VAC,线圈吸合电流为36.9mA,当Q20截止时,流过KA1上的电流I=24V/250=96mA>36.9mA,所以是可以吸合的。
3.7警报电路
当P1.4口输出一个低电平,Q34导通,此时蜂鸣器响起,触发警报,提示已经完成工作。
4软件设计
4.1主程序流程图
图4-1-1
图4-1-1便是本次全自动洗衣机设计电路的主函数部分,总体思路比较简单。
对外部中断0的初始化和对定时器0的初始化。
首先是设置定时器0的工作方式,选定为工作方式1。
定时器工作方式1是16位定时器,有高八位和低八位。
选定为定时器,令D2位为0,GATE位为门控位,在本次设计中没用到,使之置0。
由图4-1-3可以知道,当M1=0,M0=1时,工作方式为1,于是应该使TMOD的值设定为00000001B,即是01H。
图4-1-2
图4-1-3
第二步则是装初值。
装初值之前,必须要了解51单片机的计数/定时方法。
51单片机的定时器是从65536(假设是方式1)到0从高到低的顺序来进行计数定时的,于是TH0=(65536-要定时的时间)/256,TH0为高八位数据;同样可以得到低八位TL0=(65536-要定时的时间)%256。
第三步设置TCON。
因为要用到外部中断0,所以需要把外部中断0的触发方式选择一下。
IT0是选择外部中断0的触发方式位,当IT0=0时为电平触发方式,当IT0=1时为边沿触发方式。
一般常用的外部中断触发方式为边沿触发方式,即是IT0=1。
图4-1-4
第四步是设置中断允许寄存器IE。
在主函数中,总共需要打开四个中断允许位,外部中断0中断允许位,定时器0中断允许位,总中断允许位。
需要做的只是让ET0=1,EX0=1,EA=1即可。
图4-1-5
最后一步就是等待中断服务函数的到来,在C语言中可以用while
(1);来实现。
4.2中断服务程序流程图
图4-2-1
如图4-2-1所示,这是整个控制程序的中心部分,中断服务函数。
总共采用了两个中断源,一个是外部中断0,一个是定时器中断0。
总体思路是从按键中检测是否有按键按下,然后打开注水开关,而后打开定时器开始计时。
每隔50ms进入一次定时器中断。
以1s为基准,让50ms循环20次便得到1s,而后以1s为基准,需要定时多长的时候就直接可以使用1s基准。
注水完成之后便是洗涤过程,启动电机的正反转,持续30min,正转反转一次5s。
洗涤过程完成之后,打开放水电机,放水5min,放水完成之后脱水,脱水完成启动警报,结束。
程序详细运行过程:
检测是否有键盘按下,如果有,则触发外部中断0,在外部中断0函数部使P1.2输出低电平,打开注水电机,打开定时器0,开始计时。
直到5min后停止注水,标志位置1。
当标志位置1时,开始进行洗涤过程。
驱动电机正反转,正转置P1.1为1,反转置P1.0为0;反转置P1.1为0,P1.0为1。
正反转各五秒,一个周期为10秒,总共要持续30min,也即是需要循环180次。
当洗涤30min之后,应该令标志位置2。
当标志位为2时,放水电机打开,定时5min。
完成后进行脱水处理。
脱水处理的主要办法是令电机正转5min。
5min后标志位置3。
当标志位为3时,打开警铃,告知已经完成洗涤,响铃10s。
响铃完成之后,标志位清零。
所有数据复位,定时器关闭,回到主函数等待下一次中断响应。
4.3子函数流程图
子函数比较简单,主要有注水电机的驱动程序,洗涤时正反转电机的驱动程序,放水电机的驱动程序,脱水时电机的驱动程序以及驱动蜂鸣器的程序。
这些子函数比较简单,都是进行一个I/O口的高低电平输出,然后用定时器进行延时。
在此处便不作流程图,子程序见附录。
5总结
本次设计相当来说比较简单,对单片机的控制要求不高,只是使用到了中断系统,定时器和几个I/O口,最难的是对硬件电路的设计。
硬件电路设计中最难搞的一点就是参数的选取,对于一个完整的电路图而已,要取得电路中的元件参数是难点。
对于不同的电压,要选取什么信号的三极管,其最大开关电流是多少,放在电路中会不会烧坏,电阻要选多少才能有效限流等等这些问题,都是一些初学者比较难以搞懂的东西。
尤其是交流控制直流那部分,一开始有些想不通,我曾经尝试过用一个NPN型三极管当开关,在集电极处直接接交流负载(交流负载为一个电阻和一个交流接触器线圈串联,而且有24VAC供电),在交流电路和直流电流之间用一个电容连接。
(该电容是用来阻挡直流电进入交流电路的)后来觉得不妥,因为即使三极管基极输出高电平,集电极处该有低电平,但是,对于交流电而已,电容本身也是一个阻抗,而且电容一般是uF级别,非常小,从而得到的阻抗也不小,从而可能导致电容上分担了大部分电压,使通过线圈的电流并未减小到线圈释放的程度,从而无法关断电机。
因此没有采用此方案,而是采用了24V直流中间继电器来进行过渡,让直流中间继电器的常开触点控制KM1和KM2,达到了不错的效果。
设计是一个循行渐进的过程,从中一点一点制作,其实并不会很难,从中还可以学到不少的知识。
6参考文献
[1]XX百科—全自动洗衣机
baike.baidu./link?
url=WwNobnBnfYPyOHx8h2LIlydWDKIXbPleYT0IlBAgj2O9vxkal7nnwD8W6vETfl0OAXSlCqo8A7qCFYt7LfAP1a
[2]XX百科—三极管8050
baike.baidu./link?
url=2mEYmChXkSinVQReZSlowpqpOw0Q3Xf6xONZEaJRGsV5GBSvQApZMrgnR_044m4Pb_l9y3V6O2SsE5M3hNvwy_
附录A
总体电路图
附录B
源程序
#include
sbitP10=P1^0;
sbitP11=P1^1;
sbitP12=P1^2;
sbitP13=P1^3;
sbitP14=P1^4;
#defineucharunsignedchar
#defineuintunsignedint
uintnum,num1,num2,flag,num3,num4,num5,num6,t;
voidinit()//中断,定时器的初始化
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
IT0=1;
EX0=1;
ET0=1;
}
voiddry()//脱水过程,驱动主电机正转
{
if(t==1)
{
P11=1;
P10=0;
if(num6==300)
{
P11=1;
P10=1;
num6=0;
flag=3;
num5=0;
}
}
}
voidbell()//驱动蜂鸣器10s
{
P14=0;
if(num5==10)
{
P14=1;
flag=0;
TR0=0;
num1=0;
num2=0;
num3=0;
num4=0;
num5=0;
num6=0;
}
}
voidyinwait5min()//驱动注水电机5min
{
if(num1==300)
{
num1=0;
P12=0;
flag=1;
num2=0;
}
}
voidfangwait5min()//驱动放水电机5min
{
if(num4==300)
{
num4=0;
P13=0;
t=1;
num6=0;
}
}
voidxidi()//驱动洗涤电机
{
if(num2>=100)
{
P11=1;
P10=0;
if(num2==200)
{
P10=1;
P11=0;
num2=0;
num3++;
}
}
if(num3==180)
{
num3=0;
flag=2;
P11=1;
P10=1;
num4=0;
}
}
voidmain()
{
init();
while
(1);//等待中断到来
}
voidext0()interrupt0//外部中断0函数
{
P12=0;
TR0=1;
while(flag==0);//等待标志位置1
while(flag==1);//等待标志位置2
while(flag==2);//等待标志位置3
while(flag==3);//等待标志位置0
}
voidtime_0()interrupt1//定时器中断0函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20)
{
num=0;
num1++;
num2++;
num4++;
num5++;
num6++;
}
if(flag==0)
yinwait5min();
if(flag==1)
xidi();
if(flag==2)
{
fangwait5min();
dry();
}
if(flag==3)
bell();
}