简单洗衣机控制基于单片机.docx
《简单洗衣机控制基于单片机.docx》由会员分享,可在线阅读,更多相关《简单洗衣机控制基于单片机.docx(23页珍藏版)》请在冰豆网上搜索。
![简单洗衣机控制基于单片机.docx](https://file1.bdocx.com/fileroot1/2023-2/24/c2ecb306-4eac-4dfe-97a2-64c69bd13ffa/c2ecb306-4eac-4dfe-97a2-64c69bd13ffa1.gif)
简单洗衣机控制基于单片机
1.项目名称:
项目九:
洗衣机控制
2.项目内容及要求;
内容:
设自动洗衣机的控制要求是:
启动后先开启进水阀进水,水位到达设定值后关闭,然后波轮按正转5秒、反转5秒,正、反转之间停3秒的规律不断循环转动,直至达到设定时间停止,之后打开排水阀放水,水放完后洗衣桶旋转脱水,1分钟后停止并关闭排水阀,洗衣过程结束。
要求水位设置不少于高、中、低三档,洗衣时间在3——12分钟范围内可调,以1分钟为单位,排水时间定为1分钟。
运动执行器用指示灯模拟,水位用开关模拟,试设计该洗衣机的控制电路。
要求:
1.画出控制系统的框图,说明系统方案设计的思路、理由或依据;
2.选择、确定组成控制系统的各个单元,并阐述选择确定的原则或依据;
3.画出完整的电气原理图,介绍整体电路的工作原理、性能或特点;
4.如采用单片机控制,给出单片机程序的流程图和清单,说明程序的工作原理。
5.制作实物电路,验证设计、制作是否正确。
3.题目分析及设计思路;(弄清楚要完成设计的技术要点、关键是什么,有哪些需要注意的事项,可以采用哪些方法和手段,有哪些可用的方案或电路形式,等等。
)
要完成本项目设计的技术要点是对洗衣机的整个运行流程深刻理解之后,再用程序将他表现出来,说以关键就在于程序的编写。
需要注意的是运动执行器是用指示灯模拟,水位用开关模拟,还要求水位设置不少于高、中、低三档,洗衣时间在3——12分钟范围内可调所以大概就要用到6个发光二极管和8个复位按键,因此就要对整个流程控制的逻辑顺序有个很好的设计。
对于程序的编写可以采用单片机或PLC(就目前所学而言),而对于这样一个简单的小程序就采用单片机即可。
4.方案设计说明;(在充分调研、思考的基础上确定电路方案并说明理由。
画出电路的系统框图,说明系统框图的原理。
)
一开始看到这个题目我就打算使用单片机来完成本设计,因为单片机使用方便,只需一个最小系统即可,在宿舍就可完成对程序的编写和修改,而PLC价格昂贵且不能随时可用。
就本项目采用单片机而言需要一个单片机最小系统,思维数码管及驱动,一组LED和按键。
系统框图:
通过对八个按键的操作,可对水位设置,洗衣时间设置,开始洗衣,水位确定。
四位数码管可显示水位的设置值,洗衣时间设置值,还有洗衣时间计时等。
六个LED有两个表示洗衣机波轮的正反转,两个进水和排水,一个脱水,一个洗衣指示灯。
通过编写程序实现单片机对按键,四位数码管和发光二极管的控制。
系统流程图:
5.单元设计说明;(按项目的具体要求撰写,没有可不写。
)
单片机最小系统:
系统框图:
最小系统电路图:
6.完整电路原理分析;(按项目的具体要求撰写)
通过单片机扫描水位设置按键和洗衣时间设置按键来设置水位和洗衣时间在四位数码管上显示设置的值和计时时间。
进水阀指示灯亮表示进水阀已打开,正转和反转指示灯亮表示洗衣机波轮的正转和反转。
脱水阀亮表示脱水阀已打开可以排水。
7.制作、调试情况;(如实介绍,重点介绍制作、调试过程中遇到的问题和解决问题的方法)
在制作,调试中遇到了许多大大小小的问题,在这选一些较为重要的写出。
1.在焊接完单片机最小系统进行调试时指示灯不会亮,也不能下载程序,经过几番检查发现指示灯正负接反,单片机引脚焊点有虚焊点。
2.编写好程序进行调试时,四位数码管不能正常显示,经检查发现共阳的数码管使用了共阴的数码管编码。
3.在调试程序中,发现四位数码管显示较暗且有闪烁,经多次调试,将数码管显示程序写在定时器中断函数里,发现结果好多了。
4.在测试程序中发现按键不起作用,检查了程序和硬件电路发现按键连接的是地,而程序写的高电平接通。
改了下程序结果就出来了。
8.实训成果;(如实介绍实训成果的情况)
八个按键从左到右的作用:
按键1水位设置和洗衣时间设置切换选择,按键2和按键3是加减数值,按键4是启动,按键5按键6按键7按键8是表示水位的零水位和高中低水位。
9.心得体会:
通过本次实训,收获颇多,感觉自己有进步了一点,许多东西只用大脑去想是不行的,理论可行但实际可不可行就不知道,这就需要实际动手操作了才知道,一开始看了这个项目觉得很简单,随便编写个程序就可以了,但实际坐下来就没有那么简单了,首先硬件电路焊接就出现许多问题,跟别说编写和调试程序就用了一个多星期。
不过实际做出来,感觉还是挺好的。
这也让我进一步了解了单片机的使用,掌握了一些运动控制的思路与方法。
10.附件:
完整程序
#include
#defineuintunsignedint
#defineucharunsignedchar
uchargewei,shiwei;
ucharxiyitime,num3;
ucharshuiweizhi,shuiwei;
uintnum1,num2;
sbitwei1=P1^0;
sbitwei2=P1^1;
sbitwei3=P1^2;
sbitwei4=P1^3;
sbitshuiwei0=P1^4;//
sbitshuiwei1=P1^5;//低水位
sbitshuiwei2=P1^6;//中水位
sbitshuiwei3=P1^7;//高水位
sbitshezhi_key=P2^0;
sbitqidong_key=P2^1;
//sbitxiyi_key=P2^0;
sbitup_key=P2^2;
sbitdown_key=P2^3;
sbitshuifa=P2^4;
sbitpaishuifa=P2^5;
sbitzhengzhuang=P2^6;
sbitfanzhuang=P2^7;
sbittuoshui=P3^6;
sbitzhishiled=P3^7;
//此表为LED的字模,共阴数码管0-9-
unsignedcharcodesegtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};//段码控制
unsignedcharcodesegtab1[]={0x40,0x4F,0x24,0x30,0x19,0x12,
0x02,0x78,0x00,0x10};//共阴0-9带小数点编码
//延时X毫秒函数11.0592Mhz时
voiddelay_xms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//延时X秒函数
voiddelay_s(uintxs)
{
uintx;
for(x=xs;x>0;x--)
delay_xms(1000);
}
//延时X分钟函数
voiddelay_min(uintxmin)
{
uintm,n;
for(m=xmin;m>0;m--)
for(n=60;n>0;n--)
delay_s
(1);
}
//取操作数的个十位
voidchuli(uintnum)
{
gewei=num%10;
shiwei=(num/10)%10;
}
//按键扫描函数
voidkeysaomiao()
{
ucharjianzhi;
if(shezhi_key==0)
{
delay_xms(10);
if(!
shezhi_key)
{
jianzhi++;
if(jianzhi>2)
jianzhi=1;
while(!
shezhi_key);
}
}
if(jianzhi==1)//水位设置
{
if(up_key==0)
{
delay_xms(10);
if(up_key==0)
{
shuiwei++;
if(shuiwei>3)
{
shuiwei=0;
}
while(!
up_key);
}
}
if(down_key==0)
{
delay_xms(10);
if(down_key==0)
{
if(shuiwei<=0)
{
shuiwei=3;
}
shuiwei--;
while(!
down_key);
}
}
chuli(shuiwei);
P0=segtab[gewei];
wei1=0;
delay_xms(5);
wei1=1;
P0=segtab[shiwei];
wei2=0;
delay_xms(5);
wei2=1;
P0=0xFE;
wei3=0;
delay_xms(5);
wei3=1;
P0=0x9C;
wei4=0;
delay_xms(5);
wei4=1;
}
if(jianzhi==2)
{
if(up_key==0)
{
delay_xms(10);
if(up_key==0)
{
xiyitime++;
if(xiyitime>12)
{
xiyitime=3;
}
while(!
up_key);
}
}
if(down_key==0)
{
delay_xms(10);
if(down_key==0)
{
xiyitime--;
if(xiyitime<3)
{
xiyitime=12;
}
while(!
down_key);
}
}
chuli(xiyitime);
P0=segtab[gewei];
wei1=0;
delay_xms(5);
wei1=1;
P0=segtab[shiwei];
wei2=0;
delay_xms(5);
wei2=1;
P0=0xF7;
wei3=0;
delay_xms(5);
wei3=1;
P0=0xA3;
wei4=0;
delay_xms(5);
wei4=1;
}
}
//水位检测子函数
voidshuiweijiance()
{
if(shuiwei0==0)
{
delay_xms(10);
if(shuiwei0==0)
{
shuiweizhi=0;
while(!
shuiwei0);
}
}
if(shuiwei1==0)
{
delay_xms(10);
if(shuiwei1==0)
{
shuiweizhi=1;
while(!
shuiwei1);
}
}
if(shuiwei2==0)
{
delay_xms(10);
if(shuiwei2==0)
{
shuiweizhi=2;
while(!
shuiwei2);
}
}
if(shuiwei3==0)
{
delay_xms(10);
if(shuiwei3==0)
{
shuiweizhi=3;
while(!
shuiwei3);
}
}
}
//初始化函数
voidinit()
{
num2=60;
num3=4;
shuiweizhi=0;
xiyitime=3;
TMOD=0x01;
//TH0=(65536-45872)/256;//11.0592M晶振
//TL0=(65536-45872)%256;
TH0=0xB1;//12M晶振
TL0=0xE0;
EA=1;
ET0=1;
}
/************主函数**********************/
voidmain()
{
uinti,j;
init();
P0=0xbf;
wei1=0;
wei2=0;
wei3=0;
wei4=0;
while(qidong_key)
{
keysaomiao();//水位和洗衣时间设置
}
num3=xiyitime-1;
if(qidong_key==0)
{
delay_xms(10);
if(qidong_key==0)//启动键按下
{
shuifa=0;//开进水阀进水
while(shuiwei!
=shuiweizhi)//检测是否到达设定水位
{
shuiweijiance();
chuli(shuiweizhi);
P0=segtab[gewei];
wei1=0;
delay_xms(5);
wei1=1;
P0=segtab[shiwei];
wei2=0;
delay_xms(5);
wei2=1;
delay_xms(5);
chuli(shuiwei);
P0=segtab[gewei];
wei3=0;
delay_xms(5);
wei3=1;
P0=segtab[shiwei];
wei4=0;
delay_xms(5);
wei4=1;
}
while(i<100)
{
i++;
shuiweijiance();
chuli(shuiweizhi);
P0=segtab[gewei];
wei1=0;
delay_xms(5);
wei1=1;
P0=segtab[shiwei];
wei2=0;
delay_xms(5);
wei2=1;
delay_xms(5);
chuli(shuiwei);
P0=segtab[gewei];
wei3=0;
delay_xms(5);
wei3=1;
P0=segtab[shiwei];
wei4=0;
delay_xms(5);
wei4=1;
}
delay_s
(1);
while(j<300)
{
j++;
chuli(shuiwei);
P0=segtab[gewei];
wei1=0;
delay_xms(5);
wei1=1;
P0=segtab[shiwei];
wei2=0;
delay_xms(5);
wei2=1;
chuli(xiyitime);
P0=segtab[gewei];
wei3=0;
delay_xms(5);
wei3=1;
P0=segtab[shiwei];
wei4=0;
delay_xms(5);
wei4=1;
}
shuifa=1;
zhishiled=0;
TR0=1;
while(!
num3==0)
{
if(num2>=59)
zhengzhuang=0;
if(num2==55)
zhengzhuang=1;
if(num2==52)
fanzhuang=0;
if(num2==46)
fanzhuang=1;
if(num2==42)
zhengzhuang=0;
if(num2==35)
zhengzhuang=1;
if(num2==30)
fanzhuang=0;
if(num2==23)
fanzhuang=1;
if(num2==19)
zhengzhuang=0;
if(num2==13)
zhengzhuang=1;
if(num2==9)
fanzhuang=0;
if(num2==3)
fanzhuang=1;
}
TR0=0;
zhengzhuang=1;
fanzhuang=1;
paishuifa=0;
while
(1)
{
if(shuiwei0==0)
delay_xms(10);
if(shuiwei0==0)
{
P0=0xbf;
wei1=0;
wei2=0;
wei3=0;
wei4=0;
tuoshui=0;
delay_min
(1);
tuoshui=1;
paishuifa=1;
P0=0;
delay_s
(2);
zhishiled=1;
break;
}
}
}
}
}
voidzhongduangT0()interrupt1
{
//TH0=(65536-45872)/256;//11.0592M晶振
//TL0=(65536-45872)%256;
TH0=0xB1;//12M晶振
TL0=0xE0;
num1++;
if(num1>=50)
{
num2--;
num1=0;
if(num2<=0)
{
num2=59;
num3--;
if(num3==0)
{
TR0=0;
}
}
}
chuli(num2);
wei1=0;
P0=segtab[gewei];
delay_xms(4);
wei1=1;
wei2=0;
P0=segtab[shiwei];
delay_xms(4);
wei2=1;
chuli(num3);
wei3=0;
P0=segtab1[gewei];
delay_xms(4);
wei3=1;
wei4=0;
P0=segtab[shiwei];
delay_xms(4);
wei4=1;
}