|
51單片機(jī)全自動(dòng)洗衣機(jī)仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (106 KB, 下載次數(shù): 60)
下載附件
2022-5-14 01:42 上傳
單片機(jī)源程序如下:
- #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; //水位開關(guān)
- sbit sgai =P3^7; //蓋開關(guān)
- sbit paishui=P2^3; //排水閥控制
- sbit jinshui=P2^2; //進(jìn)水閥控制
-
- sbit U2=P2^4;
- sbit U3=P2^5;
- sbit k1=P3^0; // 步進(jìn)改變"標(biāo)準(zhǔn)、經(jīng)濟(jì)、單獨(dú)、排水"四種方式
- sbit k2=P3^1; //強(qiáng)洗、弱洗
- sbit k3=P3^2; //運(yùn)行、暫停和解除報(bào)替功能
- void init()
- {
- uchar a=0,b=0,c=0;
- TMOD=0x01; //T0工作于方式1
- TH0=(65536-50000)/256; //定時(shí)時(shí)間50ms
- TL0=(65536-50000)%256;
- EA=1; //開總中斷
- ET0=1; //開T0中斷
- TR0=0; //關(guān)閉T0
- EX0=1; //開外部中斷0
- IT0=1; //外部中斷0邊沿觸發(fā)方式
- U2=1; //電機(jī)停轉(zhuǎn)
- U3=1;
- P0=0xff;
- }
- void delayms(uint xms) //延時(shí)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
-
- void key() //控制按鍵
- {
- circle=1;
- if(k1==0) //標(biāo)準(zhǔn)、經(jīng)濟(jì)、單獨(dú)、排水按下
- {
- delayms(10); //延時(shí)消抖
- if(k1==0) //再判
- {
- num++; //K1按下次數(shù)加1
- if(num==4)
- num=0; //等于4,按下次數(shù)清0
- while(!k1); //等待按鍵釋放
- }
- }
-
- if(k2==0) //強(qiáng)弱選擇
- {
- delayms(10); //延時(shí)消抖
- if(k2==0) //再判
- {
- num1++; //按下次數(shù)加1
- if(num1==2)
- num1=0; //等于2,按下次數(shù)清0
- while(!k2); //等待按鍵釋放
- }
- }
- }
-
- void qiang() //強(qiáng)
- {
- if(flag4==0) //電機(jī)正轉(zhuǎn)
- {
- U2=0;
- U3=1;
- }
-
- if(flag4==1) //電機(jī)反轉(zhuǎn)
- {
- U2=1;
- U3=0;
- }
- }
- void ruo() //弱
- {
- if(flag5==0) //電機(jī)正轉(zhuǎn)
- {
- U2=0;
- U3=1;
- }
-
- if(flag5==1) //電機(jī)反轉(zhuǎn)
- {
- U2=1;
- U3=0;
- }
- }
-
- void qbiaozhun() //強(qiáng)標(biāo)準(zhǔn)
- {
- /*******洗滌********/
- num=0;
- num1=0;
- ledbiaozhun=0;//標(biāo)準(zhǔn)洗LED亮
- ledqiangxi=0; //強(qiáng)洗LED亮
- jinshui=0; //打開進(jìn)水閥
- ledxidi=1; //洗滌
- ledpiaoxi=1; //漂洗LED亮
- ledtuoshui=1; //脫水LED亮
- delayms(5000);//水位監(jiān)測(cè)
- jinshui=1; //關(guān)閉進(jìn)水閥
- ledxidi=0;
- flag1=1; //
- TR0=1; //啟動(dòng)定時(shí)器T0
- while(flag==0)//flag為洗滌次數(shù)標(biāo)志位
- {
- if(flag==0&&num2==1)
- {
- TR0=1;
- flag1=1; //
- qiang();
- }
- if(flag==0&&num2==2)
- {
- TR0=0; //關(guān)閉定時(shí)器T0
- U2=1; //電機(jī)停止
- U3=1;
- }
- };
- //漂洗
- U2=1;
- U3=1;
- TR0=0;
- flag1=0;
- paishui=0; //排水
- ledtuoshui=1;
- ledpiaoxi=1;
- ledxidi=1;
- delayms(5000);
- paishui=1; //關(guān)閉排水
- delayms(100);
- jinshui=0; //打開進(jìn)水
- delayms(5000);
- jinshui=1; //關(guān)閉進(jìn)水
- ledpiaoxi=0;
- flag1=2;
- TR0=1;
- num3=0;
- num4=0;
- while(flag==1)
- {
- if(flag==1&&num2==1)//強(qiáng)漂洗
- {
- TR0=1;
- flag1=2;
- qiang();
- }
- if(flag==1&&num2==2)//暫停強(qiáng)漂洗
- {
- 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() //強(qiáng)經(jīng)濟(jì)
- {
- /*******洗滌********/
- num=0;
- num1=0;
- ledjingji=0;
- ledqiangxi=0;
- ledtuoshui=1;
- ledpiaoxi=1;
- ledxidi=1;
- jinshui=0;
- delayms(5000);
- jinshui=1;
- flag1=1; //控制定時(shí)器中的洗滌指示燈
- 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() //強(qiáng)單獨(dú)
- {
- num=0;
- num1=0;
- ledqiangxi=0;
- ledxidi=0;
- leddandu=0;
- jinshui=0;
- delayms(5000);
- jinshui=1;//關(guān)閉進(jìn)水閥
- 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() //弱標(biāo)準(zhǔn)
- {
- /*******洗滌********/
- 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() //弱經(jīng)濟(jì)
- {
- /*******洗滌********/
- num=0;
- num1=0;
- ledjingji=0;
- ledruoxi=0;
- ledtuoshui=1;
- ledpiaoxi=1;
- ledxidi=1;
- jinshui=0;
- delayms(5000);
- jinshui=1; //打開進(jìn)水閥,進(jìn)水
- flag1=1;
- TR0=1;
- while(flag==0)
- {
- if(flag==0&&num2==1) //弱經(jīng)濟(jì)洗
- {
- TR0=1;
- flag1=1;
- ruo();
- }
- if(flag==0&&num2==2) //弱經(jīng)濟(jì)洗暫停
- {
- 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; //排水閥關(guān)閉
- delayms(100);
- jinshui=0; //進(jìn)水閥打開
- delayms(5000);
- jinshui=1; //進(jìn)水閥關(guān)閉
- 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() //弱單獨(dú)
- {
- num=0;
- num1=0;
- ledruoxi=0;
- ledxidi=0;
- leddandu=0;
- jinshui=0; //打開進(jìn)水閥,進(jìn)水
- delayms(5000);
- jinshui=1;
- flag1=1;
- TR0=1; //啟動(dòng)定時(shí)器T0
- while(flag==0)
- {
- if(flag==0&&num2==1) //弱單獨(dú)洗
- {
- TR0=1;
- flag1=1;
- ruo();
- }
- if(flag==0&&num2==2)//弱單獨(dú)洗暫停
- {
- 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; ////排水閥關(guān)閉
- }
-
- void main()
- {
- init();
- while(1)
- {
- key(); //鍵掃描
- if((num1==0&&num==0)&&circle==1) //標(biāo)準(zhǔn) 強(qiáng)洗
- {
- ledruoxi=1; //關(guān)閉弱洗LED
- ledpaishui=1; //關(guān)閉排水LED
- ledbiaozhun=0;//強(qiáng)標(biāo)準(zhǔn)LED亮
- ledqiangxi=0; //強(qiáng)洗LED亮
- if(num2==1)
- {
- qbiaozhun(); //強(qiáng)標(biāo)準(zhǔn)洗
- }
- if(num2>1) //K3鍵按下次數(shù)為2,暫停洗滌
- {
- ;
- }
- circle=0;
- }
- if(num1==0&&num==1) //經(jīng)濟(jì) 強(qiáng)洗
- {
- ledruoxi=1;
- ledbiaozhun=1;
- ledqiangxi=0;
- ledjingji=0;
- if(num2==1)
- {
- qjingji(); //強(qiáng)經(jīng)濟(jì)洗
- ledjingji=1;
- }
- circle=0;
- }
- if(num1==0&&num==2) //單獨(dú) 強(qiáng)洗
- {
- ledruoxi=1;
- ledjingji=1;
- ledqiangxi=0;
- leddandu=0;
- if(num2==1)
- {
- qdandu(); //強(qiáng)單獨(dú)洗
- leddandu=1;
- }
- circle=0;
- }
- if(num1==0&&num==3)
- {
- ledruoxi=1; //排水 強(qiáng)洗
- leddandu=1;
- ledqiangxi=0;
- ledpaishui=0;
- if(num2==1)
- {
- dpaishui(); //單排水
- ledpaishui=1;
- }
- circle=0;
- }
- if(num1==1&&num==0) //弱 標(biāo)準(zhǔn)
- {
- ledqiangxi=1;
- ledpaishui=1;
- ledruoxi=0;
- ledbiaozhun=0;
- if(num2==1)
- {
- rbiaozhun(); //弱標(biāo)準(zhǔn)洗
- ledruoxi=1;
- }
- circle=0;
- }
- if(num1==1&&num==1) //弱經(jīng)濟(jì)
- {
- ledqiangxi=1;
- ledbiaozhun=1;
- ledruoxi=0;
- ledjingji=0;
- if(num2==1)
- {
- rjingji(); //弱經(jīng)濟(jì)洗
- ledruoxi=1;
- ledjingji=1;
- }
- circle=0;
- }
- if(num1==1&&num==2)
- {
- ledqiangxi=1;
- ledjingji=1;
- ledruoxi=0;
- leddandu=0;
- if(num2==1)
- {
- rdandu(); //弱單獨(dú)洗
- 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 //定時(shí)
- {
- TH0=(65536-50000)/256; //重賦初值
- TL0=(65536-50000)%256;
- num3++; //定時(shí)計(jì)數(shù)加1
- if(num3==20) //1秒時(shí)間到
- {
- num3=0; //計(jì)數(shù)清0
- if(flag1==1)
- ledxidi=~ledxidi; //洗滌指示取反
- if(flag1==2)
- ledpiaoxi=~ledpiaoxi; //漂洗指示取反
- if(flag1==3)
- ledtuoshui=~ledtuoshui; //脫水指示取反
- num4++;
- num5++;
- num6++;
- if(num4==15) //洗滌定時(shí),15秒到
- {
- num4=0; //清0
- flag++; //標(biāo)志洗滌次數(shù)
- }
- if(num5==5) //強(qiáng)洗周期,5秒到
- {
- num5=0;
- flag4++; //強(qiáng)洗標(biāo)志加1
- if(flag4==2)
- flag4=0;
- }
- if(num6==3) //弱洗周期 ,3秒到
- {
- num6=0;
- flag5++; //弱洗標(biāo)志加1
- if(flag5==2)
- flag5=0;
- }
- }
- }
-
- void int0() interrupt 0 //外部中斷0 ,K3鍵
- {
- num2++; //K3按下計(jì)數(shù)加1 ,num2為1運(yùn)行,num2為2暫停
- if(num2==3)
- num2=1;
- }
復(fù)制代碼
Keil5代碼與Proteus8.8仿真下載:
51單片機(jī)全自動(dòng)洗衣機(jī).zip
(323.04 KB, 下載次數(shù): 89)
2022-5-13 17:13 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|