找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4929|回复: 8
收起左侧

小白求助!关于单片机洗衣机控制系统的设计

  [复制链接]
ID:155285 发表于 2016-12-17 19:00 | 显示全部楼层 |阅读模式
小白刚学单片机不久 碰到了老师布置这个题目 感觉毫无头绪。。 再此求教各位大神!

洗衣机控制系统设计
设计内容:
1、 用直流电机的转速表征三种不同洗衣方式,弱洗、强洗、漂洗;(20分)
2、 实现最长10分钟定时;(20分)
3、 用三个独立按键设置待洗衣物的不同洗涤方式: 40分)
丝质衣服: 漂洗 定时3分钟
棉质衣服:弱洗 2分钟;强洗 5分钟;漂洗 3分钟;
化纤衣服: 强洗 4分钟;漂洗 2分钟;
4、 定时时间到,蜂鸣器报警提示。(20分)





回复

使用道具 举报

ID:155507 发表于 2016-12-18 22:22 | 显示全部楼层
  1. // 基于单片机的洗衣机的控制系统设计

  2. /*
  3. 1洗衣机的功能及设计   
  4. 1.1洗衣机功能要求      洗衣机的主要工作程序是:洗涤——脱水——漂洗——脱水——漂洗——脱水。上述工作程序中,包含三个过程,洗涤过程、漂洗过程、脱水过程。
  5.         (1)洗涤过程:放好待洗物,启动开关,进水阀通电,向洗衣机供水,当供水达到预定水位时,水位开关接通,进水阀断电关闭,停止供水。洗涤电动机接通电源,带动波轮(或桶)旋转,产生各种形式的水流搅动衣物进行洗涤。通过电动不停的正转、停、反转、反复循环,形成洗涤水对洗涤物产生强烈的翻滚作用。同时,衣物之间、衣物与四周桶壁之间产生互相摩擦和撞击力,以次达到洗涤衣物的目的。      (2)漂洗过程:漂洗的目的在于清除衣物上的洗涤液,因此,漂洗过程与洗涤过程的电器动作是完全相同的。
  6.         (3)脱水过程:洗涤或漂洗后,需要对衣物进行脱水以便晾干,节省水资源,所以脱水是洗衣过程中必不可少的环节。洗涤或漂洗过程结束后,电动机停止转动,排水阀通电,打开排水阀门排水。当水位低到一定程度时,满足安全条件,脱水电动机接通,电机带动脱水桶高速旋转,利用离心力把衣服上的水从桶壁的小眼里甩出。全部洗衣工作完成后,由蜂鸣器发出音响,表示衣物已洗干净。   
  7. 1.2洗衣机硬件电路设计  
  8.         1.2.1 洗衣机总体设计框图     
  9.         椭圆型表示指示灯:从上到下依次为强洗、弱洗、洗涤次数、洗衣定时、脱水定时、洗衣剩余时间、脱水剩余时间。  电动机正转为强洗,正反交替转动设定为弱洗,初始设定的状态为强洗,若要选择弱洗模式需按下增加按键,再次按下选择按键,则表示洗涤次数的指示灯被点亮,选择增加或减少按键对时间进行加减。然后对脱水时间设定,最后按下启动键,洗衣机开始工作。

  10. 1.2.3硬件电路的主要模块  
  11.         根据洗衣机的基本功能,硬件电路设计需要考虑:水流强度的问题、洗涤、漂洗、脱水时间设定长短的问题、工作时间或剩余时间的显示、工作过程中的暂停、启动、复位、洗完后的报警等问题。  采用5l系列单片机作为控制核心,主要包括功能设置及控制电路、洗衣机状态显示及输出控制电路。主要组成部件有:单片机、74LSl38译码器、ULN2003、指示灯、数码管、电动机、蜂鸣器以及按键等。

  12.         (1)功能设置及控制电路  
  13.         ①暂停键K0,接P3.3,用外部中断1实现工作过程的暂停,根据人的需要可以进行手工洗涤;  ②水位开关K1,接P1.O,水位到位时,K1闭合。在进水期间,系统不断检测K1,当检测到K1闭合就停止进水;  ③按键K2,接P1.6,作为工作过程中的启动键;
  14.         ④按键K3是洗衣强度选择键,接P3.4,每按一次代表一种强度。分别是标准、弱洗、强洗和自编,由4个指示灯进行显示;  ⑤按键K4,接P3.5,对洗衣时间进行设置,并用数码管LEDl和LED2显示:  
  15.         ⑥按键K5,接P3.6,对漂洗、脱水次数进行设置,并用数码管LEDI显示;
  16.         ⑦压电蜂鸣器接P1.7,作为洗衣时间到以及故障发生的报警器。
  17.         (2)洗衣机状态显示        74LSl38译码器为3—8译码器,选用它可以解决I/0口线数量不足问题。从控制要求可知,洗衣机的工作模式以及工作程序必须有7中不同的显示加以区别。74LSl38译码器的输入端C、B、A分别接P1.3、P1.4、P1.5,输出端分别与7个发光二极管DO--D6的阴极相连,发光二极管阳极接电源。输出端YO控制D0“弱洗”指示灯:Y1控制D1“标准洗”指示灯,Y2控制D2“强洗”指示灯,Y3控制D3“自编”指示灯,Y4控制D4“洗衣”指示灯,Y5控制D5“漂洗”指 示灯,Y6控制D6“脱水”指示灯
  18.         (3)输出控制电路  输出控制电路由触发器电路和相应的双向晶闸管组成。控制电机正反转以及进水阀和排水阀的开启和关闭。通过触发器电路和相应的双向晶闸管,电动机的正转和反转用单片机P1.1和P1.2进行控制;进水电磁阀和排水电磁阀用单片机的P3.0和P3.1进行控制

  19. 1.3洗衣机软件系统设计
  20. 1.3.1主程序设计
  21.                 根据硬件设计要求,控制主程序流程图如图所示。洗衣机通电之后,单片机上电,首先进行程序的初始化,包括定时器O、外部中断O、外部中断l的初始化,以及各参数初值的设定。默认洗衣强度为“标准洗”,漂洗次数3次。然后扫描K2、K3、K4、K5键的状态,确定洗衣强度R2、洗衣时间R3和漂洗次数R4。洗衣机处于待命状态,控制指示灯显示洗衣强度,液晶显示预设洗衣时间。当发现启动键K2按下,洗衣机从待命状态进入工作状态。完成进水——洗涤——脱水——漂洗的循环过程。当洗衣结束时,控制蜂鸣器发声。



  22. */

  23. #include <reg51.h>   //各个引脚功能定义  
  24. sbit       key_move_stop  = P2^0;  //启动、暂停按键
  25. sbit key_wash_dehydration = P2^1;  //洗涤、脱水按键  
  26. sbit key_water_detection  = P3^2;  //水位检测按键  外部中断0
  27. sbit       key_cap_open   = P3^3;  //机盖装置按键  外部中断1   
  28. sbit LED1 = P0^0;  //启动指示灯 sbit LED2 = P0^1;  //暂停指示灯
  29. sbit LED3 = P0^2;  //洗涤指示灯 sbit LED4 = P0^3;  //脱水指示灯
  30. sbit LED5 = P0^4;  //进水阀指示灯 sbit LED6 = P0^5;  //排水阀指示灯
  31. sbit LED7 = P0^6;  //水位满指示灯 sbit LED8 = P0^7;  //机盖松指示灯   
  32. sbit LED9 = P2^7;  //报警指示灯

  33. sbit LS138A = P2^2;   //数码管片选
  34. sbit LS138B = P2^3; sbit LS138C = P2^4;   
  35. sbit BEEP = P2^6;  //蜂鸣器报警   
  36. sbit PWM = P2^5;    //直流电动机   

  37. //共阴数码管 0-9  -  
  38. unsigned int code Disp_Tab[] =  
  39. {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};   

  40. unsigned int i=0,LedNumVal=0;   //数码管计时  0-9 选择
  41. unsigned int lednum = 0;  //定时器0 数码管计时速率调控变量
  42. unsigned int  LedOut[3];        //数码管计时存储区   
  43. unsigned char key_s,key_v;   //按键扫描变量   
  44. static unsigned int m = 0;   //启动、暂停键计数变量
  45. static unsigned int movenum = 0; //暂停功能变量

  46. /***********************************************************/
  47. unsigned char scan_key()     //启动/暂停键;洗涤/脱水键扫描
  48. {  
  49.         unsigned char Key_s;  Key_s = 0x00;   
  50.         Key_s |= key_wash_dehydration;  Key_s <<= 1;  
  51.         Key_s |= key_move_stop;   
  52.         return Key_s;   
  53. }

  54. /************************************************************/
  55. void delay( unsigned int a)    //数码扫描延时子程序
  56. {      
  57.         unsigned char b;     
  58.         for(; a > 0; a--)
  59.                 for(b = 200; b > 0; b--);
  60. }

  61. /**********************************************************/
  62. void delayms( unsigned char ms)  //按键消抖延时子程序
  63. {         
  64.         unsigned char k;  
  65.         while(ms--)  
  66.         {   
  67.                 for(k = 0; k < 120; k++);  
  68.         }
  69. }  

  70. /***********************************************************/
  71. void beep() {  
  72.         unsigned int n = 0;  
  73.         BEEP = 1;LED9 = 1;  
  74.         for(; n<6;n++)  
  75.         {   
  76.                 BEEP = 0;LED9 = 0;   
  77.                 delayms(3000);   
  78.                 BEEP = 1;LED9 = 1;   
  79.                 delayms(1000);   
  80.         }  
  81. }

  82. /*************************************************************/
  83. void led_display_zero()   //数码管清零并直流电动机停止 蜂鸣器响三下
  84. {                        
  85.         beep();  
  86.         PWM = 1;  
  87.         while(1)  
  88.         {   
  89.                 unsigned int i = 0;     
  90.                 unsigned int LedNumVal = 0;   
  91.                 PWM = 1;   
  92.                 if(key_wash_dehydration ==0) //洗涤后脱水按下键跳出   
  93.                 {     
  94.                         LED3 =1;   
  95.                         LED4 =0;
  96.                         LED6 =0;   break;     
  97.                 }   
  98.   
  99.                 LedOut[0]=Disp_Tab[LedNumVal%1000/100]|0x80;  //百位带小数点
  100.                 LedOut[1]=Disp_Tab[LedNumVal%100/10];   //十位
  101.                 LedOut[2]=Disp_Tab[LedNumVal%10];             //个位  
  102.    
  103.                 for( i=0; i<3; i++)   
  104.                 {         
  105.                         P1= LedOut[i];           
  106.                         switch(i)              
  107.                         {         
  108.                         case 0:LS138A=1; LS138B=0; LS138C=0;  break;                  
  109.                         case 1:LS138A=0; LS138B=1; LS138C=0;  break;                        
  110.                         case 2:LS138A=0; LS138B=0; LS138C=1;  break;   
  111.                         default:break;         
  112.                         }   
  113.                         delay(10);     
  114.                         P1 = 0x00;   
  115.                 }   
  116.         }      
  117. }

  118. /*************************************************************/
  119. void led_display_over()   //数码管清零并直流电动机停止 蜂鸣器响三下
  120. {                        
  121.         beep();  
  122.         PWM = 1;  
  123.         while(1)  
  124.         {   
  125.                 unsigned int i = 0;     
  126.                 unsigned int Led = 0;        
  127.                 LED1 = 1; //启动指示灯   
  128.                 LED2 = 1; //暂停指示灯   
  129.                 LED3 = 1; //洗涤指示灯      
  130.                 LED4 = 1; //脱水指示灯     
  131.                 LED5 = 1; //进水阀指示灯   
  132.                 LED6 = 1; //排水阀指示灯
  133.                 LED7 = 1; //水位满指示灯   
  134.                 LED8 = 1; //机盖松指示灯   
  135.                 LED9 = 1; //出水阀指示灯     
  136.                 if(key_move_stop ==0) //脱水后按下键跳出   
  137.                 {      
  138.                         LED1 = 0; //启动指示灯   
  139.                         LED2 = 1; //暂停指示灯      
  140.                         LED3 = 1; //洗涤指示灯   
  141.                         LED4 = 1; //脱水指示灯   
  142.                         LED5 = 0; //进水阀指示灯   
  143.                         LED6 = 1; //排水阀指示灯   
  144.                         LED7 = 1; //水位满指示灯   
  145.                         LED8 = 1; //机盖松指示灯   
  146.                         LED9 = 1;  //报警指示灯   
  147.                         break;     
  148.                 }     
  149.                 LedOut[0]=Disp_Tab[Led%1000/100]|0x80;  //百位带小数点      
  150.                 LedOut[1]=Disp_Tab[Led%100/10];   //十位        
  151.                 LedOut[2]=Disp_Tab[Led%10];      //个位      
  152.                 for( i=0; i<3; i++)   
  153.                 {         
  154.                         P1= LedOut[i];           
  155.                         switch(i)              
  156.                         {         
  157.                         case 0:LS138A=1; LS138B=0; LS138C=0;  break;                  
  158.                         case 1:LS138A=0; LS138B=1; LS138C=0;  break;                        
  159.                         case 2:LS138A=0; LS138B=0; LS138C=1;  break;   
  160.                         default:break;         
  161.                         }   
  162.                         delay(10);   
  163.                         P1 = 0x00;   
  164.                 }   
  165.         }     
  166. }  

  167. /*************************************************************/
  168. void cap_open()   //数码管清零并直流电动机停止 蜂鸣器响三下
  169. {                        
  170.         beep();       //需要复位跳出  
  171.         PWM = 1;
  172.         while(1)  
  173.         {   
  174.                 unsigned int i = 0;     
  175.                 unsigned int LedNum = 0;   
  176.                 LedOut[0]=Disp_Tab[LedNum%1000/100]|0x80;  //百位带小数点      
  177.                 LedOut[1]=Disp_Tab[LedNum%100/10];   //十位        
  178.                 LedOut[2]=Disp_Tab[LedNum%10];       //个位      
  179.                 for( i=0; i<3; i++)   
  180.                 {         
  181.                         P1= LedOut[i];           
  182.                         switch(i)              
  183.                         {         
  184.                         case 0:LS138A=1; LS138B=0; LS138C=0;  break;                  
  185.                         case 1:LS138A=0; LS138B=1; LS138C=0;  break;                        
  186.                         case 2:LS138A=0; LS138B=0; LS138C=1;  break;   
  187.                         default:break;         
  188.                         }     
  189.                         delay(10);     
  190.                         P1 = 0x00;   
  191.                 }   
  192.         }  
  193. }   

  194. /************************************************************/   
  195. void led_display_move()            //数码管计时并直流电动机运转
  196. {  
  197.         while(1)  
  198.         {     
  199.                 PWM = 0;     
  200.                 if(LedNumVal == 101)        //计时到100时自动清零并蜂鸣器响三下   
  201.                 {     
  202.                         LedNumVal = 0;     
  203.                         TR0 = 0;   
  204.                         break;      
  205.                 }         
  206.                 if(key_move_stop ==0)     
  207.                 {      
  208.                         movenum++;
  209.                         if(movenum%2==1)   
  210.                         {   
  211.                                 LED1 = 1; //启动指示灯   
  212.                                 LED2 = 0; //暂停指示灯   
  213.                                 TR0 = 0;  //关闭定时器0   
  214.                         }   
  215.                         else   
  216.                         {     
  217.                                 LED1 = 0;   
  218.                                 LED2 = 1;   
  219.                                 TR0 = 1; //开启定时器0   
  220.                         }   
  221.                 }   
  222.                 while(key_move_stop ==0); //等待按键释放   
  223.                 LedOut[0]=Disp_Tab[LedNumVal%1000/100]|0x80;  //百位带小数点

  224.                 LedOut[1]=Disp_Tab[LedNumVal%100/10];     //十位      
  225.                 LedOut[2]=Disp_Tab[LedNumVal%10];             //个位      
  226.                 for( i=0; i<3; i++)   
  227.                 {         
  228.                         P1 = LedOut[i];         
  229.                         switch(i)            
  230.                         {           
  231.                         case 0:LS138A=1; LS138B=0; LS138C=0;  break;
  232.                         case 1:LS138A=0; LS138B=1; LS138C=0;  break;
  233.                         case 2:LS138A=0; LS138B=0; LS138C=1;  break;     
  234.                         default:break;      
  235.                         }      
  236.                         delay(10);   
  237.                         P1 = 0x00;   
  238.                 }   
  239.         }     
  240. }

  241. /***********************************************************/
  242. void move_stop_led()
  243. {
  244.         m++;  
  245.         if(m == 1)  
  246.         {      
  247.                 EX0=1;    //外部中断0允许中断 水位检测   
  248.                 LED1 = 0; //启动指示灯   
  249.                 LED2 = 1; //暂停指示灯      
  250.                 LED3 = 1; //洗涤指示灯   
  251.                 LED4 = 1; //脱水指示灯   
  252.                 LED5 = 0; //进水阀指示灯   
  253.                 LED6 = 1; //排水阀指示灯   
  254.                 LED7 = 1; //水位满指示灯   
  255.                 LED8 = 1; //机盖松指示灯   
  256.                 LED9 = 1;  //报警指示灯   
  257.         }  
  258.         else if((m>1)&&(m%2==1))  
  259.         {   
  260.                 LED1 = 0; //启动指示灯   
  261.                 LED2 = 1; //暂停指示灯   
  262.         }   else  
  263.         {     
  264.                 LED1 = 1;          //启动指示灯   
  265.                 LED2 = 0;          //暂停指示灯      
  266.                 TR0 = 0;           //停止定时器工作  
  267.         }
  268. }

  269. /**********************************************************/
  270. void wash_dehydration_led()
  271. {  
  272.         static  unsigned int j = 0;  
  273.         j++;  
  274.         if(j%2 == 1)      //启动并洗涤  
  275.         {         
  276.                 LED1 = 0; //启动指示灯   
  277.                 LED2 = 1; //暂停指示灯      
  278.                 LED3 = 0; //洗涤指示灯   
  279.                 LED4 = 1; //脱水指示灯   
  280.                 LED5 = 1; //进水阀指示灯   
  281.                 LED6 = 1; //排水阀指示灯   
  282.                 LED7 = 1; //水位满指示灯
  283.                 LED8 = 1; //机盖松指示灯   
  284.                 LED9 = 1;  //报警指示灯   
  285.                 led_display_move();   
  286.                 led_display_zero();        
  287.         }  
  288.         else          //启动并脱水  
  289.         {   
  290.                 LED1 = 0; //启动指示灯   
  291.                 LED2 = 1; //暂停指示灯      
  292.                 LED3 = 1; //洗涤指示灯   
  293.                 LED4 = 0; //脱水指示灯   
  294.                 LED5 = 1; //进水阀指示灯   
  295.                 LED6 = 0; //排水阀指示灯   
  296.                 LED7 = 1; //水位满指示灯   
  297.                 LED8 = 1; //机盖松指示灯   
  298.                 LED9 = 1;  //报警指示灯   
  299.                 led_display_move();   
  300.                 led_display_over();  
  301.         }
  302. }

  303. /*********************************************************/
  304. void proc_key(unsigned char key_v)
  305. {   
  306.         if((key_v & 0x01) == 0)  
  307.         {    move_stop_led();         
  308.         }     
  309.         else if((key_v & 0x02) == 0)  
  310.         {     if(m%2==1)   
  311.                 {      TR0 = 1;     //定时器0开始工作      
  312.                         wash_dehydration_led();      
  313.                 }   
  314.         }   
  315. }

  316. /*********************************************************/
  317. main() {        
  318.         IT0 = 1;  //外部中断0 水位检测 跳沿触发方式  
  319.         EX0=0;    //不允许外部中断0中断   
  320.         IT1 = 1;  //外部中断1 机盖打开 跳沿触发方式  
  321.         EX1 = 1;  //允许外部中断1中断   
  322.         TMOD = 0x01; //定时器0 定时模式 方式1  
  323.         ET0 = 1;     //允许定时器0中断  
  324.         TR0 = 0;  //停止定时器工作   
  325.         TH0 = 0xDB;  
  326.         TL0 = 0xF0;  //10ms   EA=1;     
  327.         P0 = 0xff;  
  328.         key_v = 0x03;   
  329.         LS138A=0;
  330.         LS138B=0;
  331.         LS138C=0;     
  332.         while(1)   
  333.         {
  334.                 key_s = scan_key();   
  335.                 if(key_s != key_v)   
  336.                 {   
  337.                         delayms(10);   
  338.                         key_s = scan_key();   //启动/暂停键 洗涤/脱水键扫描   
  339.                         if(key_s != key_v)   
  340.                         {   
  341.                                 key_v = key_s;   
  342.                                 proc_key(key_v);      
  343.                                 delayms(30);                  
  344.                         }   
  345.                 }  
  346.         }
  347. }

  348. void  counter0(void) interrupt 0
  349. {        
  350.         EX0=0;     
  351.         LED7 = 0;      //水位满     
  352.         LED5 = 1;    //进水阀指示灯   
  353.         EX0=1;
  354. }   

  355. void time0(void) interrupt 1
  356. {  
  357.         lednum++;  
  358.         TR0 = 0;   
  359.         TH0 = 0xDB;    //10ms  
  360.         TL0 = 0xF0;   
  361.         if(lednum == 50)  
  362.         {   
  363.                 lednum = 0;   
  364.                 LedNumVal++;  
  365.         }   
  366.         TR0 = 1;  
  367. }   

  368. void  counter1(void) interrupt 2
  369. {        
  370.         EX1 = 0;      
  371.         LED1 = 1; //启动指示灯  
  372.         LED2 = 1; //暂停指示灯  
  373.         LED3 = 1; //洗涤指示灯   
  374.         LED4 = 1; //脱水指示灯   
  375.         LED5 = 1; //进水阀指示灯   
  376.         LED6 = 1; //排水阀指示灯   
  377.         LED7 = 1; //水位满指示灯   
  378.         LED8 = 1; //机盖松指示灯   
  379.         cap_open();   
  380. }

复制代码

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:561135 发表于 2019-6-13 09:20 来自手机 | 显示全部楼层
楼主设计出来了吗?
回复

使用道具 举报

ID:441292 发表于 2019-7-3 15:07 | 显示全部楼层
666楼主设计出来了吗?
回复

使用道具 举报

ID:842796 发表于 2020-11-20 00:27 | 显示全部楼层

你好,你有proteus的图吗
回复

使用道具 举报

ID:278840 发表于 2020-11-20 09:25 | 显示全部楼层
找个电机驱动ic,然后学会调速PWM控制,然后学习单片机,定时器,按键输入
回复

使用道具 举报

ID:180919 发表于 2020-11-20 09:42 | 显示全部楼层
不错,占个位,抽空测试看看
回复

使用道具 举报

ID:857357 发表于 2020-12-9 12:38 | 显示全部楼层
楼主设计出来了吗?求proteus图
回复

使用道具 举报

ID:858663 发表于 2020-12-11 13:13 来自手机 | 显示全部楼层
二楼难道不是答案么?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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