⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3_24_2.c

📁 基于89C51的全自动洗衣机控制系统,Keil+Protues,全部源码及仿真。
💻 C
字号:
//有电机
/*****头文件****/
#include 	<reg51.h>
//数据类型宏定义
#define 	uchar	unsigned char
#define		uint	unsigned int
//使能、禁止宏定义
#define		Enable();	EA=1;
#define		Disable();	EA=0;
//程序选择功能标志宏定义
#define		BIAOZHUN		0
#define		JINGJI			1
#define		DANDU			2
#define		PAISHUI			3
//强弱选择功能标志宏定义
#define		QIANGXI			0
#define		RUOXI			1	
//进水、排水时间限制宏定义
#define		T_JinShui		5		//4min*60s
#define		T_PaiShui		60		//1min*60s
//管脚定义,都是低有效,因LED是灌电流,而PNP也是低电平时导通
sbit	LED_BiaoZhun	=	P1^0;	//标准程序显示灯
sbit	LED_JingJi		=	P1^1;	//经济程序显示灯
sbit	LED_DanDu		=	P1^2;	//单独程序显示灯
sbit	LED_PaiShui		=	P1^3;	//排水程序显示灯
sbit	LED_QiangXi		=	P1^4;	//强洗状态灯
sbit	LED_RuoXi		=	P1^5;	//弱洗状态灯
sbit	LED_XiDi		=	P1^6;	//洗涤状态灯
sbit	LED_PiaoXi		=	P1^7;	//漂洗状态灯
sbit	LED_TuoShui		=	P2^0;	//脱水状态灯
sbit	PIN_BaoJing		=	P2^1;	//报警喇叭
sbit	PIN_JinShui		=	P2^2;	//进水控制
sbit	PIN_PaiShui		=	P2^3;	//排谁控制
sbit	PIN_Motor_A		=	P2^4;	//电机脚A
sbit	PIN_Motor_B		=	P2^5;	//电机脚B
sbit	K_SEL_ChengXu	=	P3^0;	//选择程序键
sbit	K_SEL_QiangRuo	=	P3^1;	//选择强弱键
sbit	p32				=	P3^2;	//
sbit	p33				=	P3^3;	//
sbit	SW_AnQuan		=	P3^6;	//安全开关,水位、盖
//数据定义
uchar	flag_SEL_ChengXu;			//默认为标准程序,			
bit		flag_SEl_QiangRuo;			//默认为强洗,1为弱洗
bit		flag_Run;					//运行标志,1为运行
bit		flag_ZanTing;				//暂停标志,1为暂停
bit		flag_JinShui;				//进水标志,1为进水
bit		flag_PaiShui;				//排水标志,1为排水
bit		flag_XiDi;					//置洗涤标志
bit		flag_PiaoXi;				//置漂洗标志
bit		flag_TuoShui;				//脱水标志
bit		flag_BaoJing;				//报警标志
uchar	T_S;						//定时总时间
uchar 	_50ms;						//每50ms加一次的变量
uchar	s;							//秒

void Delay(uchar t1,uchar t2)		//延时程序
{	for(;t1;t1--)
		for(;t2;t2--);
}

void Pin_Init(void)					//管脚初始化程序
{	LED_BiaoZhun	=	0;			//默认为标准程序,灯亮
 	LED_JingJi		=	1;			//经济程序显示灯,灭
 	LED_DanDu		=	1;			//单独程序显示灯,灭
 	LED_PaiShui		=	1;			//排水程序显示灯,灭
 	LED_QiangXi		=	0;			//默认为强洗状态,灯亮
 	LED_RuoXi		=	1;			//弱洗状态灯,灭
 	LED_XiDi		=	1;			//洗涤状态灯,运行后灯亮
 	LED_PiaoXi		=	1;			//漂洗状态灯,运行后灯亮
 	LED_TuoShui		=	1;			//脱水状态灯,运行后灯亮
 	PIN_BaoJing		=	1;			//报警喇叭,不叫
 	PIN_JinShui		=	1;			//进水控制,关
 	PIN_PaiShui		=	1;			//排谁控制,关
 	PIN_Motor_A		=	1;			//电机脚A,不走
 	PIN_Motor_B		=	1;			//电机脚B,不走
}

void ExInt_Init(void)				//中断初始化程序
{	IT0	=	1;
	EX0	=	1;
	IT1	=	1;
	EX1	=	1;
}

void Timer0_Init(void)				//定时器0初始化程序
{	TMOD 	=	TMOD | 0X01;		//定时方式1
	TH0		=	0X3C;				//50ms
	TL0		=	0XB0;
	ET0		=	1;	
	TR0		= 	1;
}
/*
void Timer1_Init(void)				//定时器1初始化程序
{	TMOD 	=	TMOD | 0X10;		//定时方式1
	TH1		=	0X3C;				//50ms
	TL1		=	0XB0;
	ET1		=	1;	
	TR1		= 	1;
}
*/
void int0(void) interrupt 0			//外部中断0程序为运行或者暂停
{	static bit int0_first = 1;
	if(!p32)
	{	Delay(8,250);				//延时10ms左右,去抖动
		if(!p32)
		{	if(int0_first)			//第一次
			{	int0_first 	= 0;	//清第一次进中断0标志
				flag_Run 	= 1;	//置运行标志
				flag_JinShui= 1;	//置进水标志
				LED_XiDi	= 0;	//洗涤状态灯,运行后灯亮
			 	LED_PiaoXi	= 0;	//漂洗状态灯,运行后灯亮
			 	LED_TuoShui	= 0;	//脱水状态灯,运行后灯亮
				PIN_JinShui	= 1;	//进水控制,启动				
				Timer0_Init();		//初始化定时器0并启动之
				T_S	= T_JinShui;	//赋进水时间限制值
			}//end if(flag_first)

			else					//非第一次
			{	flag_ZanTing = ~flag_ZanTing; 	//暂停Yes or No//暂停程序难写!!!!!!!?????
				if(flag_BaoJing)
				{	flag_ZanTing = 1; 			//置暂停标志
					flag_BaoJing = 0;			//清报警标志
					PIN_BaoJing	 = 1;			//解决报警
				}//end if(flag_BaoJing)
			}//end else					
		}//end if(!p32) 2
	}//end if(!p32) 1
}

void Timer0(void) interrupt 1		//定时器0中断程序
{	
	ET0 = 0;						//关定时器0
	TH0 = 0X3C;						//重装定时器值
	TL0 = 0XB0;
	ET0 = 1;
	_50ms++;
	if(flag_JinShui | flag_PaiShui)	//进水中~、排水中~
	{	if(_50ms == 20)					//1s到
		{	_50ms = 0;
			s++;
			if(s == T_S)				//定时到
			{	s = 0;			
				flag_BaoJing= 1;		//置报警标志
				PIN_BaoJing	= 0;		//报警喇叭
				PIN_JinShui = 0;
				flag_JinShui= 0;
				TR0			= 0;		//关定时器0
			}//end if(s == T_S)
	  	}//end if(_50ms == 20)
	}//end if(flag_JinShui | flag_Paishui)

		else
		{	if(_50ms == 14)						//0.7s到
			{	_50ms = 0;
				if(flag_XiDi)					//洗涤中~
					LED_XiDi 	= ~LED_XiDi;	//洗涤状态灯闪烁
				if(flag_PiaoXi)					//漂洗中~
					LED_PiaoXi 	= ~LED_PiaoXi;	//漂洗状态灯闪烁
				if(flag_TuoShui)				//脱水中~
					LED_TuoShui = ~LED_TuoShui;	//脱水状态灯闪烁
		 	}//end if(_50ms == 14)
		}//end else
}

void int1(void) interrupt 2			//外部中断1程序为水位到或者盖开处理
{	if(!p33)
	{	Delay(8,250);				//延时10ms左右,去抖动
		if(!p33)
		{	
		}//end if(!p33) 2
	}//end if(!p33) 1
}

	

void Timer1(void) interrupt 3		//定时器1中断程序作为闪烁
{	static uchar 	_50ms;			//每50ms加一次的变量
	ET1 = 0;						//关定时器0
	TH1 = 0X3C;						//重装定时器值
	TL1 = 0XB0;
	ET1 = 1;
	_50ms++;	
}

void SEL_ChengXU(void)				//程序选择程序
{	flag_SEL_ChengXu++;
	if(flag_SEL_ChengXu==4)
		flag_SEL_ChengXu = 0;
	switch(flag_SEL_ChengXu)
	{	case BIAOZHUN	:	LED_BiaoZhun= 0;		//亮
							LED_JingJi	= 1;		//灭
							LED_DanDu	= 1;		//灭
							LED_PaiShui	= 1;		//灭
							break;
		case JINGJI		:	LED_BiaoZhun= 1;
							LED_JingJi	= 0;	
							LED_DanDu	= 1;
							LED_PaiShui	= 1;
							break;
		case DANDU		:	LED_BiaoZhun= 1;
							LED_JingJi	= 1;	
							LED_DanDu	= 0;
							LED_PaiShui	= 1;
							break;
		case PAISHUI 	:	LED_BiaoZhun= 1;
							LED_JingJi	= 1;	
							LED_DanDu	= 1;
							LED_PaiShui	= 0;
							break;
		default			:	break;
   }//end switch
}

void SEL_QiangRuo(void)					//强弱选择程序
{	flag_SEl_QiangRuo = ~flag_SEl_QiangRuo;
	if(!flag_SEl_QiangRuo)	
	{	LED_QiangXi	= 0;				//强洗状态,灯亮
		LED_RuoXi	= 1;				//弱洗状态灯,灭
	}//end if(!flag_SEl_QiangRuo)
	
	else
	{	LED_QiangXi	= 1;				//强洗状态,灯亮
		LED_RuoXi	= 0;				//弱洗状态灯,灭
	}//end else
}

void Delay_1s()
{	uchar t1;
    uint t2;
	for(t1=0;t1<=200;t1++)
		for(t2=0;t2<=928;t2++);
}

void XiDi(uchar s)
{	uchar t;
	PIN_Motor_A		=	0;			//正转
 	PIN_Motor_B		=	1;
	for(t=0;t<s;t++)
		Delay_1s();	
	PIN_Motor_A		=	1;			//停
 	PIN_Motor_B		=	1;
	Delay_1s();
	PIN_Motor_A		=	1;			//反转
 	PIN_Motor_B		=	0;
	for(t=0;t<s;t++)
		Delay_1s();	
}

void main()								//主程序
{	
	Pin_Init();							//管教初始化
	ExInt_Init();						//外中断初始化
	Enable();							//开总中断
	while(1)
	{	if(!flag_Run)					//运行前按键才有效
		{	if(!K_SEL_ChengXu)			//程序选择键
			{	Delay(10,250);			//延时10ms左右,去抖动
				if(!K_SEL_ChengXu)
				{	while(!K_SEL_ChengXu);
					SEL_ChengXU();		//程序选择程序
				}//end if(!K_Sel_ChengXu) 2
			}//end if(!K_Sel_ChengXu) 1
	
			if(!K_SEL_QiangRuo)			//强弱选择键
			{	Delay(10,250);			//延时10ms左右,去抖动
				if(!K_SEL_QiangRuo)
				{	while(!K_SEL_QiangRuo);
					SEL_QiangRuo();		//强弱选择程序
				}//end if(!K_SEL_QiangRuo) 2
			}//end if(!K_SEL_QiangRuo) 1
	  	}//end if(!flag_Run)

		else								//运行中~
		{	if(flag_JinShui)				//进水中~
			{	if(!SW_AnQuan)				//水位到
				{	flag_JinShui = 0;		//清进水标志
					flag_XiDi = 1;			//置洗涤标志
					_50ms = 0;
				}//end if(!SW_AnQuan)
			}//end 	if(flag_First)
			
			else if(!flag_SEl_QiangRuo)		//强洗中~,不用定时器,难写
			{	XiDi(4);					//正反转4s
			}//end else if(!flag_SEl_QiangRuo)
		
			else if(flag_SEl_QiangRuo)		//弱洗中~,不用定时器,难写
			{	XiDi(3);					//正反转3s
			}//end else if(flag_SEl_QiangRuo)

			while(flag_ZanTing);			//暂停中						
		}//end else//运行中
   	}//end while
}//end main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -