|
采用AT89C51單片機(jī)設(shè)計(jì)全自動(dòng)洗衣機(jī),洗衣機(jī)具有標(biāo)準(zhǔn)洗衣、經(jīng)濟(jì)洗衣、單獨(dú)洗衣以及排水四種洗衣工作程序,強(qiáng)洗、弱洗,運(yùn)行/暫停,顯示及報(bào)警功能,利用Protues仿真軟件觀察洗衣機(jī)的運(yùn)行狀態(tài)和過程。
程序:
- //版本:V1.0
- //日期:3.27
- //功能:基于89C51的全自動(dòng)洗衣機(jī)
- //備注:沒有脫水時(shí)的防振功能
- /***************************頭文件***********************/
- #include <reg51.h>
- /************************數(shù)據(jù)類型宏定義******************/
- #define uchar unsigned char
- #define uint unsigned int
- /***********************使能、禁止宏定義*****************/
- #define Enable(); EA=1;
- #define Disable(); EA=0;
- /********************程序選擇功能標(biāo)志宏定義**************/
- #define BIAOZHUN 0
- #define JINGJI 1
- #define DANDU 2
- #define PAISHUI 3
- /********************強(qiáng)弱選擇功能標(biāo)志宏定義**************/
- #define QIANGXI 0
- #define RUOXI 1
- /*******************進(jìn)水、排水時(shí)間限制宏定義*************/
- #define T_JinShui 240 //4min*60s
- #define T_PaiShui 60 //1min*60s
- #define T_XiDi 360 //6min*60s
- #define T_PiaoXi_1 240 //4min*60s
- #define T_PiaoXi_2 120 //2min*60s
- #define T_TuoShui 120 //2min*60s
- /**********************電機(jī)控制宏定義********************/
- #define ZHENGZHUAN 0
- #define STOP 1
- #define FANZHUAN 2
- #define ZhengZhuan(); PIN_Motor_A = 0; PIN_Motor_B = 1;
- #define Stop(); PIN_Motor_A = 1; PIN_Motor_B = 1;
- #define FanZhuan(); PIN_Motor_A = 1; PIN_Motor_B = 0;
- /*******************暫停、繼續(xù)控制宏定義*****************/
- #define ZanTing(); ET0 = 0; ET1 = 0; Stop();
- #define JiXu(); ET0 = 1; ET1 = 1;
- #define flag_Ok (flag_JinShui||flag_PaiShui||flag_XiDi||flag_PiaoXi||flag_TuoShui)
- /*************************管腳定義***********************/
- sbit LED_BiaoZhun = P1^0; //標(biāo)準(zhǔn)程序顯示燈
- sbit LED_JingJi = P1^1; //經(jīng)濟(jì)程序顯示燈
- sbit LED_DanDu = P1^2; //單獨(dú)程序顯示燈
- sbit LED_PaiShui = P1^3; //排水程序顯示燈
- sbit LED_QiangXi = P1^4; //強(qiáng)洗狀態(tài)燈
- sbit LED_RuoXi = P1^5; //弱洗狀態(tài)燈
- sbit LED_XiDi = P1^6; //洗滌狀態(tài)燈
- sbit LED_PiaoXi = P1^7; //漂洗狀態(tài)燈
- sbit LED_TuoShui = P2^0; //脫水狀態(tài)燈
- sbit PIN_BaoJing = P2^1; //報(bào)警喇叭
- sbit PIN_JinShui = P2^2; //進(jìn)水控制
- sbit PIN_PaiShui = P2^3; //排誰控制
- sbit PIN_Motor_A = P2^4; //電機(jī)腳A
- sbit PIN_Motor_B = P2^5; //電機(jī)腳B
- sbit K_SEL_ChengXu = P3^0; //選擇程序鍵
- sbit K_SEL_QiangRuo = P3^1; //選擇強(qiáng)弱鍵
- sbit p32 = P3^2; //
- sbit p33 = P3^3; //
- sbit SW_ShuiWei = P3^6; //水位開關(guān)
- sbit SW_AnQuan = P3^7; //安全開關(guān)
- /************************函數(shù)申明***********************/
- void Programme_PaiShui(void);
- /*************************數(shù)據(jù)定義***********************/
- uchar flag_SEL_ChengXu; //默認(rèn)為標(biāo)準(zhǔn)程序,
- bit flag_SEl_QiangRuo; //默認(rèn)為強(qiáng)洗,1為弱洗
- bit flag_Run; //運(yùn)行標(biāo)志,1為運(yùn)行
- bit flag_JinShui; //進(jìn)水標(biāo)志,1為進(jìn)水
- bit flag_PaiShui; //排水標(biāo)志,1為排水
- bit flag_XiDi; //置洗滌標(biāo)志
- bit flag_PiaoXi; //置漂洗標(biāo)志
- bit flag_TuoShui; //脫水標(biāo)志
- bit flag_BaoJing; //報(bào)警標(biāo)志
- uchar _50ms; //每50ms加一次的變量
- uint s; //秒
- uint T_S; //定時(shí)總時(shí)間
- uchar T_Motor; //電機(jī)控制時(shí)間
- /*************************延時(shí)程序*********************/
- void Delay_10ms(uint T1)
- { uint t1,t2;
- for(t1=0;t1<T1;t1++)
- for(t2=0;t2<1250;t2++);//10ms
- }
- /**********************管腳初始化程序******************/
- void Pin_Init(void)
- { LED_BiaoZhun = 0; //默認(rèn)為標(biāo)準(zhǔn)程序,燈亮
- LED_JingJi = 1; //經(jīng)濟(jì)程序顯示燈,滅
- LED_DanDu = 1; //單獨(dú)程序顯示燈,滅
- LED_PaiShui = 1; //排水程序顯示燈,滅
- LED_QiangXi = 0; //默認(rèn)為強(qiáng)洗狀態(tài),燈亮
- LED_RuoXi = 1; //弱洗狀態(tài)燈,滅
- LED_XiDi = 1; //洗滌狀態(tài)燈,運(yùn)行后燈亮
- LED_PiaoXi = 1; //漂洗狀態(tài)燈,運(yùn)行后燈亮
- LED_TuoShui = 1; //脫水狀態(tài)燈,運(yùn)行后燈亮
- PIN_BaoJing = 1; //報(bào)警喇叭,不叫
- PIN_JinShui = 1; //進(jìn)水控制,關(guān)
- PIN_PaiShui = 1; //排誰控制,關(guān)
- PIN_Motor_A = 1; //電機(jī)腳A,不走
- PIN_Motor_B = 1; //電機(jī)腳B,不走
- }
- /********************中斷初始化程序********************/
- void ExInt_Init(void)
- { IT0 = 1;
- EX0 = 1;
- IT1 = 1;
- EX1 = 1;
- }
- /*******************定時(shí)器0初始化程序******************/
- void Timer0_Init(void) //其中沒ET0是為以后控制暫停用的
- { TMOD = TMOD | 0X01; //定時(shí)方式1
- TH0 = 0X3C; //50ms
- TL0 = 0XB0;
- TR0 = 1;
- _50ms = 0;
- s = 0;
- }
- /*******************定時(shí)器1初始化程序******************/
- void Timer1_Init(void) //其中沒ET1是為以后控制暫停用的
- { TMOD = TMOD | 0X10; //定時(shí)方式1
- TH1 = 0X3C; //50ms
- TL1 = 0XB0;
- }
- /********************電機(jī)初始化程序********************/
- void T_Motor_Ctl(uchar t1,uchar t2,uchar t3)
- { if(!flag_SEl_QiangRuo)//強(qiáng)洗
- T_Motor = t1;
- if(flag_SEl_QiangRuo)//弱洗
- T_Motor = t2;
- if(flag_TuoShui) //脫水
- T_Motor = t3;
- }
- /********************電機(jī)初始化程序********************/
- void Motor_Init(void)
- { ZhengZhuan();
- T_Motor_Ctl(4,3,5);
- }
- /**********************解除報(bào)警************************/
- void No_BaoJing(void)
- { flag_BaoJing= 0; //置報(bào)警標(biāo)志
- PIN_BaoJing = 1; //報(bào)警喇叭
- TR1 = 0;
- //而進(jìn)水、排水已沒時(shí)間限制了
- }
- /*******外部中斷0程序?yàn)檫\(yùn)行、解除報(bào)警或者暫停***********/
- void int0(void) interrupt 0
- {
- if(!p32)
- { Delay_10ms(1); //延時(shí)10ms左右,去抖動(dòng)
- if(!p32)
- { if(!flag_Run)
- flag_Run = 1; //置運(yùn)行標(biāo)志
- else if(flag_BaoJing)
- No_BaoJing(); //解除報(bào)警
- else if(flag_Ok)
- { static bit flag_ZanTing;
- flag_ZanTing = ~flag_ZanTing;
- if(flag_ZanTing)
- {ZanTing();}//必須加{}
- else
- {JiXu();} //必須加{}
- }//end else
- }//end if(!p32) 2
- }//end if(!p32) 1
- }
- /**********************報(bào)警程序************************/
- void BaoJing(void)
- { flag_BaoJing= 1; //置報(bào)警標(biāo)志
- TR0 = 0;
- TR1 = 1;
- }
- /*******************時(shí)間到處理程序*********************/
- void Ok_Timer(void)
- { s = 0;
- if(flag_JinShui || flag_PaiShui) //進(jìn)水中~、排水中~
- { BaoJing(); //報(bào)警程序
- }//end if(flag_JinShui || flag_PaiShui)
- else
- { flag_XiDi = 0; //清洗滌標(biāo)志
- flag_PiaoXi = 0; //清漂洗標(biāo)志
- flag_TuoShui= 0; //清脫水標(biāo)志
- Stop();
- }//end else
- }
- /********************電機(jī)控制程序**********************/
- void Motor(void)
- { static uchar s_Motor;
- s_Motor++;
- if(s_Motor==T_Motor)
- { static uchar Motors;
- s_Motor = 0;
- Motors++;
- if(Motors==3)
- Motors = 0;
- switch(Motors)
- { case ZHENGZHUAN : ZhengZhuan();
- T_Motor_Ctl(4,3,5);
- break;
- case STOP : Stop();
- T_Motor_Ctl(1,2,2);
- break;
- case FANZHUAN : FanZhuan();
- T_Motor_Ctl(4,3,5);
- break;
- default : break;
- }//end switch
- }//end if
- }
- /*******************定時(shí)器0中斷程序********************/
- void Timer0(void) interrupt 1
- {
- TR0 = 0; //停止計(jì)數(shù)
- TH0 = 0X3C; //重裝定時(shí)器值
- TL0 = 0XB0;
- TR0 = 1;
- _50ms++;
- if(_50ms == 20) //1s到
- { _50ms = 0;
- s++;
- if(s == T_S) //定時(shí)到
- Ok_Timer();
- if(flag_XiDi || flag_PiaoXi || flag_TuoShui)
- Motor(); //電機(jī)控制程序
- }//end if(_50ms == 20)
- }//end Timer0()
- /**********外部中斷1程序?yàn)樗坏交蛘呱w開處理***********/
- void int1(void) interrupt 2
- { if(!p33)
- { Delay_10ms(1); //延時(shí)10ms左右,去抖動(dòng)
- if(!p33)
- {
- }//end if(!p33) 2
- }//end if(!p33) 1
- }
- /************定時(shí)器1中斷程序作為閃爍及報(bào)警**************/
- void Timer1(void) interrupt 3
- { static uchar _50ms; //每50ms加一次的變量
- TR1 = 0; //停止計(jì)數(shù)
- TH1 = 0X3C; //重裝定時(shí)器值
- TL1 = 0XB0;
- TR1 = 1;
- _50ms++;
- if(_50ms == 14) //0.7s到
- { _50ms = 0;
- if(flag_XiDi) //洗滌中~
- LED_XiDi = ~LED_XiDi; //洗滌狀態(tài)燈閃爍
- if(flag_PiaoXi) //漂洗中~
- LED_PiaoXi = ~LED_PiaoXi; //漂洗狀態(tài)燈閃爍
- if(flag_TuoShui) //脫水中~
- LED_TuoShui = ~LED_TuoShui; //脫水狀態(tài)燈閃爍
- if(flag_BaoJing)
- PIN_BaoJing = ~PIN_BaoJing; //報(bào)警
- }//end if(_50ms == 14)
- }
- /**********************程序選擇程序********************/
- void SEL_ChengXU(void)
- { if(!K_SEL_ChengXu) //程序選擇鍵
- { Delay_10ms(1); //延時(shí)10ms左右,去抖動(dòng)
- if(!K_SEL_ChengXu)
- { while(!K_SEL_ChengXu);
- flag_SEL_ChengXu++;
- if(flag_SEL_ChengXu==4)
- flag_SEL_ChengXu = 0;
- switch(flag_SEL_ChengXu)
- { case BIAOZHUN : LED_BiaoZhun= 0; //亮
- LED_JingJi = 1; //滅
- LED_DanDu = 1; //滅
- LED_PaiShui = 1; //滅
- break;
- case JINGJI : LED_BiaoZhun= 1;
- LED_JingJi = 0;
- LED_DanDu = 1;
- LED_PaiShui = 1;
- break;
- case DANDU : LED_BiaoZhun= 1;
- LED_JingJi = 1;
- LED_DanDu = 0;
- LED_PaiShui = 1;
- break;
- case PAISHUI : LED_BiaoZhun= 1;
- LED_JingJi = 1;
- LED_DanDu = 1;
- LED_PaiShui = 0;
- break;
- default : break;
- }//end switch
- }//end if(!K_Sel_ChengXu) 2
- }//end if(!K_Sel_ChengXu) 1
- }//END
- /********************強(qiáng)弱選擇程序**********************/
- void SEL_QiangRuo(void)
- { if(!K_SEL_QiangRuo) //強(qiáng)弱選擇鍵
- { Delay_10ms(1); //延時(shí)10ms左右,去抖動(dòng)
- if(!K_SEL_QiangRuo)
- { while(!K_SEL_QiangRuo);
- flag_SEl_QiangRuo = ~flag_SEl_QiangRuo;
- if(!flag_SEl_QiangRuo)
- { LED_QiangXi = 0; //強(qiáng)洗狀態(tài),燈亮
- LED_RuoXi = 1; //弱洗狀態(tài)燈,滅
- }//end if(!flag_SEl_QiangRuo)
- else
- { LED_QiangXi = 1; //強(qiáng)洗狀態(tài),燈亮
- LED_RuoXi = 0; //弱洗狀態(tài)燈,滅
- }//end else
- }//end if(!K_SEL_QiangRuo) 2
- }//end if(!K_SEL_QiangRuo) 1
- }
- /**********************進(jìn)水程序***********************/
- void JinShui(void)
- { PIN_JinShui = 0;
- flag_JinShui = 1;
- TR1 = 0;
- Timer0_Init();
- T_S = T_JinShui;
- while(SW_ShuiWei);
- PIN_JinShui = 1;
- flag_JinShui = 0;
- TR0 = 0;
- TF0 = 0;
- }
- /**********************排水程序***********************/
- void PaiShui(void)
- { PIN_PaiShui = 0;
- flag_PaiShui = 1;
- TR1 = 0;
- Timer0_Init();
- T_S = T_PaiShui;
- while(!SW_ShuiWei);
- TR0 = 0;
- TF0 = 0;
- Delay_10ms(500);//延時(shí)50s,經(jīng)驗(yàn)值5000
- PIN_PaiShui = 1;
- flag_PaiShui = 0;
- }
- /**********************洗滌程序***********************/
- void XiDi(void)
- { flag_XiDi = 1;
- TR1 = 1;
- Timer0_Init();
- T_S = T_XiDi;
- Motor_Init();
- while(flag_XiDi);
- TR1 = 0;
- LED_XiDi = 1;
- }
- /**********************漂洗程序***********************/
- void PiaoXi(uchar t)
- { flag_PiaoXi = 1;
- TR1 = 1;
- Timer0_Init();
- T_S = t;
- Motor_Init();
- while(flag_PiaoXi);
- }
- /*********************蓋開保護(hù)程序********************/
- void BaoHu_GaiKai(void)
- { if(SW_AnQuan) //蓋開
- { ZanTing();
- LED_TuoShui = 0;
- }//end if
- else
- { JiXu(); //電機(jī)不用管,最多5s不轉(zhuǎn)
- }//end else
- }
- /***********************脫水程序**********************/
- void TuoShui(void)
- { flag_TuoShui = 1;
- PIN_PaiShui = 0;
- TR1 = 1;
- Timer0_Init();
- T_S = T_TuoShui;
- Motor_Init();
- while(flag_TuoShui)
- { BaoHu_GaiKai();
- }//end while
- TR1 = 0;
- LED_TuoShui = 1; //而出水閥一直開著
- }
- /********************標(biāo)準(zhǔn)洗衣程序*********************/
- void Programme_BiaoZhun(void)
- { LED_XiDi = 0; //洗滌狀態(tài)燈
- LED_PiaoXi = 0; //漂洗狀態(tài)燈
- LED_TuoShui = 0; //脫水狀態(tài)燈
- JinShui();
- XiDi();
- PaiShui();
- JinShui();
- PiaoXi(T_PiaoXi_1);//4min*60s//4*60
- PaiShui();
- JinShui();
- PiaoXi(T_PiaoXi_2);//2min*60s//2*60
- Programme_PaiShui();
- }
- /********************經(jīng)濟(jì)洗衣程序*********************/
- void Programme_JingJi(void)
- { TR1 = 0;
- LED_XiDi = 0; //洗滌狀態(tài)燈
- LED_PiaoXi = 0; //漂洗狀態(tài)燈
- LED_TuoShui = 0; //脫水狀態(tài)燈
- JinShui();
- XiDi();
- PaiShui();
- JinShui();
- PiaoXi(T_PiaoXi_1);//4min*60s
- Programme_PaiShui();
- }
- /********************單獨(dú)洗衣程序*********************/
- void Programme_DanDu(void)
- { LED_XiDi = 0; //洗滌狀態(tài)燈
- LED_PiaoXi = 1; //漂洗狀態(tài)燈
- LED_TuoShui = 1; //脫水狀態(tài)燈
- JinShui();
- XiDi();
- }
- /********************排水洗衣程序*********************/
- void Programme_PaiShui(void)
- { LED_XiDi = 1; //洗滌狀態(tài)燈
- LED_PiaoXi = 1; //漂洗狀態(tài)燈
- LED_TuoShui = 0; //脫水狀態(tài)燈
- PaiShui();
- TuoShui();
- }
- /************************主程序************************/
- void main()
- {
- Pin_Init(); //管腳初始化
- ExInt_Init(); //外中斷初始化
- Timer1_Init();
- ET0 = 1;
- ET1 = 1;
- Enable(); //開總中斷
- while(1)
- { if(!flag_Run) //運(yùn)行前按鍵才有效
- { SEL_ChengXU(); //程序選擇程序
- SEL_QiangRuo(); //強(qiáng)弱選擇程序
- }//end if(!flag_Run)
- if(flag_Run)//用else不,按啟動(dòng)鍵后,有時(shí)沒反映????//
- { PIN_PaiShui = 1; //關(guān)排水閥
- switch(flag_SEL_ChengXu)
- { case BIAOZHUN : Programme_BiaoZhun(); //標(biāo)準(zhǔn)洗衣程序
- break;
- case JINGJI : Programme_JingJi(); //經(jīng)濟(jì)洗衣程序
- break;
- case DANDU : Programme_DanDu(); //單獨(dú)洗衣程序
- break;
- case PAISHUI : Programme_PaiShui(); //排水洗衣程序
- break;
- default : break;
- }//end switch
- }//end esle
- flag_Run = 0;
- }//end while
- }//end main
復(fù)制代碼
全部資料下載:
基于51單片機(jī)的全自動(dòng)洗衣機(jī)控制系統(tǒng)(完整程序和Proteus仿真)【驗(yàn)證過】.7z
(39.61 KB, 下載次數(shù): 736)
2020-7-9 00:58 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|