|
給大家分享一個51單片機做的全自動洗衣機的proteus仿真,下面是仿真原理圖,可看出功能十分強大,按鍵很多。全部的源碼可以下載本帖附件:
0.png (42.57 KB, 下載次數: 96)
下載附件
2017-3-5 23:22 上傳
0.png (24.51 KB, 下載次數: 88)
下載附件
2017-3-5 23:22 上傳
0.png (67.8 KB, 下載次數: 88)
下載附件
2017-3-5 23:21 上傳
仿真工程文件及全部源碼下載:
基于89C51的全自動洗衣機控制系統.rar
(83.44 KB, 下載次數: 362)
2017-3-5 23:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
單片機源程序:
- /***************************頭文件***********************/
- #include <reg51.h>
- /************************數據類型宏定義******************/
- #define uchar unsigned char
- #define uint unsigned int
- /***********************使能、禁止宏定義*****************/
- #define Enable(); EA=1;
- #define Disable(); EA=0;
- /********************程序選擇功能標志宏定義**************/
- #define BIAOZHUN 0
- #define JINGJI 1
- #define DANDU 2
- #define PAISHUI 3
- /********************強弱選擇功能標志宏定義**************/
- #define QIANGXI 0
- #define RUOXI 1
- /*******************進水、排水時間限制宏定義*************/
- #define T_JinShui 10 //4min*60s
- #define T_PaiShui 10 //1min*60s
- #define T_XiDi 10 //6min*60s
- #define T_PiaoXi_1 10 //4min*60s
- #define T_PiaoXi_2 10 //2min*60s
- #define T_TuoShui 10 //2min*60s
- /**********************電機控制宏定義********************/
- #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;
- /*******************暫停、繼續控制宏定義*****************/
- #define ZanTing(); ET0 = 0; ET1 = 0; Stop();
- #define JiXu(); ET0 = 1; ET1 = 1;
- /*************************管腳定義***********************/
- //都是低有效,因LED是灌電流,而PNP也是低電平時導通
- sbit LED_BiaoZhun = P1^0; //標準程序顯示燈
- sbit LED_JingJi = P1^1; //經濟程序顯示燈
- sbit LED_DanDu = P1^2; //單獨程序顯示燈
- sbit LED_PaiShui = P1^3; //排水程序顯示燈
- sbit LED_QiangXi = P1^4; //強洗狀態燈
- sbit LED_RuoXi = P1^5; //弱洗狀態燈
- sbit LED_XiDi = P1^6; //洗滌狀態燈
- sbit LED_PiaoXi = P1^7; //漂洗狀態燈
- sbit LED_TuoShui = P2^0; //脫水狀態燈
- sbit PIN_BaoJing = P2^1; //報警喇叭
- sbit PIN_JinShui = P2^2; //進水控制
- sbit PIN_PaiShui = P2^3; //排誰控制
- sbit PIN_Motor_A = P2^4; //電機腳A
- sbit PIN_Motor_B = P2^5; //電機腳B
- sbit K_SEL_ChengXu = P3^0; //選擇程序鍵
- sbit K_SEL_QiangRuo = P3^1; //選擇強弱鍵
- sbit p32 = P3^2; //
- sbit p33 = P3^3; //
- sbit SW_ShuiWei = P3^6; //水位開關
- sbit SW_AnQuan = P3^7; //安全開關
- /************************函數申明***********************/
- void Programme_PaiShui(void);
- /*************************數據定義***********************/
- uchar flag_SEL_ChengXu; //默認為標準程序,
- bit flag_SEl_QiangRuo; //默認為強洗,1為弱洗
- bit flag_Run; //運行標志,1為運行
- //bit flag_ZanTing; //暫停標志,1為暫停
- bit flag_JinShui; //進水標志,1為進水
- bit flag_PaiShui; //排水標志,1為排水
- bit flag_XiDi; //置洗滌標志
- bit flag_PiaoXi; //置漂洗標志
- bit flag_TuoShui; //脫水標志
- bit flag_BaoJing; //報警標志
- uchar _50ms; //每50ms加一次的變量
- uint s; //秒
- uint T_S; //定時總時間
- uchar T_Motor; //電機控制時間
- /*************************延時程序*********************/
- 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; //默認為標準程序,燈亮
- LED_JingJi = 1; //經濟程序顯示燈,滅
- LED_DanDu = 1; //單獨程序顯示燈,滅
- LED_PaiShui = 1; //排水程序顯示燈,滅
- LED_QiangXi = 0; //默認為強洗狀態,燈亮
- LED_RuoXi = 1; //弱洗狀態燈,滅
- LED_XiDi = 1; //洗滌狀態燈,運行后燈亮
- LED_PiaoXi = 1; //漂洗狀態燈,運行后燈亮
- LED_TuoShui = 1; //脫水狀態燈,運行后燈亮
- PIN_BaoJing = 1; //報警喇叭,不叫
- PIN_JinShui = 1; //進水控制,關
- PIN_PaiShui = 1; //排誰控制,關
- PIN_Motor_A = 1; //電機腳A,不走
- PIN_Motor_B = 1; //電機腳B,不走
- }
- /********************中斷初始化程序********************/
- void ExInt_Init(void)
- { IT0 = 1;
- EX0 = 1;
- IT1 = 1;
- EX1 = 1;
- }
- /*******************定時器0初始化程序******************/
- void Timer0_Init(void) //其中沒ET0是為以后控制暫停用的
- { TMOD = TMOD | 0X01; //定時方式1
- TH0 = 0X3C; //50ms
- TL0 = 0XB0;
- TR0 = 1;
- _50ms = 0;
- s = 0;
- }
- /*******************定時器1初始化程序******************/
- void Timer1_Init(void) //其中沒ET1是為以后控制暫停用的
- { TMOD = TMOD | 0X10; //定時方式1
- TH1 = 0X3C; //50ms
- TL1 = 0XB0;
- }
- /********************電機初始化程序********************/
- void T_Motor_Ctl(uchar t1,uchar t2,uchar t3)
- { if(!flag_SEl_QiangRuo)//強洗
- T_Motor = t1;
- if(flag_SEl_QiangRuo)//弱洗
- T_Motor = t2;
- if(flag_TuoShui)//脫水
- T_Motor = t3;
- }
- /********************電機初始化程序********************/
- void Motor_Init(void)
- { ZhengZhuan();
- T_Motor_Ctl(4,3,5);
- }
- /**********************解除報警************************/
- void No_BaoJing(void)
- { flag_BaoJing= 0; //置報警標志
- PIN_BaoJing = 1; //報警喇叭
- //進水、排水已沒時間限制了
- }
- /**************外部中斷0程序為運行或者暫停*************/
- void int0(void) interrupt 0
- {
- if(!p32)
- { Delay_10ms(1); //延時10ms左右,去抖動
- if(!p32)
- { if(!flag_Run)
- flag_Run = 1; //置運行標志
- else if(flag_BaoJing)
- No_BaoJing();
- else
- { static bit flag_ZanTing;
- flag_ZanTing = ~flag_ZanTing;
- if(flag_ZanTing)
- ZanTing();
- if(!flag_ZanTing) // 這里用else,編譯出錯。????
- JiXu();
- }//end else
- }//end if(!p32) 2
- }//end if(!p32) 1
- }
- /**********************報警程序************************/
- void BaoJing(void)
- { flag_BaoJing= 1; //置報警標志
- PIN_BaoJing = 0; //報警喇叭
- TR0 = 0;
- }
- /*******************時間到處理程序*********************/
- void Ok_Timer(void)
- { s = 0;
- if(flag_JinShui || flag_PaiShui) //進水中~、排水中~
- { BaoJing(); //報警程序
- }//end if(flag_JinShui || flag_PaiShui)
- else
- { flag_XiDi = 0; //清洗滌標志
- flag_PiaoXi = 0; //清漂洗標志
- flag_TuoShui= 0; //清脫水標志
- Stop();
- }//end else
- }
- /********************電機控制程序**********************/
- 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
- }
- /*******************定時器0中斷程序********************/
- void Timer0(void) interrupt 1
- {
- TR0 = 0; //停止計數
- TH0 = 0X3C; //重裝定時器值
- TL0 = 0XB0;
- TR0 = 1;
- _50ms++;
- if(_50ms == 20) //1s到
- { _50ms = 0;
- s++;
- if(s == T_S) //定時到
- Ok_Timer();
- if(flag_XiDi || flag_PiaoXi || flag_TuoShui)
- Motor(); //電機控制程序
- }//end if(_50ms == 20)
- }//end Timer0()
- /**********外部中斷1程序為水位到或者蓋開處理***********/
- void int1(void) interrupt 2
- { if(!p33)
- { Delay_10ms(1); //延時10ms左右,去抖動
- if(!p33)
- {
- }//end if(!p33) 2
- }//end if(!p33) 1
- }
- /***************定時器1中斷程序作為閃爍****************/
- void Timer1(void) interrupt 3
- { static uchar _50ms; //每50ms加一次的變量
- TR1 = 0; //停止計數
- TH1 = 0X3C; //重裝定時器值
- TL1 = 0XB0;
- TR1 = 1;
- _50ms++;
- if(_50ms == 14) //0.7s到
- { _50ms = 0;
- if(flag_XiDi) //洗滌中~
- LED_XiDi = ~LED_XiDi; //洗滌狀態燈閃爍
- if(flag_PiaoXi) //漂洗中~
- LED_PiaoXi = ~LED_PiaoXi; //漂洗狀態燈閃爍
- if(flag_TuoShui) //脫水中~
- LED_TuoShui = ~LED_TuoShui; //脫水狀態燈閃爍
- }//end if(_50ms == 14)
- }
- /**********************程序選擇程序********************/
- void SEL_ChengXU(void)
- { if(!K_SEL_ChengXu) //程序選擇鍵
- { Delay_10ms(1); //延時10ms左右,去抖動
- 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
- /********************強弱選擇程序**********************/
- void SEL_QiangRuo(void)
- { if(!K_SEL_QiangRuo) //強弱選擇鍵
- { Delay_10ms(1); //延時10ms左右,去抖動
- if(!K_SEL_QiangRuo)
- { while(!K_SEL_QiangRuo);
- flag_SEl_QiangRuo = ~flag_SEl_QiangRuo;
- if(!flag_SEl_QiangRuo)
- { LED_QiangXi = 0; //強洗狀態,燈亮
- LED_RuoXi = 1; //弱洗狀態燈,滅
- }//end if(!flag_SEl_QiangRuo)
- else
- { LED_QiangXi = 1; //強洗狀態,燈亮
- LED_RuoXi = 0; //弱洗狀態燈,滅
- }//end else
- }//end if(!K_SEL_QiangRuo) 2
- }//end if(!K_SEL_QiangRuo) 1
- }
- /**********************進水程序***********************/
- 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);//延時50s,經驗值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);
- }
- /*********************蓋開保護程序********************/
- void BaoHu_GaiKai(void)
- { if(SW_AnQuan) //蓋開
- { ZanTing();
- LED_TuoShui = 0;
- }//end if
- else
- { JiXu(); //電機不用管,最多5s不轉
- }//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; //而出水閥一直開著
- }
- /********************標準洗衣程序*********************/
- void Programme_BiaoZhun(void)
- { LED_XiDi = 0; //洗滌狀態燈
- LED_PiaoXi = 0; //漂洗狀態燈
- LED_TuoShui = 0; //脫水狀態燈
- JinShui();
- XiDi();
- PaiShui();
- JinShui();
- PiaoXi(T_PiaoXi_1);//4min*60s//4*60
- PaiShui();
- JinShui();
- PiaoXi(T_PiaoXi_2);//2min*60s//2*60
- Programme_PaiShui();
- }
- /********************經濟洗衣程序*********************/
- void Programme_JingJi(void)
- { TR1 = 0;
- LED_XiDi = 0; //洗滌狀態燈
- LED_PiaoXi = 0; //漂洗狀態燈
- LED_TuoShui = 0; //脫水狀態燈
- JinShui();
- XiDi();
- PaiShui();
- JinShui();
- PiaoXi(T_PiaoXi_1);//4min*60s
- Programme_PaiShui();
- }
- /********************單獨洗衣程序*********************/
- void Programme_DanDu(void)
- { LED_XiDi = 0; //洗滌狀態燈
- LED_PiaoXi = 1; //漂洗狀態燈
- LED_TuoShui = 1; //脫水狀態燈
- JinShui();
- XiDi();
- }
- /********************排水洗衣程序*********************/
- void Programme_PaiShui(void)
- { LED_XiDi = 1; //洗滌狀態燈
- LED_PiaoXi = 1; //漂洗狀態燈
- LED_TuoShui = 0; //脫水狀態燈
- PaiShui();
- TuoShui();
- }
- /************************主程序************************/
- void main()
- {
- Pin_Init(); //管腳初始化
- ExInt_Init(); //外中斷初始化
- Timer1_Init();
- ET0 = 1;
- ET1 = 1;
- Enable(); //開總中斷
- while(1)
- { if(!flag_Run) //運行前按鍵才有效
- { SEL_ChengXU(); //程序選擇程序
- SEL_QiangRuo(); //強弱選擇程序
- }//end if(!flag_Run)
- if(flag_Run)//用else不,按啟動鍵后,有時沒反映????//
- { PIN_PaiShui = 1; //關排水閥
- switch(flag_SEL_ChengXu)
- { case BIAOZHUN : Programme_BiaoZhun(); //標準洗衣程序
- break;
- case JINGJI : Programme_JingJi(); //經濟洗衣程序
- break;
- case DANDU : Programme_DanDu(); //單獨洗衣程序
- break;
- case PAISHUI : Programme_PaiShui(); //排水洗衣程序
- break;
- default : break;
- }//end switch
- }//end esle
- flag_Run = 0;
- }//end while
- }//end main
復制代碼
|
|