標題: 全自動洗衣機單片機程序 [打印本頁]

作者: 木木木木木    時間: 2015-12-4 18:52
標題: 全自動洗衣機單片機程序
#include<reg51.h>  
#define uchar unsigned char
#define uint unsigned int

sbit mo_r = P3^2;     //電機右控制線
sbit mo_l = P3^3;     //電機左控制線
sbit key_menu = P3^4; // 菜單按鍵
sbit key_on = P3^5;   // 開始按鍵
sbit key_off = P3^6;  //   結束按鍵
sbit key_se = P3^7;   //  菜單選擇按鍵

sbit led_in = P2^0;   // 進水指示燈  
sbit led_xi = P2^1;   //  洗衣指示燈  
sbit led_pao = P2^2;  // 泡洗指示燈
sbit led_xx = P2^3;   //  脫水指示燈

sbit led_out = P2^4;  //   出水指示燈
sbit led_over = P2^5; // 洗衣結束指示燈
sbit led_work = P2^6; // 電機工作指示燈
sbit led_wring = P2^7;// 報警指示燈
sbit other = P3^1;    //  脫水電源控制開關
sbit anther = P3^0;  // 洗衣電源控制開關
uchar  code  num[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

char sec = 0;    //  時間秒
char min = 0;     // 時間分
uchar count=0;     //  中斷計數(shù)  
uchar flag0=0;    //  洗衣機工作狀態(tài)標志
uchar flag1=0;    //  進水次數(shù)標志
uchar flag2=0;    //  出水次數(shù)標志
uchar flag3=0;    //   泡洗次數(shù)標志  
uchar err =0;    // 報警標志
uchar quan = 0;//正反轉(zhuǎn)計數(shù)

//  函數(shù)聲明 //


void in(); //   進水子程序
void out();  //   出水子程序
void over();  //  結束子程序
void xi();  //   洗衣子程序
void pao(); //  泡衣子程序
void xx(); // 脫水子程序
void on(); //  工作on處理子程序
void se(); //  顯示菜單選擇
void SEG_display();  //顯示時間子程序
void key_scan();   //  按鍵掃描子程序  

//     延時函數(shù)  //
void mDelay(unsigned int Delay) //延時程序
{   
     unsigned int i;
      for(;Delay>0;Delay--)      
      {       for(i=0; i<54; i++)  ;     
      }
}

//    工作on處理子程序 //

void on()
{   TMOD=0x01;   
    TH0=(65536-50000)/256;  
    TL0=(65536-50000)%256;  
    EA=1;  ET0=1;  TR0=1;   
    P2 = 0xff;  
    if(flag0 == 0)      in();  
    if(flag0 == 1)      xi();  
    if(flag0 == 2)      pao();
    if(flag0 == 3)      xx();  
    if(flag0 == 4)      out();
}


//    結束子程序 //
void over()
{ other=0;  anther=0;  P2 = 0xff;  
  mo_r=0;  mo_l=0;  led_over = 0;  EA=0;   }

//    進水子程序  //*********************************//
void in()
{ anther=0;  other=0;  P2 = 0xff;  led_in = 0;  flag1++;  
  mo_r = 0;  mo_l = 0;  min = 0;  sec = 8;  }  

//   洗衣子程序//
void xi()
{  anther=1;    other=0;      
    P0 = 0xff;   led_work = 0;    led_xi = 0;
    mo_r = 1;   mo_l = 0;   min = 1;   
    sec = 36;   quan = 0;  }



//    泡衣子程序 //
void pao()
{      
anther=1;  other=0;  P2 = 0xff;  led_pao = 0;  led_work = 0;  
flag3++;  mo_r = 1;  mo_l = 0;  min = 1;  sec = 35;   quan = 0;
}  



//   脫水子程序  //*********************************//
void xx()
{ other=1;  anther=0;  P2 = 0xff;  led_xx = 0;  mo_r = 0;  mo_l = 1;  min = 0;  sec = 50;  }  
//    出水子程序 //*********************************//

void out()
{ anther=0;  other=0;  P2 = 0xff;   led_out = 0;
flag2++;  mo_r = 0;  mo_l = 0;  min = 0;  sec = 5;  }  


//    顯示菜單選擇 //
void se()
{  P2 = 0xff;  if(flag0 >= 5)    flag0 = 0;   
   if(flag0 == 0)  {   led_in = 0;   }   
   if(flag0 == 1)  {   led_xi=0;     }
   if(flag0 == 2)  {   led_pao=0;    }   
   if(flag0 == 3)  {   led_xx=0;     }   
   if(flag0 == 4)  {   led_out=0;    }
}  



//    菜單處理子程序 //
void menu()
{      min = 0;  sec = 0;  mo_r=0;   mo_l=0;
       SEG_display();        
       while(1)   
        {      if(key_on == 0)   
                  { mDelay(5);   
                    if(key_on == 0)   
                      {  while(!key_on);     
                         on(); break;     
                      }   
                  }
               if(key_off == 0)   
                  { mDelay(5);   
                    if(key_off == 0)   
                     {  while(!key_off);        
                        over(); break;     
                     }     
                  }
               if(key_se == 0)   
                  { mDelay(5);   
                    if(key_se == 0)   
                     { while(!key_se);   
                       flag0++;  se();      
                     }   
                  }      
        }  
}


//      按鍵掃描子程序//
void key_scan()
{    if(key_menu == 0)
        {  mDelay(5);   
            if(key_menu == 0)   
              { while(!key_menu); menu();   
              }   
        }  
     if(key_on == 0)  
        {  mDelay(5);   
            if(key_on == 0)   
              { while(!key_on); on();   
              }   
        }
     if(key_off == 0)  
        {  mDelay(5);
            if(key_off == 0)   
              { while(!key_off); over();   
              }   
        }  
}

// 顯示子程序 //
void SEG_display()
{  P1=0x01;  P0 = num[min/10]; mDelay(10);  
   P1=0x02;  P0 = num[min%10]; mDelay(10);  
   P1=0x04;  P0 = num[sec/10]; mDelay(10);  
   P1=0x08;  P0 = num[sec%10]; mDelay(10);  
}  //*********************************//

//       主函數(shù) //
void main()
{  led_in=0;  anther=0;  other=0;
   while(1)  
     { SEG_display(); key_scan(); }
}  

//     定時器0中斷處理程序//
void timer0() interrupt 1
{  TH0=(65536-50000)/256;  
   TL0=(65536-50000)%256;   count++;      
   if(count==20)  
    { count = 0;   sec--;   
      if((flag0==1)||(flag0==2))   
        {  quan++;  
           switch(quan)     
             { case 1 :mo_r=1;mo_l=0;break;     
               case 10:mo_r=0;mo_l=0;break;     
               case 15:mo_r=0;mo_l=1;break;     
               case 25:mo_r=0;mo_l=0;break; default:;      
             }      
           if(quan==30)     
             { quan=0; }     
        }  

      if((sec == 0)&&(min != 0))   
        {  min--; sec = 59; }  

      if((sec<0)&&(min==0)&&(flag0==0))  //進水結束   
        {  switch(flag1)   
             { case 1:flag0=1;xi();break;     
               case 2:flag0=2;pao();break;     
               case 3:flag0=2;pao();break;     
               case 4:flag0=2;pao();break;     
               default: err=1;led_wring = 0;      
             }      
        }

      if((sec<0)&&(min==0)&&(flag0==1))   //洗衣結束   
        {  flag0 = 4; out();  }  

      if((sec<0)&&(min==0)&&(flag0==2))   //泡衣結束   
        {  switch(flag3)     
             { case 1:flag0=4;out();break;     
               case 2:flag0=4;out();break;     
               case 3:flag0=4;out();break;     
               default: err=1;led_wring = 0;      
             }     
        }  

      if((sec<0)&&(min==0)&&(flag0==4))  //出水結束   
        {  switch(flag2)        
             { case 1:flag0=0;in();break;     
               case 2:flag0=0;in();break;     
               case 3:flag0=0;in();break;        
               case 4:flag0=3;xx();break;      
               default: err= 1;led_wring = 0;      
             }     
        }   

      if((sec<0)&&(min==0)&&(flag0==3))   
        {  sec = 0;     over(); }   
     }  
}


















作者: admin    時間: 2015-12-4 18:56
非常好謝謝分享,樓主能提供一下原理圖嗎?
作者: wanggaohan    時間: 2016-12-14 13:08
太厲害餓了 感謝哦
作者: wanggaohan    時間: 2016-12-14 13:09
太感謝了
作者: wanggaohan    時間: 2016-12-14 21:08
原理圖和仿真圖有么
作者: vn4800    時間: 2016-12-14 22:43
感謝分享啊
作者: 你就是個哈兒    時間: 2016-12-15 09:46
太厲害了哈!樓主 如果能附上原理圖就更好了哈1
作者: 小菜鳥零號    時間: 2016-12-15 17:35
話說我們畢業(yè)設計有這一到題
作者: 123453.    時間: 2017-6-9 11:58
很好的程序
作者: 123453.    時間: 2017-6-9 11:58
很好的
作者: faridzled    時間: 2017-6-9 19:10
thanks for sharing
作者: liqingyundmtech    時間: 2017-6-23 14:52
非常好謝謝分享,樓主能提供一下原理圖嗎?
作者: liqingyundmtech    時間: 2017-9-16 21:29
謝謝分享,樓主能提供一下原理圖嗎?
作者: liqingyundmtech    時間: 2019-9-24 20:26
樓主能提供一下原理圖嗎




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1