基于51单片机的全自动洗衣机仿真

仿真图:

在这里插入图片描述

芯片/模块的特点:

AT89C52简介:
AT89C52是一款经典的8位单片机,是意法半导体(STMicroelectronics)公司生产的一系列单片机之一。它基于8051内核,并具有许多与其兼容的特性。

AT89C52的主要特点如下:

内部存储器:AT89C52具有8KB的闪存(Flash)存储器,可用于存储用户程序和数据。这些存储器的内容可以通过编程器进行编程和擦除。

RAM存储器:AT89C52配备了256字节的随机存取存储器(RAM),用于暂存数据和程序的变量。

外部扩展性:AT89C52支持多种外部扩展设备的连接,包括外部存储器(如RAM、EEPROM)和外设(如ADC、LCD、UART等),通过外部硬件连接,可以扩展单片机的功能和应用。

通用I/O引脚:AT89C52拥有32个可编程的通用输入/输出引脚,可用于连接外部设备和与其他芯片进行通信。

定时器/计数器:AT89C52内置了3个16位定时器/计数器和一个可编程的串行定时器/计数器。这些计时器/计数器可用于实现定时功能、生成脉冲信号、测量时间间隔等。

串行通信:AT89C52支持串行通信接口,包括UART(串行异步通信)和SPI(串行外设接口),便于与其他设备进行数据通信和交互。

低功耗模式:AT89C52具有多种低功耗模式,如空闲模式和电源下模式,在不需要执行任务的时候可以将CPU进入低功耗状态以节省能量。

宽电源电压范围:AT89C52的工作电压范围通常为4.0V至5.5V,可以满足大多数应用需求。

L298特点:

高驱动能力:L298具有高驱动电流能力,能够提供最高4安培的峰值输出电流。这使得它可以驱动较大功率的直流电机,适用于许多高性能应用。

双全桥结构:L298具有双全桥结构,即两个独立的H桥电路,可以分别控制两个直流电机的运行方向和速度。这种结构使得同时控制多个电机变得更加方便。

输入控制灵活:L298的输入控制接口可以使用标准的逻辑电平(TTL或CMOS)来控制电机的运行。它可以接受脉冲宽度调制(PWM)信号来实现速度控制,并且支持正向、反向和制动模式的控制。

内置保护功能:L298具有内置的过流保护和过温保护功能,可以保护芯片和外部电路免受损坏。当输出电流超过设定值或芯片温度过高时,保护功能会自动触发。

低功耗待机模式:L298具有低功耗待机模式,可以通过控制输入信号将芯片置于低功耗状态。这有助于节省电能和延长电池寿命。

多种封装形式:L298可提供不同的封装形式,如多引脚直插式封装(DIP)和表面贴装技术(SMT)封装。这使得L298适应不同应用的安装需求。

主程序:

#include<reg52.h>
	#define uchar unsigned char
	#define uint unsigned int
	uchar num=0,num1=0,num2=0,num3=0,num4=0,num5=0,num6=0,flag=0,flag1=0,flag4=0,flag5=0,circle=0;
	sbit ledbiaozhun=P1^0; //LED指示灯
	sbit ledjingji  =P1^1;
	sbit leddandu   =P1^2;
	sbit ledpaishui =P1^3;
	sbit ledqiangxi =P1^4;
	sbit ledruoxi   =P1^5;
	sbit ledxidi    =P1^6;
	sbit ledpiaoxi  =P1^7;
	sbit ledtuoshui =P2^2;
	
	sbit paishui=P2^6; //排水阀控制
	sbit jinshui=P2^7; //进水阀控制
	
	sbit U2=P2^0;
	sbit U3=P2^1;
	sbit k1=P3^4;  // 步进改变"标准、经济、单独、排水"四种方式
	sbit k2=P3^5;  //强洗、弱洗
	sbit k3=P3^2;  //运行、暂停和解除报替功能
	void init()
	{
		uchar a=0,b=0,c=0;
		TMOD=0x01;		       //T0工作于方式1
		TH0=(65536-50000)/256; //定时时间50ms
		TL0=(65536-50000)%256;
		EA=1;				   //开总中断
		ET0=1;				   //开T0中断
		TR0=0;				   //关闭T0
		EX0=1;				   //开外部中断0
		IT0=1;				   //外部中断0边沿触发方式
		U2=1;				   //电机停转
		U3=1;
		P0=0xff;
	}
	void delayms(uint xms) //延时
	{
		uint i,j;
		for(i=xms;i>0;i--)
			for(j=110;j>0;j--);
	}
	
	void key()		//控制按键
	{
		circle=1;
		if(k1==0)		//标准、经济、单独、排水按下
		{
			delayms(10); //延时消抖
			if(k1==0)	 //再判
			{
				num++;	 //K1按下次数加1
				if(num==4)
					num=0;	//等于4,按下次数清0
				while(!k1);	//等待按键释放
			}
		}
		
		if(k2==0)				//强弱选择
		{
			delayms(10);   //延时消抖
			if(k2==0)	   //再判
			{
				num1++;	 //按下次数加1
				if(num1==2)
					num1=0;	//等于2,按下次数清0
				while(!k2);	//等待按键释放
			}
		}
	}
	
	void qiang()			  //强
	{
		if(flag4==0)  //电机正转
		{	
			U2=0;
			U3=1;
		}
	
		if(flag4==1)  //电机反转
		{
			U2=1;
			U3=0;
		}	
	}
	void ruo()			//弱
	{
		if(flag5==0) //电机正转
		{	
			U2=0;
			U3=1;
		}
	
		if(flag5==1) //电机反转
		{
			U2=1;
			U3=0;
		}
	}
	
	void qbiaozhun()			//强标准
	{
		/*******洗涤********/
			num=0;
			num1=0;
			ledbiaozhun=0;//标准洗LED亮
			ledqiangxi=0; //强洗LED亮
			jinshui=0;	  //打开进水阀
			ledxidi=1;    //洗涤
			ledpiaoxi=1;  //漂洗LED亮
			ledtuoshui=1; //脱水LED亮
			delayms(5000);//水位监测
			jinshui=1; //关闭进水阀
			ledxidi=0;
			flag1=1;	//	
			TR0=1;	    //启动定时器T0
			while(flag==0)//flag为洗涤次数标志位
			{ 	
				if(flag==0&&num2==1)
				{	 
					TR0=1;
					flag1=1; //
					qiang();
				}
				if(flag==0&&num2==2)
				{
					TR0=0; //关闭定时器T0
					U2=1;  //电机停止
					U3=1;
				}
			};
			//漂洗
			U2=1;
			U3=1;					
			TR0=0;
			flag1=0;
			paishui=0; //排水
			ledtuoshui=1;
			ledpiaoxi=1;
			ledxidi=1;
			delayms(5000);
			paishui=1;	//关闭排水
			delayms(100);
			jinshui=0;	//打开进水
			delayms(5000);
			jinshui=1;	 //关闭进水
			ledpiaoxi=0;
			flag1=2;
			TR0=1;
			num3=0;
			num4=0;
			while(flag==1)
			{
				if(flag==1&&num2==1)//强漂洗
				{	 
					TR0=1;
					flag1=2;
					qiang();
				}
				if(flag==1&&num2==2)//暂停强漂洗
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			};
			//漂洗
			U2=1;
			U3=1;
			TR0=0;
			flag1=0;
			paishui=0;
			ledtuoshui=1;
			ledpiaoxi=0;
			delayms(5000);
			paishui=1;
			delayms(100);
			jinshui=0;
			delayms(5000);
			jinshui=1;
			flag1=2;
			TR0=1;
			num3=0;
			num4=0;
			 
			while(flag==2)
			{
			 	if(flag==2&&num2==1)
				{	 
					TR0=1;
					flag1=2;
					qiang();
				}
				if(flag==2&&num2==2)
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			 }	;
			//脱水
			U2=1;
			U3=1;
			TR0=0;
			flag1=0;
			paishui=0;//打开排水
			ledtuoshui=0;
			ledpiaoxi=1;
//			while(sgai);
			paishui=1;
			delayms(1000);
			flag1=3;
			TR0=1;
			num3=0;
			num4=0;
			while(flag==3)
			{
				if(flag==3&&num2==1)
				{
					TR0=1;
					U2=0;
					U3=1;
					flag1=3;
				}
				if(flag==3&&num2==2)
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			};
			ledtuoshui=1;
			U2=1;
			U3=1;
			flag1=0;			
	}
	
	void qjingji()			//强经济
	{
		/*******洗涤********/
			num=0;
			num1=0;
			ledjingji=0;
			ledqiangxi=0;
			ledtuoshui=1;
			ledpiaoxi=1;
			ledxidi=1;
			jinshui=0;
			delayms(5000);
			jinshui=1;
			flag1=1; //控制定时器中的洗涤指示灯
			TR0=1;
			while(flag==0)
			{ 	
				if(flag==0&&num2==1)
				{	 
					TR0=1;
					flag1=1;
					qiang();
				}
				if(flag==0&&num2==2)
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			};
			
			//漂洗					
			TR0=0;
			U2=1;
			U3=1;
			flag1=0;
			paishui=0;
			ledjingji=0;
			ledtuoshui=1;
			ledxidi=1;
			delayms(5000);
			paishui=1;
			delayms(100);
			jinshui=0;
			delayms(5000);
			jinshui=1;
			ledpiaoxi=0;
			flag1=2;
			TR0=1;
			num3=0;
			num4=0;
			while(flag==1)
			{
				if(flag==1&&num2==1)
				{	 
					TR0=1;
					flag1=2;
					qiang();
				}
				if(flag==1&&num2==2)
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			};
			//脱水
			TR0=0;
			U2=1;
			U3=1;	
			flag1=0;
			paishui=0;	 //打开排水
			ledjingji=0;
			ledtuoshui=0;
			ledpiaoxi=1;
			delayms(5000);
//			while(sgai);
			paishui=1;
			delayms(1000);
			flag1=3;
			TR0=1;
			flag=2;
			num3=0;
			num4=0;
			while(flag==2)
			{
				if(flag==2&&num2==1)
				{
					TR0=1;
					U2=0;
					U3=1;
					flag1=3;
				}
				if(flag==2&&num2==2)
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			};
			ledtuoshui=1;
			U2=1;
			U3=1;
			flag1=0;
	}
	
	void qdandu()               //强单独
	{
		num=0;
		num1=0;
		ledqiangxi=0;
		ledxidi=0;
		leddandu=0;
		jinshui=0;
		delayms(5000);
		jinshui=1;//关闭进水阀
		flag1=1;
		TR0=1;
		while(flag==0)
		{
			if(flag==0&&num2==1)
				{	 
					TR0=1;
					flag1=1;
					qiang();
				}
				if(flag==0&&num2==2)
				{
					TR0=0;
					U2=1;
					U3=1;
				}
		};
		flag1=0;
		U2=1;
		U3=1;
	}
	
	void rbiaozhun()			//弱标准
	{
		/*******洗涤********/
			num=0;
			num1=0;
			ledbiaozhun=0;
			ledruoxi=0;
			ledtuoshui=1;
			ledpiaoxi=1;	
			jinshui=0;
			delayms(5000);
			jinshui=1;
			ledxidi=0;
			flag1=1;		
			TR0=1;	
			while(flag==0)
			{ 	
				if(flag==0&&num2==1)
				{	 
					TR0=1;
					flag1=1;
					ruo();
				}
				if(flag==0&&num2==2)
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			};
			//漂洗
			U2=1;
			U3=1;					
			TR0=0;
			flag1=0;
			paishui=0;
			ledtuoshui=1;
			ledxidi=1;
			delayms(5000);
			paishui=1;
			delayms(100);
			jinshui=0;
			delayms(5000);
			jinshui=1;
			ledpiaoxi=0;
			flag1=2;
			TR0=1;
			num3=0;
			num4=0;
			while(flag==1)
			{
				if(flag==1&&num2==1)
				{	 
					TR0=1;
					flag1=2;
					ruo();
				}
				if(flag==1&&num2==2)
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			};
			//漂洗
			U2=1;
			U3=1;
			TR0=0;
			flag1=0;
			paishui=0;
			ledtuoshui=1;
			ledpiaoxi=0;
			delayms(5000);
			paishui=1;
			delayms(100);
			jinshui=0;
			delayms(5000);
			jinshui=1;
			flag1=2;
			TR0=1;
			num3=0;
			num4=0;	 
			while(flag==2)
			{
			 	if(flag==2&&num2==1)
				{	 
					TR0=1;
					flag1=2;
					ruo();
				}
				if(flag==2&&num2==2)
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			 }
			//脱水
			U2=1;
			U3=1;
			TR0=0;
			flag1=0;
			paishui=0;
			delayms(5000);
			ledtuoshui=0;
			ledpiaoxi=1;
//			while(sgai);
			paishui=1;
			delayms(1000);
			flag1=3;
			TR0=1;
			num3=0;
			num4=0;
			while(flag==3)
			{
				if(flag==3&&num2==1)
				{
					TR0=1;
					U2=0;
					U3=1;
					flag1=3;
				}
				if(flag==3&&num2==2)
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			};
			ledtuoshui=1;
			U2=1;
			U3=1;
			flag1=0;
	}
	
	void rjingji()			//弱经济
	{
		/*******洗涤********/
			num=0;
			num1=0;
			ledjingji=0;
			ledruoxi=0;
			ledtuoshui=1;
			ledpiaoxi=1;
			ledxidi=1;
			jinshui=0;
			delayms(5000);
			jinshui=1;	 //打开进水阀,进水
			flag1=1;
			TR0=1;
			while(flag==0)
			{ 	
				if(flag==0&&num2==1) //弱经济洗
				{	 
					TR0=1;
					flag1=1;
					ruo();
				}
				if(flag==0&&num2==2) //弱经济洗暂停
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			};
			
			//漂洗					
			TR0=0;
			U2=1;
			U3=1;
			flag1=0;
			paishui=0;	//排水阀打开
			ledjingji=0;
			ledtuoshui=1;
			ledxidi=1;
			delayms(5000);
			paishui=1; //排水阀关闭
			delayms(100);
			jinshui=0; //进水阀打开 
			delayms(5000);
			jinshui=1; //进水阀关闭
			ledpiaoxi=0;
			flag1=2;
			TR0=1;
			num3=0;
			num4=0;
			while(flag==1)
			{
				if(flag==1&&num2==1)//漂洗
				{	 
					TR0=1;
					flag1=2;
					ruo();
				}
				if(flag==1&&num2==2)//漂洗暂停
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			};
			//脱水
			TR0=0;
			U2=1;
			U3=1;
			flag1=0;
			ledjingji=0;
			ledtuoshui=0;
			ledpiaoxi=1;
			paishui=0;	 //排水阀打开
			delayms(5000);
//			while(sgai);
			paishui=1;
			delayms(3000);
			flag1=3;
			TR0=1;
			num3=0;
			num4=0;
			while(flag==2)
			{
				if(flag==2&&num2==1)
				{
					TR0=1;
					U2=0;
					U3=1;
					flag1=3;
				}
				if(flag==2&&num2==2)
				{
					TR0=0;
					U2=1;
					U3=1;
				}
			};
			ledtuoshui=1;
			U2=1;
			U3=1;
			flag1=0;
	}
	
	void rdandu()               //弱单独
	{
		num=0;
		num1=0;
		ledruoxi=0;
		ledxidi=0;
		leddandu=0;
		jinshui=0;  //打开进水阀,进水
		delayms(5000);
		jinshui=1;
		flag1=1;
		TR0=1;	    //启动定时器T0
		while(flag==0)
		{
			if(flag==0&&num2==1)  //弱单独洗
				{	 
					TR0=1;
					flag1=1;
					ruo();		
				}
				if(flag==0&&num2==2)//弱单独洗暂停
				{
					TR0=0;
					U2=1;
					U3=1;
				}
		};
		flag1=0;
		U2=1;
		U3=1;
	}
	
	void dpaishui()				 //排水/脱水
	{
		num=0;
		num1=0;
		ledpaishui=0;
		ledtuoshui=0;
		jinshui=1;
		paishui=0;
		delayms(3000);
//		while(sgai);
		delayms(3000);
		flag1=3;
		TR0=1;
		num3=0;
		num4=0;
		while(flag==0)
		{
			if(flag==0&&num2==1) //脱水
				{	 
					TR0=1;
					flag1=3;
					U2=0;
					U3=1;
				}
				if(flag==0&&num2==2)//暂停脱水
				{
					TR0=0;
					U2=1;
					U3=1;
				}
		};
		U2=1;
		U3=1;
		flag1=0;
		ledtuoshui=1;
		paishui=1; 排水阀关闭
	}			  
	
	void main()
	{
		init();
		while(1)
		{
			key();		   //键扫描
			if((num1==0&&num==0)&&circle==1)	//标准 强洗 
			{
				ledruoxi=1;   //关闭弱洗LED
				ledpaishui=1; //关闭排水LED
				ledbiaozhun=0;//强标准LED亮	
				ledqiangxi=0; //强洗LED亮
				if(num2==1)
				{
					qbiaozhun(); //强标准洗
				}
				if(num2>1)		 //K3键按下次数为2,暂停洗涤
				{
					;	   
				}
				circle=0;
			}
			if(num1==0&&num==1)	 //经济 强洗
			{
				ledruoxi=1;	   
				ledbiaozhun=1;
				ledqiangxi=0;
				ledjingji=0;
				if(num2==1)
				{
					qjingji();	//强经济洗
					ledjingji=1;
				}
				circle=0;
			}
			if(num1==0&&num==2)	 //单独 强洗 
			{
				ledruoxi=1;
				ledjingji=1;
				ledqiangxi=0;
				leddandu=0;
				if(num2==1)
				{
					qdandu(); //强单独洗
					leddandu=1;
				}
				circle=0;
			}
			if(num1==0&&num==3)
			{
				ledruoxi=1;	  //排水 强洗
				leddandu=1;
				ledqiangxi=0;
				ledpaishui=0;
				if(num2==1)
				{
					dpaishui();	//单排水
					ledpaishui=1;
				}
				circle=0;
			}
			if(num1==1&&num==0)	  //弱 标准
			{
				ledqiangxi=1;
				ledpaishui=1;
				ledruoxi=0;
				ledbiaozhun=0;
				if(num2==1)
				{
					rbiaozhun(); //弱标准洗
					ledruoxi=1;
				}
				circle=0;
			}
			if(num1==1&&num==1)	 //弱经济
			{
				ledqiangxi=1;
				ledbiaozhun=1;
				ledruoxi=0;
				ledjingji=0;
				if(num2==1)
				{
					rjingji();	//弱经济洗
					ledruoxi=1;
					ledjingji=1;
				}
				circle=0;
			}
			if(num1==1&&num==2)
			{
				ledqiangxi=1;
				ledjingji=1;
				ledruoxi=0;
				leddandu=0;
				if(num2==1)
				{
					rdandu();	//弱单独洗
					ledruoxi=1;
					leddandu=1;
				}
				circle=0;
			}
			if(num1==1&&num==3)
			{
				ledqiangxi=1;
				leddandu=1;
				ledruoxi=0;
				ledpaishui=0;
				if(num2==1)	//K3键
				{
					dpaishui();	 //单排水
					ledpaishui=1;
				}
				circle=0;
			}
			num2=0;
		}
	}
	
	void T0_time() interrupt 1	   //定时
	{
		TH0=(65536-50000)/256;	//重赋初值
		TL0=(65536-50000)%256;
		num3++;				    //定时计数加1
		if(num3==20)	//1秒时间到
		{
			num3=0;		//计数清0
			if(flag1==1)
				ledxidi=~ledxidi;  //洗涤指示取反
			if(flag1==2)
				ledpiaoxi=~ledpiaoxi; //漂洗指示取反
			if(flag1==3)
				ledtuoshui=~ledtuoshui;	//脱水指示取反
			num4++;
			num5++;
			num6++;
			if(num4==15)	 //洗涤定时,15秒到
			{
				num4=0;			 //清0
				flag++;		 //标志洗涤次数
			}
			if(num5==5)			 //强洗周期,5秒到
			{
				num5=0;
				flag4++;         //强洗标志加1
				if(flag4==2)
					flag4=0;
			}
			if(num6==3)			//弱洗周期	,3秒到
			{
				num6=0;
				flag5++;	    //弱洗标志加1
				if(flag5==2)
					flag5=0;
			}
		}
	}

设计文件:

链接:https://pan.baidu.com/s/1yarQPrjPPpLNnctl5PRrpw?pwd=2rl8

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值