51单片机全自动洗衣机仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar num=0,num1=0,num2=0,num3=0,num4=0,num5=0,num6=0,flag=0,flag1=0,flag4=0,flag5=0,circle=0;
- sbit ledbiaozhun=P1^0; //LED指示灯
- sbit ledjingji =P1^1;
- sbit leddandu =P1^2;
- sbit ledpaishui =P1^3;
- sbit ledqiangxi =P1^4;
- sbit ledruoxi =P1^5;
- sbit ledxidi =P1^6;
- sbit ledpiaoxi =P1^7;
- sbit ledtuoshui =P2^0;
-
- sbit sshuiwei =P3^6; //水位开关
- sbit sgai =P3^7; //盖开关
- sbit paishui=P2^3; //排水阀控制
- sbit jinshui=P2^2; //进水阀控制
-
- sbit U2=P2^4;
- sbit U3=P2^5;
- sbit k1=P3^0; // 步进改变"标准、经济、单独、排水"四种方式
- sbit k2=P3^1; //强洗、弱洗
- sbit k3=P3^2; //运行、暂停和解除报替功能
- void init()
- {
- uchar a=0,b=0,c=0;
- TMOD=0x01; //T0工作于方式1
- TH0=(65536-50000)/256; //定时时间50ms
- TL0=(65536-50000)%256;
- EA=1; //开总中断
- ET0=1; //开T0中断
- TR0=0; //关闭T0
- EX0=1; //开外部中断0
- IT0=1; //外部中断0边沿触发方式
- U2=1; //电机停转
- U3=1;
- P0=0xff;
- }
- void delayms(uint xms) //延时
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
-
- void key() //控制按键
- {
- circle=1;
- if(k1==0) //标准、经济、单独、排水按下
- {
- delayms(10); //延时消抖
- if(k1==0) //再判
- {
- num++; //K1按下次数加1
- if(num==4)
- num=0; //等于4,按下次数清0
- while(!k1); //等待按键释放
- }
- }
-
- if(k2==0) //强弱选择
- {
- delayms(10); //延时消抖
- if(k2==0) //再判
- {
- num1++; //按下次数加1
- if(num1==2)
- num1=0; //等于2,按下次数清0
- while(!k2); //等待按键释放
- }
- }
- }
-
- void qiang() //强
- {
- if(flag4==0) //电机正转
- {
- U2=0;
- U3=1;
- }
-
- if(flag4==1) //电机反转
- {
- U2=1;
- U3=0;
- }
- }
- void ruo() //弱
- {
- if(flag5==0) //电机正转
- {
- U2=0;
- U3=1;
- }
-
- if(flag5==1) //电机反转
- {
- U2=1;
- U3=0;
- }
- }
-
- void qbiaozhun() //强标准
- {
- /*******洗涤********/
- num=0;
- num1=0;
- ledbiaozhun=0;//标准洗LED亮
- ledqiangxi=0; //强洗LED亮
- jinshui=0; //打开进水阀
- ledxidi=1; //洗涤
- ledpiaoxi=1; //漂洗LED亮
- ledtuoshui=1; //脱水LED亮
- delayms(5000);//水位监测
- jinshui=1; //关闭进水阀
- ledxidi=0;
- flag1=1; //
- TR0=1; //启动定时器T0
- while(flag==0)//flag为洗涤次数标志位
- {
- if(flag==0&&num2==1)
- {
- TR0=1;
- flag1=1; //
- qiang();
- }
- if(flag==0&&num2==2)
- {
- TR0=0; //关闭定时器T0
- U2=1; //电机停止
- U3=1;
- }
- };
- //漂洗
- U2=1;
- U3=1;
- TR0=0;
- flag1=0;
- paishui=0; //排水
- ledtuoshui=1;
- ledpiaoxi=1;
- ledxidi=1;
- delayms(5000);
- paishui=1; //关闭排水
- delayms(100);
- jinshui=0; //打开进水
- delayms(5000);
- jinshui=1; //关闭进水
- ledpiaoxi=0;
- flag1=2;
- TR0=1;
- num3=0;
- num4=0;
- while(flag==1)
- {
- if(flag==1&&num2==1)//强漂洗
- {
- TR0=1;
- flag1=2;
- qiang();
- }
- if(flag==1&&num2==2)//暂停强漂洗
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
- //漂洗
- U2=1;
- U3=1;
- TR0=0;
- flag1=0;
- paishui=0;
- ledtuoshui=1;
- ledpiaoxi=0;
- delayms(5000);
- paishui=1;
- delayms(100);
- jinshui=0;
- delayms(5000);
- jinshui=1;
- flag1=2;
- TR0=1;
- num3=0;
- num4=0;
-
- while(flag==2)
- {
- if(flag==2&&num2==1)
- {
- TR0=1;
- flag1=2;
- qiang();
- }
- if(flag==2&&num2==2)
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- } ;
- //脱水
- U2=1;
- U3=1;
- TR0=0;
- flag1=0;
- paishui=0;//打开排水
- ledtuoshui=0;
- ledpiaoxi=1;
- while(sgai);
- paishui=1;
- delayms(1000);
- flag1=3;
- TR0=1;
- num3=0;
- num4=0;
- while(flag==3)
- {
- if(flag==3&&num2==1)
- {
- TR0=1;
- U2=0;
- U3=1;
- flag1=3;
- }
- if(flag==3&&num2==2)
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
- ledtuoshui=1;
- U2=1;
- U3=1;
- flag1=0;
- }
-
- void qjingji() //强经济
- {
- /*******洗涤********/
- num=0;
- num1=0;
- ledjingji=0;
- ledqiangxi=0;
- ledtuoshui=1;
- ledpiaoxi=1;
- ledxidi=1;
- jinshui=0;
- delayms(5000);
- jinshui=1;
- flag1=1; //控制定时器中的洗涤指示灯
- TR0=1;
- while(flag==0)
- {
- if(flag==0&&num2==1)
- {
- TR0=1;
- flag1=1;
- qiang();
- }
- if(flag==0&&num2==2)
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
-
- //漂洗
- TR0=0;
- U2=1;
- U3=1;
- flag1=0;
- paishui=0;
- ledjingji=0;
- ledtuoshui=1;
- ledxidi=1;
- delayms(5000);
- paishui=1;
- delayms(100);
- jinshui=0;
- delayms(5000);
- jinshui=1;
- ledpiaoxi=0;
- flag1=2;
- TR0=1;
- num3=0;
- num4=0;
- while(flag==1)
- {
- if(flag==1&&num2==1)
- {
- TR0=1;
- flag1=2;
- qiang();
- }
- if(flag==1&&num2==2)
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
- //脱水
- TR0=0;
- U2=1;
- U3=1;
- flag1=0;
- paishui=0; //打开排水
- ledjingji=0;
- ledtuoshui=0;
- ledpiaoxi=1;
- delayms(5000);
- while(sgai);
- paishui=1;
- delayms(1000);
- flag1=3;
- TR0=1;
- flag=2;
- num3=0;
- num4=0;
- while(flag==2)
- {
- if(flag==2&&num2==1)
- {
- TR0=1;
- U2=0;
- U3=1;
- flag1=3;
- }
- if(flag==2&&num2==2)
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
- ledtuoshui=1;
- U2=1;
- U3=1;
- flag1=0;
- }
-
- void qdandu() //强单独
- {
- num=0;
- num1=0;
- ledqiangxi=0;
- ledxidi=0;
- leddandu=0;
- jinshui=0;
- delayms(5000);
- jinshui=1;//关闭进水阀
- flag1=1;
- TR0=1;
- while(flag==0)
- {
- if(flag==0&&num2==1)
- {
- TR0=1;
- flag1=1;
- qiang();
- }
- if(flag==0&&num2==2)
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
- flag1=0;
- U2=1;
- U3=1;
- }
-
- void rbiaozhun() //弱标准
- {
- /*******洗涤********/
- num=0;
- num1=0;
- ledbiaozhun=0;
- ledruoxi=0;
- ledtuoshui=1;
- ledpiaoxi=1;
- jinshui=0;
- delayms(5000);
- jinshui=1;
- ledxidi=0;
- flag1=1;
- TR0=1;
- while(flag==0)
- {
- if(flag==0&&num2==1)
- {
- TR0=1;
- flag1=1;
- ruo();
- }
- if(flag==0&&num2==2)
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
- //漂洗
- U2=1;
- U3=1;
- TR0=0;
- flag1=0;
- paishui=0;
- ledtuoshui=1;
- ledxidi=1;
- delayms(5000);
- paishui=1;
- delayms(100);
- jinshui=0;
- delayms(5000);
- jinshui=1;
- ledpiaoxi=0;
- flag1=2;
- TR0=1;
- num3=0;
- num4=0;
- while(flag==1)
- {
- if(flag==1&&num2==1)
- {
- TR0=1;
- flag1=2;
- ruo();
- }
- if(flag==1&&num2==2)
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
- //漂洗
- U2=1;
- U3=1;
- TR0=0;
- flag1=0;
- paishui=0;
- ledtuoshui=1;
- ledpiaoxi=0;
- delayms(5000);
- paishui=1;
- delayms(100);
- jinshui=0;
- delayms(5000);
- jinshui=1;
- flag1=2;
- TR0=1;
- num3=0;
- num4=0;
- while(flag==2)
- {
- if(flag==2&&num2==1)
- {
- TR0=1;
- flag1=2;
- ruo();
- }
- if(flag==2&&num2==2)
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- }
- //脱水
- U2=1;
- U3=1;
- TR0=0;
- flag1=0;
- paishui=0;
- delayms(5000);
- ledtuoshui=0;
- ledpiaoxi=1;
- while(sgai);
- paishui=1;
- delayms(1000);
- flag1=3;
- TR0=1;
- num3=0;
- num4=0;
- while(flag==3)
- {
- if(flag==3&&num2==1)
- {
- TR0=1;
- U2=0;
- U3=1;
- flag1=3;
- }
- if(flag==3&&num2==2)
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
- ledtuoshui=1;
- U2=1;
- U3=1;
- flag1=0;
- }
-
- void rjingji() //弱经济
- {
- /*******洗涤********/
- num=0;
- num1=0;
- ledjingji=0;
- ledruoxi=0;
- ledtuoshui=1;
- ledpiaoxi=1;
- ledxidi=1;
- jinshui=0;
- delayms(5000);
- jinshui=1; //打开进水阀,进水
- flag1=1;
- TR0=1;
- while(flag==0)
- {
- if(flag==0&&num2==1) //弱经济洗
- {
- TR0=1;
- flag1=1;
- ruo();
- }
- if(flag==0&&num2==2) //弱经济洗暂停
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
-
- //漂洗
- TR0=0;
- U2=1;
- U3=1;
- flag1=0;
- paishui=0; //排水阀打开
- ledjingji=0;
- ledtuoshui=1;
- ledxidi=1;
- delayms(5000);
- paishui=1; //排水阀关闭
- delayms(100);
- jinshui=0; //进水阀打开
- delayms(5000);
- jinshui=1; //进水阀关闭
- ledpiaoxi=0;
- flag1=2;
- TR0=1;
- num3=0;
- num4=0;
- while(flag==1)
- {
- if(flag==1&&num2==1)//漂洗
- {
- TR0=1;
- flag1=2;
- ruo();
- }
- if(flag==1&&num2==2)//漂洗暂停
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
- //脱水
- TR0=0;
- U2=1;
- U3=1;
- flag1=0;
- ledjingji=0;
- ledtuoshui=0;
- ledpiaoxi=1;
- paishui=0; //排水阀打开
- delayms(5000);
- while(sgai);
- paishui=1;
- delayms(3000);
- flag1=3;
- TR0=1;
- num3=0;
- num4=0;
- while(flag==2)
- {
- if(flag==2&&num2==1)
- {
- TR0=1;
- U2=0;
- U3=1;
- flag1=3;
- }
- if(flag==2&&num2==2)
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
- ledtuoshui=1;
- U2=1;
- U3=1;
- flag1=0;
- }
-
- void rdandu() //弱单独
- {
- num=0;
- num1=0;
- ledruoxi=0;
- ledxidi=0;
- leddandu=0;
- jinshui=0; //打开进水阀,进水
- delayms(5000);
- jinshui=1;
- flag1=1;
- TR0=1; //启动定时器T0
- while(flag==0)
- {
- if(flag==0&&num2==1) //弱单独洗
- {
- TR0=1;
- flag1=1;
- ruo();
- }
- if(flag==0&&num2==2)//弱单独洗暂停
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
- flag1=0;
- U2=1;
- U3=1;
- }
-
- void dpaishui() //排水/脱水
- {
- num=0;
- num1=0;
- ledpaishui=0;
- ledtuoshui=0;
- jinshui=1;
- paishui=0;
- delayms(3000);
- while(sgai);
- delayms(3000);
- flag1=3;
- TR0=1;
- num3=0;
- num4=0;
- while(flag==0)
- {
- if(flag==0&&num2==1) //脱水
- {
- TR0=1;
- flag1=3;
- U2=0;
- U3=1;
- }
- if(flag==0&&num2==2)//暂停脱水
- {
- TR0=0;
- U2=1;
- U3=1;
- }
- };
- U2=1;
- U3=1;
- flag1=0;
- ledtuoshui=1;
- paishui=1; ////排水阀关闭
- }
-
- void main()
- {
- init();
- while(1)
- {
- key(); //键扫描
- if((num1==0&&num==0)&&circle==1) //标准 强洗
- {
- ledruoxi=1; //关闭弱洗LED
- ledpaishui=1; //关闭排水LED
- ledbiaozhun=0;//强标准LED亮
- ledqiangxi=0; //强洗LED亮
- if(num2==1)
- {
- qbiaozhun(); //强标准洗
- }
- if(num2>1) //K3键按下次数为2,暂停洗涤
- {
- ;
- }
- circle=0;
- }
- if(num1==0&&num==1) //经济 强洗
- {
- ledruoxi=1;
- ledbiaozhun=1;
- ledqiangxi=0;
- ledjingji=0;
- if(num2==1)
- {
- qjingji(); //强经济洗
- ledjingji=1;
- }
- circle=0;
- }
- if(num1==0&&num==2) //单独 强洗
- {
- ledruoxi=1;
- ledjingji=1;
- ledqiangxi=0;
- leddandu=0;
- if(num2==1)
- {
- qdandu(); //强单独洗
- leddandu=1;
- }
- circle=0;
- }
- if(num1==0&&num==3)
- {
- ledruoxi=1; //排水 强洗
- leddandu=1;
- ledqiangxi=0;
- ledpaishui=0;
- if(num2==1)
- {
- dpaishui(); //单排水
- ledpaishui=1;
- }
- circle=0;
- }
- if(num1==1&&num==0) //弱 标准
- {
- ledqiangxi=1;
- ledpaishui=1;
- ledruoxi=0;
- ledbiaozhun=0;
- if(num2==1)
- {
- rbiaozhun(); //弱标准洗
- ledruoxi=1;
- }
- circle=0;
- }
- if(num1==1&&num==1) //弱经济
- {
- ledqiangxi=1;
- ledbiaozhun=1;
- ledruoxi=0;
- ledjingji=0;
- if(num2==1)
- {
- rjingji(); //弱经济洗
- ledruoxi=1;
- ledjingji=1;
- }
- circle=0;
- }
- if(num1==1&&num==2)
- {
- ledqiangxi=1;
- ledjingji=1;
- ledruoxi=0;
- leddandu=0;
- if(num2==1)
- {
- rdandu(); //弱单独洗
- ledruoxi=1;
- leddandu=1;
- }
- circle=0;
- }
- if(num1==1&&num==3)
- {
- ledqiangxi=1;
- leddandu=1;
- ledruoxi=0;
- ledpaishui=0;
- if(num2==1) //K3键
- {
- dpaishui(); //单排水
- ledpaishui=1;
- }
- circle=0;
- }
- num2=0;
- }
- }
-
- void T0_time() interrupt 1 //定时
- {
- TH0=(65536-50000)/256; //重赋初值
- TL0=(65536-50000)%256;
- num3++; //定时计数加1
- if(num3==20) //1秒时间到
- {
- num3=0; //计数清0
- if(flag1==1)
- ledxidi=~ledxidi; //洗涤指示取反
- if(flag1==2)
- ledpiaoxi=~ledpiaoxi; //漂洗指示取反
- if(flag1==3)
- ledtuoshui=~ledtuoshui; //脱水指示取反
- num4++;
- num5++;
- num6++;
- if(num4==15) //洗涤定时,15秒到
- {
- num4=0; //清0
- flag++; //标志洗涤次数
- }
- if(num5==5) //强洗周期,5秒到
- {
- num5=0;
- flag4++; //强洗标志加1
- if(flag4==2)
- flag4=0;
- }
- if(num6==3) //弱洗周期 ,3秒到
- {
- num6=0;
- flag5++; //弱洗标志加1
- if(flag5==2)
- flag5=0;
- }
- }
- }
-
- void int0() interrupt 0 //外部中断0 ,K3键
- {
- num2++; //K3按下计数加1 ,num2为1运行,num2为2暂停
- if(num2==3)
- num2=1;
- }
复制代码
Keil5代码与Proteus8.8仿真下载:
51单片机全自动洗衣机.zip
(323.04 KB, 下载次数: 89)
|