基于51单片机的全自动洗衣机仿真原理图程序方案设计

设计总方框图
链接:https://pan.baidu.com/s/1wowj-CkiVshYPAYS7v0eVA
提取码:zi89

在这里插入图片描述
原理图:
在这里插入图片描述

控制系统的功能
基于单片机洗衣机通过控制系统设定洗衣程序在洗涤脱水桶内自动完成注水、洗涤、漂洗、排水和脱水全过程。洗衣时控制系统打开进水电磁阀开始注水;当洗涤脱水桶内的水位达到系统设定值时单片机发送一个低电平通知控制系统关闭进水电磁阀,同时启动电机洗衣。电机在系统的控制下进行正转、停、反转通过传动带动波轮执行洗涤程序;当洗涤时间终了,控制系统切断电机电路打开排水电磁阀开始排水;然后再次注水,洗衣机进入漂洗状态,完成漂洗程序后,开始排水,同时排水电磁阀的动作并且松开为脱水程序作好准备;排水结束后系统控制电机单方向高速运转完成脱水程序;当脱水程序终了系统控制排水电磁阀和电机断电,排水阀复位,同时蜂鸣器奏响,通知用户整个洗衣程序结束。

该电路主要组成部件是由AT89C52单片机、指示灯、电动机、蜂鸣器、电控水龙头、LED显示灯、及4只按键组成。其组成如图3.1所示。电动机有两个控制端,一端控制电动机正转且该端与P.3 2相连,另一端控制电动机的反转且该端与P3.3相连。电控水龙头共两个,一个为进水水龙头且受P1.4的控制,另一个为排水水龙头而受P1.5的控制,当电控水龙头的控制端为“0”时水龙头打开,当电控水龙头的控制端为“1”时水龙头关闭。显示器是由思维数码管组成,有P1口控制段码,由P1.0到P1.4控制位码。蜂鸣器有由P3.0控制,当P3.0输出为“0”时蜂鸣器发声。本系统采用12M的晶体振荡器定时器0的设置为每隔50ms产生一次中断。

电源电路
单片机系统电源部分的电气原理图如图3.2所示。市电220V经过变压器T变压为12V交流电,再通过4只二极管全桥整流,经过电容C4、C6滤波得到光滑的直流电压后,经过三端稳压管(7805)稳压得到稳定的+5V电压给各器件供电。

部分代码:


#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "ADC0832.C" 
 unsigned char as; //水位,保存
sbit k1=P1^0;//进水阀控制端口
sbit k2=P1^1;//排水阀控制端口
sbit k3=P1^2;//电机控制继电器一号
sbit k4=P1^3;//电机控制继电器2号
sbit led1=P2^0;//浸泡洗指示灯
sbit led2=P2^1;//速洗指示灯
sbit led3=P2^2;//标准洗指示灯
sbit led4=P2^3;//脱水指示灯
sbit led5=P2^4;//烘干指示灯
sbit s1=P3^2;//数码管显示第一位公共端
sbit s2=P3^3;//数码管第二位显示控制公共端
sbit k5=P3^0;//烘干电机

sbit ks1=P3^4;//洗衣机电源开关
sbit ks2=P3^5;//洗衣机模式选择
sbit ks3=P3^6;//启动按键

sbit kk1=P3^1;//洗涤完报警

unsigned int i,i1,i2,i3,i4;	//用于全局时钟定义
unsigned char sf;		  //电机,正反转标志位
unsigned char q[]={20,40,80,5,20};//五个模式显示时间	
unsigned char q6[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
                    0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//共阴数码管码表
/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
 TMOD |= 0x01;	       
 TH0=(65535-50000)/256;	  // 50ms*20=1000ms=1s   
 TL0=(65535-50000)%256;
 EA=1;            //总中断打开
 ET0=1;           //定时器中断打开
// TR0=1;           //定时器开关打开
}
void delay(unsigned int t)
   {while(t--);}
void a1()
  {
  
                      switch(as)
					  {		 
							case 1:
								if(0xbe<Get_CHx_AD_Value(0))	//	 10*25 =250
                                {TR0=1;k1=1;}else{TR0=0;k1=0;k2=k3=k4=k5=1;sf=0;}break;  
							case 2:
								if(0x9e<Get_CHx_AD_Value(0))	//	 10*25 =250
                                {TR0=1;k1=1;}else{TR0=0;k1=0;k2=k3=k4=k5=1;sf=0;}break;
							case 3:
								if(0x91<Get_CHx_AD_Value(0))	//	 10*25 =250
                                {TR0=1;k1=1;}else{TR0=0;k1=0;k2=k3=k4=k5=1;sf=0;}break;
							case 4:
								if(0x8a<Get_CHx_AD_Value(0))	//	 10*25 =250
                                {TR0=1;k1=1;}else{TR0=0;k1=0;k2=k3=k4=k5=1;sf=0;}break;
							case 5:
								if(0x81<Get_CHx_AD_Value(0))	//	 10*25 =250
                                {TR0=1;k1=1;}else{TR0=0;k1=0;k2=k3=k4=k5=1;sf=0;}break; 
							case 6:
								if(0x6e<Get_CHx_AD_Value(0))	//	 10*25 =250
                                {TR0=1;k1=1;}else{TR0=0;k1=0;k2=k3=k4=k5=1;sf=0;}break;
							case 7:
								if(0x61<Get_CHx_AD_Value(0))	//	 10*25 =250
                                {TR0=1;k1=1;}else{TR0=0;k1=0;k2=k3=k4=k5=1;sf=0;}break;
							case 8:
								if(0x55<Get_CHx_AD_Value(0))	//	 10*25 =250
                                {TR0=1;k1=1;}else{TR0=0;k1=0;k2=k3=k4=k5=1;sf=0;}break;
							case 9:
								if(0x44<Get_CHx_AD_Value(0))	//	 10*25 =250
                                {TR0=1;k1=1;}else{TR0=0;k1=0;k2=k3=k4=k5=1;sf=0;}break;
						    case 10:
								if(0x34<Get_CHx_AD_Value(0))	//	 10*25 =250
                                {TR0=1;k1=1;}else{TR0=0;k1=0;k2=k3=k4=k5=1;sf=0;}break;	
										 
						}
//   if(as*25<Get_CHx_AD_Value(0))	//	 10*25 =250
//   {TR0=1;k1=1;}else{TR0=0;k1=0;k2=k3=k4=k5=1;sf=0;}
 //SendByte(Get_CHx_AD_Value(0));
  }
void a2()
  {	//	  SendByte(Get_CHx_AD_Value(0));
   if(Get_CHx_AD_Value(0)<0xe0)
     {
	  TR0=1;
	 }
	 else
	   TR0=0;
  }
/*------------------------------------------------
                    主程序
------------------------------------------------*/
//void InitUART  (void)
//{
//
//    SCON  = 0x50;		        // SCON: 模式 1, 8-bit UART, 使能接收  
//    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
//    TH1   = 0xF3;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
//    TR1   = 1;                  // TR1:  timer 1 打开                         
//    EA    = 1;                  //打开总中断
//    //ES    = 1;                  //打开串口中断
//} 
//void SendByte(unsigned char dat)
//{
// SBUF = dat;
// while(!TI);
//      TI = 0;
//	 
//}    
void main()
{unsigned int xc1,xc2,xc3; //XC1用于计算模式
  unsigned int sd=0;   //蜂鸣器循环次数报警
	ks1=ks2=ks3=1;	   //案件给高电平
 Init_Timer0();//定时器初始化
 //InitUART ();
	xc2=xc3=15;
 while(1)
 {	 //  SendByte(Get_CHx_AD_Value(0));
	 if(ks1==0)
	 { delay(20000);   //按键延时去抖
	  xc2=xc3=15;
		  while(ks1==0);//等待按键释放
		 while(1)
		 { stop: //跳转介质为
		  if(ks2==0)
		  {delay(20000);
				while(ks2==0);
				xc1++;	 //每次进入模式选择+
		 	    
				if(xc1==6){xc1=1;}//当循环到6重新,跳动到第一个
				switch(xc1)	  //判断进入点亮相应,LED
				{case 1:
					   led1=0;led2=led3=led4=led5=1;break; //点亮之后直接退出
					case 2:
					   led2=0;led1=led3=led4=led5=1;break;
					case 3:
					   led3=0;led2=led1=led4=led5=1;break;
					case 4:
					   led4=0;led2=led3=led1=led5=1;break;
					case 5:
					   led5=0;led2=led3=led4=led1=1;break;
        }
		xc2=q[xc1-1]/10;//显示时间转换		 25/10;
				xc3=q[xc1-1]%10;//显示时间转换		  25%10;
				//if(xc1==5){xc1=0;}
      }
				if(ks3==0)	//判断,是否启动按键按下
				{delay(20000); //延时去抖
					switch(xc1)//判断案件为哪一个模式,并,把时间给定时器
					  {		  //如果都不是,则为零
							case 1:
								i2=20;i3=0;break;	  
							case 2:
								i2=40;i3=0;break;
							case 3:
								i2=80;i3=0;break;
							case 4:
								i2=5;i3=0;break;
							case 5:
								i2=20;i3=0;break;		 
						}
				 if(i2==0) //判断如果启动时时间为零,则进入设置为模式
				   { while(1) //死循环,一直在设置水位
				   	 {	if(ks3==0)	//帮,启动按键再次按下时水加
					   {delay(20000);//简单延时去抖
					   as++;		  //,变量加
					   if(as==11)as=1; //最高水位设置为10当再次达到11位变为1
					   while(ks3==0);  //等待按键释放
					   }
				s1=0;s2=1;//打开第一个数码管
		        P0=q6[as/10]; //进行数据处理并打印
		        delay(10);	//进行延时稳定
		        P0=0x00;	 //萧影
		 
		        s1=1;s2=0;
		        P0=q6[as%10];
		        delay(10);
		        P0=0x00;
				if(ks1==0){delay(20000);while(ks1==0);goto stop;}//如果当开关按下时跳转到前面,开机状态
					 }
				   }
          while(ks3==0);  //判断案件释放
		   	TR0=1;	        //打开定时器进行计数
					while(1)   //死循环,用于判断整个流程完成
					{
				s1=0;s2=1;	  //数码管显示用于打印定时器时间
		        P0=q6[i2/10];
		        delay(10);
		        P0=0x00;
		 
		        s1=1;s2=0;
		        P0=q6[i2%10];
		        delay(10);
		        P0=0x00;
						switch(xc1)	 //判断模式
						 {
                               case 1:
								switch(i3)
                            {            case 0:
											  a1();break;
										 case 1:
											 k1=k2=k5=1;sf=1;break;
										 case 7:
											 k2=0;k1=k3=k4=k5=1;sf=0;a2();break;
										 case 8:
											 k3=0;k1=k2=k4=k5=1;sf=0;break;
										 case 9:
											 a1();break;
										 case 10:
											 k1=k2=k5=1;sf=1;break;
										 case 14:
											 k2=0;k1=k3=k4=k5=1;sf=0;a2();break;
										 case 15:
											 k3=0;k1=k2=k4=k5=1;sf=0;break;
                           }break;
							        case 2:
									switch(i3)
                                        {case 0:
											  a1();break;
										 case 1:
											 k1=k2=k5=1;sf=1;break;
										 case 15:
											 k2=0;k1=k3=k4=k5=1;sf=0;a2();break;
										 case 16:
											 k3=0;k1=k2=k4=k5=1;sf=0;break;
										 case 17:
											  a1();break;
										 case 18:
											 k1=k2=k5=1;sf=1;break;
										 case 30:
											 k2=0;k1=k3=k4=k5=1;sf=0;a2();break;
										 case 31:
											 k3=0;k1=k2=k4=k5=1;sf=0;break;
                                        }
										break;
							case 3:
									switch(i3)
                                        {case 0:
											  a1();break;
										 case 1:
											 k1=k2=k5=k3=k4=1;break;
										 case 40:
											 k1=k2=k5=1;sf=1;break;
										 case 55:
											 k2=0;k1=k3=k4=k5=1;sf=0;a2();break;
										 case 56:
											 k3=0;k1=k2=k4=k5=1;sf=0;break;
										 case 57:
											 a1();break;
										 case 58:
											 k1=k2=k5=1;sf=1;break;
										 case 70:
											 k2=0;k1=k3=k4=k5=1;sf=0;a2();break;
										 case 71:
											 k3=0;k1=k2=k4=k5=1;sf=0;break;
                                         }
							break;
							case 4:
								switch(i3)
                                         {case 0:
											 k2=0;k1=k3=k4=k5=1;sf=0;a2();break;
										 case 1:
											 k3=0;k1=k2=k4=k5=1;sf=0;break;
										
                                         }
							break;
							case 5:
								switch(i3)
                                        {case 0:
											 k2=0;k1=k3=k4=k5=1;sf=0;a2();break;
										 case 1:
											 k5=0;k1=k2=k4=k3=1;sf=0;break;
                                        }
							break;
                      }
						 if(i2==0){P0=P1=P2=P3=0xff;TR0=0;
                  xc1=xc2=xc3=0;i=i1=i2=i3=i4=0;sf=0;ks1=0;break;}
						 if(ks1==0)break;
					}
        }
		 s1=0;s2=1;
		 P0=q6[xc2];
		 delay(10);
		 P0=0x00;
		 
		 s1=1;s2=0;
		 P0=q6[xc3];
		 delay(10);
		 P0=0x00;
				
			 
			 if(ks1==0){delay(20000);P0=P1=P2=P3=0xff;TR0=0;
                  xc1=xc2=xc3=0;i=i1=i2=i3=i4=0;sf=0;
				  for(sd=5;sd>0;sd--){delay(20000);kk1=1;delay(20000);kk1=0;}
				  kk1=1;break;}
     }
		   if(i2==0){ks1=1;}
		  while(ks1==0);
   }
	 else
	 {s1=0;s2=1;
		 P0=q6[16];
		 delay(10);
		 P0=0x00;
		 
		 s1=1;s2=0;
		 P0=q6[16];
		 delay(14);
		 P0=0x00;

   } 
}
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
 TH0=(65535-50000)/256;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
 TL0=(65535-50000)%256;		  //50ms*20=1000ms=1s;
	i++;
if(i==20)
{i=0;	//用于下一次计算
	if(sf==1){i4++;if(i4==1){k3=1;k4=0;}if(i4==2){k3=0;k4=1;i4=0;}}
	//{k3=1;k4=0;}
	i1++;
  if(i1==5)
	{i1=0;
		i2--;
		i3++;

  }
}
}

.

.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值