找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8955|回复: 10
打印 上一主题 下一主题
收起左侧

单片机全自动洗衣机控制系统proteus仿真及源程序

  [复制链接]
跳转到指定楼层
楼主

给大家分享一个51单片机做的全自动洗衣机的proteus仿真,下面是仿真原理图,可看出功能十分强大,按键很多。全部的源码可以下载本帖附件:



仿真工程文件及全部源码下载:
基于89C51的全自动洗衣机控制系统.rar (83.44 KB, 下载次数: 357)





单片机源程序:
  1. /***************************头文件***********************/
  2. #include         <reg51.h>
  3. /************************数据类型宏定义******************/
  4. #define         uchar        unsigned char
  5. #define                uint        unsigned int
  6. /***********************使能、禁止宏定义*****************/
  7. #define                Enable();        EA=1;
  8. #define                Disable();        EA=0;
  9. /********************程序选择功能标志宏定义**************/
  10. #define                BIAOZHUN                0
  11. #define                JINGJI                        1
  12. #define                DANDU                        2
  13. #define                PAISHUI                        3
  14. /********************强弱选择功能标志宏定义**************/
  15. #define                QIANGXI                        0
  16. #define                RUOXI                        1        
  17. /*******************进水、排水时间限制宏定义*************/
  18. #define                T_JinShui                10                //4min*60s
  19. #define                T_PaiShui                10                //1min*60s
  20. #define                T_XiDi                        10                //6min*60s
  21. #define                T_PiaoXi_1                10                //4min*60s
  22. #define                T_PiaoXi_2                10                //2min*60s
  23. #define                T_TuoShui                10                //2min*60s
  24. /**********************电机控制宏定义********************/
  25. #define                ZHENGZHUAN                0
  26. #define                STOP                        1
  27. #define                FANZHUAN                2
  28. #define                ZhengZhuan();        PIN_Motor_A = 0; PIN_Motor_B = 1;
  29. #define                Stop();                        PIN_Motor_A = 1; PIN_Motor_B = 1;
  30. #define                FanZhuan();                PIN_Motor_A = 1; PIN_Motor_B = 0;
  31. /*******************暂停、继续控制宏定义*****************/
  32. #define                ZanTing();                ET0 = 0; ET1 = 0; Stop();
  33. #define                JiXu();                        ET0 = 1; ET1 = 1;
  34. /*************************管脚定义***********************/
  35. //都是低有效,因LED是灌电流,而PNP也是低电平时导通
  36. sbit        LED_BiaoZhun        =        P1^0;        //标准程序显示灯
  37. sbit        LED_JingJi                =        P1^1;        //经济程序显示灯
  38. sbit        LED_DanDu                =        P1^2;        //单独程序显示灯
  39. sbit        LED_PaiShui                =        P1^3;        //排水程序显示灯
  40. sbit        LED_QiangXi                =        P1^4;        //强洗状态灯
  41. sbit        LED_RuoXi                =        P1^5;        //弱洗状态灯
  42. sbit        LED_XiDi                =        P1^6;        //洗涤状态灯
  43. sbit        LED_PiaoXi                =        P1^7;        //漂洗状态灯
  44. sbit        LED_TuoShui                =        P2^0;        //脱水状态灯
  45. sbit        PIN_BaoJing                =        P2^1;        //报警喇叭
  46. sbit        PIN_JinShui                =        P2^2;        //进水控制
  47. sbit        PIN_PaiShui                =        P2^3;        //排谁控制
  48. sbit        PIN_Motor_A                =        P2^4;        //电机脚A
  49. sbit        PIN_Motor_B                =        P2^5;        //电机脚B
  50. sbit        K_SEL_ChengXu        =        P3^0;        //选择程序键
  51. sbit        K_SEL_QiangRuo        =        P3^1;        //选择强弱键
  52. sbit        p32                                =        P3^2;        //
  53. sbit        p33                                =        P3^3;        //
  54. sbit        SW_ShuiWei                =        P3^6;        //水位开关
  55. sbit        SW_AnQuan                =        P3^7;        //安全开关
  56. /************************函数申明***********************/
  57. void Programme_PaiShui(void);
  58. /*************************数据定义***********************/
  59. uchar        flag_SEL_ChengXu;                        //默认为标准程序,                        
  60. bit                flag_SEl_QiangRuo;                        //默认为强洗,1为弱洗
  61. bit                flag_Run;                                        //运行标志,1为运行
  62. //bit                flag_ZanTing;                                //暂停标志,1为暂停
  63. bit                flag_JinShui;                                //进水标志,1为进水
  64. bit                flag_PaiShui;                                //排水标志,1为排水
  65. bit                flag_XiDi;                                        //置洗涤标志
  66. bit                flag_PiaoXi;                                //置漂洗标志
  67. bit                flag_TuoShui;                                //脱水标志
  68. bit                flag_BaoJing;                                //报警标志
  69. uchar         _50ms;                                                //每50ms加一次的变量
  70. uint        s;                                                        //秒
  71. uint        T_S;                                                //定时总时间
  72. uchar        T_Motor;                                        //电机控制时间
  73. /*************************延时程序*********************/
  74. void Delay_10ms(uint T1)        
  75. {        uint t1,t2;
  76.         for(t1=0;t1<T1;t1++)
  77.                 for(t2=0;t2<1250;t2++);//10ms
  78. }
  79. /**********************管脚初始化程序******************/
  80. void Pin_Init(void)                                       
  81. {        LED_BiaoZhun        =        0;                        //默认为标准程序,灯亮
  82.          LED_JingJi                =        1;                        //经济程序显示灯,灭
  83.          LED_DanDu                =        1;                        //单独程序显示灯,灭
  84.          LED_PaiShui                =        1;                        //排水程序显示灯,灭
  85.          LED_QiangXi                =        0;                        //默认为强洗状态,灯亮
  86.          LED_RuoXi                =        1;                        //弱洗状态灯,灭
  87.          LED_XiDi                =        1;                        //洗涤状态灯,运行后灯亮
  88.          LED_PiaoXi                =        1;                        //漂洗状态灯,运行后灯亮
  89.          LED_TuoShui                =        1;                        //脱水状态灯,运行后灯亮
  90.          PIN_BaoJing                =        1;                        //报警喇叭,不叫
  91.          PIN_JinShui                =        1;                        //进水控制,关
  92.          PIN_PaiShui                =        1;                        //排谁控制,关
  93.          PIN_Motor_A                =        1;                        //电机脚A,不走
  94.          PIN_Motor_B                =        1;                        //电机脚B,不走
  95. }
  96. /********************中断初始化程序********************/
  97. void ExInt_Init(void)                                
  98. {        IT0        =        1;
  99.         EX0        =        1;
  100.         IT1        =        1;
  101.         EX1        =        1;
  102. }
  103. /*******************定时器0初始化程序******************/
  104. void Timer0_Init(void)                                //其中没ET0是为以后控制暂停用的        
  105. {        TMOD         =        TMOD | 0X01;                //定时方式1
  106.         TH0                =        0X3C;                                //50ms
  107.         TL0                =        0XB0;        
  108.         TR0                =         1;
  109.         _50ms         =         0;
  110.         s = 0;
  111. }
  112. /*******************定时器1初始化程序******************/
  113. void Timer1_Init(void)                                //其中没ET1是为以后控制暂停用的
  114. {        TMOD         =        TMOD | 0X10;                //定时方式1
  115.         TH1                =        0X3C;                                //50ms
  116.         TL1                =        0XB0;
  117. }
  118. /********************电机初始化程序********************/
  119. void T_Motor_Ctl(uchar t1,uchar t2,uchar t3)
  120. {        if(!flag_SEl_QiangRuo)//强洗
  121.                 T_Motor = t1;
  122.         if(flag_SEl_QiangRuo)//弱洗
  123.                 T_Motor = t2;
  124.         if(flag_TuoShui)//脱水
  125.                 T_Motor = t3;
  126. }
  127. /********************电机初始化程序********************/
  128. void Motor_Init(void)
  129. {        ZhengZhuan();
  130.         T_Motor_Ctl(4,3,5);
  131. }
  132. /**********************解除报警************************/
  133. void No_BaoJing(void)
  134. {        flag_BaoJing= 0;                //置报警标志
  135.         PIN_BaoJing        = 1;                //报警喇叭
  136.         //进水、排水已没时间限制了
  137. }
  138. /**************外部中断0程序为运行或者暂停*************/
  139. void int0(void) interrupt 0                        
  140. {        
  141.         if(!p32)
  142.         {        Delay_10ms(1);                                //延时10ms左右,去抖动
  143.                 if(!p32)
  144.                 {        if(!flag_Run)
  145.                                 flag_Run = 1;                //置运行标志               
  146.                         else if(flag_BaoJing)
  147.                                 No_BaoJing();                        
  148.                         else
  149.                         {        static bit flag_ZanTing;
  150.                                 flag_ZanTing = ~flag_ZanTing;
  151.                                 if(flag_ZanTing)
  152.                                         ZanTing();
  153.                                 if(!flag_ZanTing)        // 这里用else,编译出错。????                                                        
  154.                                         JiXu();
  155.                         }//end else
  156.                 }//end if(!p32) 2
  157.         }//end if(!p32) 1
  158. }
  159. /**********************报警程序************************/
  160. void BaoJing(void)
  161. {        flag_BaoJing= 1;                //置报警标志
  162.         PIN_BaoJing        = 0;                //报警喇叭
  163.         TR0                        = 0;
  164. }
  165. /*******************时间到处理程序*********************/
  166. void Ok_Timer(void)
  167. {        s = 0;
  168.         if(flag_JinShui || flag_PaiShui)        //进水中~、排水中~
  169.         {        BaoJing();                                //报警程序
  170.         }//end if(flag_JinShui || flag_PaiShui)
  171.         else
  172.         {        flag_XiDi         = 0;                //清洗涤标志
  173.                 flag_PiaoXi        = 0;                //清漂洗标志
  174.                 flag_TuoShui= 0;                //清脱水标志
  175.                 Stop();
  176.         }//end else
  177. }
  178. /********************电机控制程序**********************/
  179. void Motor(void)
  180. {        static uchar s_Motor;
  181.         s_Motor++;
  182.         if(s_Motor==T_Motor)
  183.         {        static uchar Motors;
  184.                 s_Motor = 0;
  185.                 Motors++;
  186.                 if(Motors==3)
  187.                         Motors = 0;
  188.                 switch(Motors)
  189.                 {        case ZHENGZHUAN :         ZhengZhuan();
  190.                                                                 T_Motor_Ctl(4,3,5);
  191.                                                                 break;
  192.                         case STOP                :         Stop();
  193.                                                                 T_Motor_Ctl(1,2,2);
  194.                                                                 break;
  195.                         case FANZHUAN         :         FanZhuan();
  196.                                                                 T_Motor_Ctl(4,3,5);
  197.                                                                 break;
  198.                         default                        :        break;
  199.                 }//end         switch
  200.         }//end if
  201. }
  202. /*******************定时器0中断程序********************/
  203. void Timer0(void) interrupt 1               
  204. {        
  205.         TR0 = 0;                                                //停止计数
  206.         TH0 = 0X3C;                                                //重装定时器值
  207.         TL0 = 0XB0;
  208.         TR0 = 1;
  209.         _50ms++;        
  210.         if(_50ms == 20)                                        //1s到
  211.         {        _50ms = 0;
  212.                 s++;                        
  213.                 if(s == T_S)                                //定时到
  214.                         Ok_Timer();
  215.                    if(flag_XiDi || flag_PiaoXi || flag_TuoShui)
  216.                         Motor();                                //电机控制程序        
  217.         }//end if(_50ms == 20)               
  218. }//end Timer0()
  219. /**********外部中断1程序为水位到或者盖开处理***********/
  220. void int1(void) interrupt 2                        
  221. {        if(!p33)
  222.         {        Delay_10ms(1);                                        //延时10ms左右,去抖动
  223.                 if(!p33)
  224.                 {        
  225.                 }//end if(!p33) 2
  226.         }//end if(!p33) 1
  227. }
  228. /***************定时器1中断程序作为闪烁****************/
  229. void Timer1(void) interrupt 3               
  230. {        static uchar _50ms;                                        //每50ms加一次的变量
  231.         TR1 = 0;                                                        //停止计数
  232.         TH1 = 0X3C;                                                        //重装定时器值
  233.         TL1 = 0XB0;
  234.         TR1 = 1;
  235.         _50ms++;
  236.         if(_50ms == 14)                                                //0.7s到
  237.         {        _50ms = 0;
  238.                 if(flag_XiDi)                                        //洗涤中~
  239.                         LED_XiDi         = ~LED_XiDi;        //洗涤状态灯闪烁
  240.                 if(flag_PiaoXi)                                        //漂洗中~
  241.                         LED_PiaoXi         = ~LED_PiaoXi;        //漂洗状态灯闪烁
  242.                 if(flag_TuoShui)                                //脱水中~
  243.                         LED_TuoShui = ~LED_TuoShui;        //脱水状态灯闪烁
  244.          }//end if(_50ms == 14)        
  245. }
  246. /**********************程序选择程序********************/
  247. void SEL_ChengXU(void)                        
  248. {        if(!K_SEL_ChengXu)                                        //程序选择键
  249.         {        Delay_10ms(1);                                        //延时10ms左右,去抖动
  250.                 if(!K_SEL_ChengXu)
  251.                 {        while(!K_SEL_ChengXu);
  252.                         flag_SEL_ChengXu++;
  253.                         if(flag_SEL_ChengXu==4)
  254.                                 flag_SEL_ChengXu = 0;
  255.                         switch(flag_SEL_ChengXu)
  256.                         {        case BIAOZHUN        :        LED_BiaoZhun= 0;                //亮
  257.                                                                         LED_JingJi        = 1;                //灭
  258.                                                                         LED_DanDu        = 1;                //灭
  259.                                                                         LED_PaiShui        = 1;                //灭
  260.                                                                         break;
  261.                                 case JINGJI                :        LED_BiaoZhun= 1;
  262.                                                                         LED_JingJi        = 0;        
  263.                                                                         LED_DanDu        = 1;
  264.                                                                         LED_PaiShui        = 1;
  265.                                                                         break;
  266.                                 case DANDU                :        LED_BiaoZhun= 1;
  267.                                                                         LED_JingJi        = 1;        
  268.                                                                         LED_DanDu        = 0;
  269.                                                                         LED_PaiShui        = 1;
  270.                                                                         break;
  271.                                 case PAISHUI         :        LED_BiaoZhun= 1;
  272.                                                                         LED_JingJi        = 1;        
  273.                                                                         LED_DanDu        = 1;
  274.                                                                         LED_PaiShui        = 0;
  275.                                                                         break;
  276.                                 default                        :        break;
  277.                    }//end switch        
  278.                 }//end if(!K_Sel_ChengXu) 2
  279.         }//end if(!K_Sel_ChengXu) 1        
  280. }//END
  281. /********************强弱选择程序**********************/
  282. void SEL_QiangRuo(void)                                       
  283. {        if(!K_SEL_QiangRuo)                                                        //强弱选择键
  284.         {        Delay_10ms(1);                                                        //延时10ms左右,去抖动
  285.                 if(!K_SEL_QiangRuo)
  286.                 {        while(!K_SEL_QiangRuo);
  287.                         flag_SEl_QiangRuo = ~flag_SEl_QiangRuo;
  288.                         if(!flag_SEl_QiangRuo)        
  289.                         {        LED_QiangXi        = 0;                                //强洗状态,灯亮
  290.                                 LED_RuoXi        = 1;                                //弱洗状态灯,灭
  291.                         }//end if(!flag_SEl_QiangRuo)                        
  292.                         else
  293.                         {        LED_QiangXi        = 1;                                //强洗状态,灯亮
  294.                                 LED_RuoXi        = 0;                                //弱洗状态灯,灭
  295.                         }//end else
  296.                 }//end if(!K_SEL_QiangRuo) 2
  297.         }//end if(!K_SEL_QiangRuo) 1
  298. }
  299. /**********************进水程序***********************/
  300. void JinShui(void)
  301. {        PIN_JinShui = 0;
  302.         flag_JinShui = 1;
  303.         TR1 = 0;
  304.         Timer0_Init();
  305.         T_S = T_JinShui;
  306.         while(SW_ShuiWei);
  307.         PIN_JinShui = 1;
  308.         flag_JinShui = 0;
  309.         TR0 = 0;
  310.         TF0 = 0;        
  311. }
  312. /**********************排水程序***********************/
  313. void PaiShui(void)
  314. {        PIN_PaiShui = 0;
  315.         flag_PaiShui = 1;
  316.         TR1 = 0;
  317.         Timer0_Init();
  318.         T_S = T_PaiShui;
  319.         while(!SW_ShuiWei);
  320.         TR0 = 0;
  321.         TF0 = 0;
  322.         Delay_10ms(500);//延时50s,经验值5000
  323.         PIN_PaiShui = 1;
  324.         flag_PaiShui = 0;        
  325. }
  326. /**********************洗涤程序***********************/
  327. void XiDi(void)
  328. {        flag_XiDi = 1;
  329.         TR1 = 1;
  330.         Timer0_Init();
  331.         T_S = T_XiDi;
  332.         Motor_Init();
  333.         while(flag_XiDi);
  334.         TR1 = 0;
  335.         LED_XiDi = 1;
  336. }
  337. /**********************漂洗程序***********************/
  338. void PiaoXi(uchar t)
  339. {        flag_PiaoXi = 1;
  340.         TR1 = 1;
  341.         Timer0_Init();
  342.         T_S = t;
  343.         Motor_Init();
  344.         while(flag_PiaoXi);
  345. }
  346. /*********************盖开保护程序********************/
  347. void BaoHu_GaiKai(void)
  348. {        if(SW_AnQuan)                                //盖开
  349.         {        ZanTing();
  350.                 LED_TuoShui = 0;               
  351.         }//end if
  352.         else
  353.         {        JiXu();                                //电机不用管,最多5s不转
  354.         }//end else
  355. }
  356. /***********************脱水程序**********************/
  357. void TuoShui(void)
  358. {        flag_TuoShui = 1;
  359.         PIN_PaiShui = 0;
  360.         TR1 = 1;
  361.         Timer0_Init();
  362.         T_S = T_TuoShui;
  363.         Motor_Init();
  364.         while(flag_TuoShui)
  365.         {         BaoHu_GaiKai();        
  366.         }//end while
  367.         TR1 = 0;
  368.         LED_TuoShui = 1;                        //而出水阀一直开着
  369. }
  370. /********************标准洗衣程序*********************/
  371. void Programme_BiaoZhun(void)
  372. {        LED_XiDi        = 0;                        //洗涤状态灯
  373.         LED_PiaoXi        = 0;                        //漂洗状态灯
  374.         LED_TuoShui = 0;                        //脱水状态灯
  375.         JinShui();
  376.         XiDi();
  377.         PaiShui();        
  378.         JinShui();
  379.         PiaoXi(T_PiaoXi_1);//4min*60s//4*60
  380.         PaiShui();
  381.         JinShui();
  382.         PiaoXi(T_PiaoXi_2);//2min*60s//2*60
  383.         Programme_PaiShui();
  384. }
  385. /********************经济洗衣程序*********************/
  386. void Programme_JingJi(void)
  387. {        TR1 = 0;
  388.         LED_XiDi        = 0;                        //洗涤状态灯
  389.         LED_PiaoXi        = 0;                        //漂洗状态灯
  390.         LED_TuoShui = 0;                        //脱水状态灯
  391.         JinShui();
  392.         XiDi();
  393.         PaiShui();
  394.         JinShui();
  395.         PiaoXi(T_PiaoXi_1);//4min*60s
  396.         Programme_PaiShui();
  397. }
  398. /********************单独洗衣程序*********************/
  399. void Programme_DanDu(void)
  400. {        LED_XiDi        = 0;                        //洗涤状态灯
  401.         LED_PiaoXi        = 1;                        //漂洗状态灯
  402.         LED_TuoShui = 1;                        //脱水状态灯
  403.         JinShui();
  404.         XiDi();
  405. }
  406. /********************排水洗衣程序*********************/
  407. void Programme_PaiShui(void)
  408. {        LED_XiDi        = 1;                        //洗涤状态灯
  409.         LED_PiaoXi        = 1;                        //漂洗状态灯
  410.         LED_TuoShui = 0;                        //脱水状态灯
  411.         PaiShui();
  412.         TuoShui();
  413. }
  414. /************************主程序************************/
  415. void main()                                                        
  416. {        
  417.         Pin_Init();                                                        //管脚初始化
  418.         ExInt_Init();                                                //外中断初始化
  419.         Timer1_Init();
  420.         ET0                =        1;        
  421.         ET1                =        1;        
  422.         Enable();                                                        //开总中断
  423.         while(1)
  424.         {        if(!flag_Run)                                        //运行前按键才有效
  425.                 {        SEL_ChengXU();                                //程序选择程序                                       
  426.                         SEL_QiangRuo();                                //强弱选择程序                                                                                                                                       
  427.                   }//end if(!flag_Run)
  428.                 if(flag_Run)//用else不,按启动键后,有时没反映????//
  429.                 {        PIN_PaiShui = 1;        //关排水阀
  430.                         switch(flag_SEL_ChengXu)
  431.                         {        case BIAOZHUN        :        Programme_BiaoZhun();                //标准洗衣程序                                                                                
  432.                                                                         break;
  433.                                 case JINGJI                :        Programme_JingJi();                        //经济洗衣程序                                                                        
  434.                                                                         break;
  435.                                 case DANDU                :        Programme_DanDu();                        //单独洗衣程序                                                                                
  436.                                                                         break;
  437.                                 case PAISHUI         :        Programme_PaiShui();                //排水洗衣程序                                                                                
  438.                                                                         break;
  439.                                 default                        :        break;
  440.                    }//end switch                 
  441.                 }//end esle
  442.                 flag_Run = 0;
  443.         }//end while
  444. }//end main


复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:206996 发表于 2017-6-2 10:14 来自手机 | 只看该作者
楼主,这个卖吗
回复

使用道具 举报

板凳
ID:212976 发表于 2017-6-20 16:19 | 只看该作者
这个做的真心不错,虽然自己没有仿真,但做的已经很全了,不错。
回复

使用道具 举报

地板
ID:289416 发表于 2018-3-9 17:00 | 只看该作者
6666666666666666666
回复

使用道具 举报

5#
ID:80352 发表于 2018-3-9 21:40 | 只看该作者
牛逼啊,解释也很清楚,值得学习
回复

使用道具 举报

6#
ID:348602 发表于 2018-6-10 13:42 | 只看该作者
向大佬看齐
回复

使用道具 举报

7#
ID:547331 发表于 2019-5-26 08:58 | 只看该作者
有具体的分析嘛 图
回复

使用道具 举报

8#
ID:678006 发表于 2019-12-30 23:50 | 只看该作者
dalao还是厉害的啊
回复

使用道具 举报

9#
ID:786599 发表于 2020-6-22 17:01 | 只看该作者
膜拜大佬
回复

使用道具 举报

10#
ID:92810 发表于 2021-3-11 22:51 | 只看该作者
好东西来的,刚好下载下来学习学习,谢谢楼主分享了
回复

使用道具 举报

11#
ID:935 发表于 2021-3-11 23:47 | 只看该作者
学习范例,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表