265 基于单片机C51全自动洗衣机仿真设计

完整版 电路图和程序代码 下载地址

https://pan.baidu.com/s/1uC0ARcJCbB5lH_kaxq6o2Q?pwd=8888

部分代码展示
#include<reg51.h>			  	//定义头文件
#define uint unsigned int	  	//定义字符uint
#define uchar unsigned char	  	//定义字符uchar
#define TIME0H 0xff			  	//定时器0计数器高位
#define TIME0L 0x9c			  	//定时器0计数器低位
#define TIME1H 0x3c			  	//定时器1计数器高位
#define TIME1L 0xb0			  	//定时器1计数器低位
#define MOTOR_COUNT 100		  	//PWM波输出周期计数
										
#define sol 0x6c 				//将"so"宏定义为低音"5"的频率 784Hz 
#define Dol 0x44 				//将"Do"宏定义为中音"1"的频率 523Hz 
#define Rel 0xac 				//将"Re"宏定义为中音"2"的频率 587Hz 
#define Mil 0x09 				//将"Mi"宏定义为中音"3"的频率 659Hz 
#define Fal 0x34 				//将"Fa"宏定义为中音"4"的频率 698Hz 
#define Sol 0x82 				//将"So"宏定义为中音"5"的频率 784Hz 
#define Lal 0xc8 				//将"La"宏定义为中音"6"的频率 880Hz 
#define Sil 0x05 				//将"Si"宏定义为中音"7"的频率 523H 

#define soh 0xfc 				//将"so"宏定义为低音"5"的频率 784Hz 
#define Doh 0xfc 				//将"Do"宏定义为中音"1"的频率 523Hz 
#define Reh 0xfc 				//将"Re"宏定义为中音"2"的频率 587Hz 
#define Mih 0xfd 				//将"Mi"宏定义为中音"3"的频率 659Hz 
#define Fah 0xfd 				//将"Fa"宏定义为中音"4"的频率 698Hz 
#define Soh 0xfd 				//将"So"宏定义为中音"5"的频率 784Hz 
#define Lah 0xfd 				//将"La"宏定义为中音"6"的频率 880Hz 
#define Sih 0xfe 				//将"Si"宏定义为中音"7"的频率 523H 
							  	//定义宏变量
sbit speaker =P2^6;			    //蜂鸣器控制引脚
sbit RS=P1^5;				    //LCD RS引脚
sbit R_W=P1^6;				    //LCD 读写信号
sbit EN=P1^7;				    //LCD 使能引脚
sbit motor_high=P1^0;		    //PWM输出高电平引脚
sbit motor_low=P1^1;		    //PWM输出低电平引脚
sbit motor_1_en=P1^2;		    //进水阀门引脚
sbit motor_2_en=P1^3;		    //出水阀门引脚
sbit motor_3_en=P1^4;		    //洗衣机电动使能引脚
sbit EOC=P2^4;				    //AD EOC
sbit START=P2^5;			    //AD START
sbit con=P3^5;				    //AD CON
sbit add_A=P3^0;			    //位选信号A
sbit lock_OE=P3^1;			    //74ls373锁存控制引脚

							    //定义全局变量
uchar process;				    //当前洗衣机运行状态全局变量
uchar method;				    //当前洗衣机运行方式全局变量
uchar speed;				    //当前电动机速度全局变量
uchar flag;						//标志位
uchar state;					//洗衣机运行状态选择
uint ad_level;				    //水位采样全局变量
uint ad_voltage;			    //电压采样全局变量
uint time_count;			    //定时器0中断次数全局变量
uint time_count1;			    //定时器1中断次数全局变量
uint MOTOR_ON,MOTOR_NOW;	    //电动机pwm控制计数,高电平脉冲数和当前脉冲数
uchar st_pau;				    //当前洗衣机运行全局变量
uchar step;					    //当前洗衣机运行步骤全局变量

uint Cl=0;						//
uint Ch=0;						//
uchar close=0;
							    //声明子函数
void init_LCM();			    //lcd初始化函数
void clearLCD();			    //lcd清屏函数
void write_data(char date);	    //lcd写数据函数
void write_com(char command);   //lcd写指令函数
void display()reentrant;		//lcd显示函数
void check_BF();			    //lcd检查忙碌函数
void fangshi1();			    //洗衣机运行方式1
void fangshi2();			    //洗衣机运行方式2
void fangshi3();			    //洗衣机运行方式3
void fangshi4();			    //洗衣机运行方式4
void translate(int keycode);    //按键值释放函数
void clrpara();				    //复位所有参数
void speaker_on();				//蜂鸣器
void delay(); 					//80ms延时程序
				
unsigned char f_TAB[][2]={ /**/{Sol,Soh},{Lal,Lah},{Sol,Soh},{Fal,Fah},{Mil,Mih},{Dol,Doh},//, 								//音调
			  				/**/{Sol,Soh},{Lal,Lah},{Sol,Soh},{Fal,Fah},{Mil,Mih},{Dol,Doh},/**/{Dol,Doh},{sol,soh},{Dol,Doh},
							/**/{Dol,Doh},{sol,soh},{Dol,Doh},/**/{0xff,0xff}};												
uchar time_TAB[]={3,1,3,1,4,4,/**/3,1,3,1,4,4,/**/4,4,4,8,/**/4,4,4,8};	//节拍
							 
/*****************************80ms延时*****************************/
void delay() 																							
{																														
	uchar i,j; 					//定义变量i,j
	for(i=0;i<100;i++)			//外循环
	for(j=0;j<250;j++);			//内循环
}
/***************************按键信息翻译***************************/							 
void translate(int keycode)				
{
	int key;						 	//定义临时变量key,用来判断(开始/暂停)按键次数
	switch(keycode)						//根据不同传入的keycode值,进行全局变量赋值
	{
		case 0:							//方式一			
			method = '1';				//将方式全局变量赋值为‘1’
			//return '0';				//返回‘0’结果
			break; 						//跳出分支判断
		case 1: 						//方式三
			method = '3';				//将方式全局变量赋值为‘3’
			//return '1';				//返回‘1’结果
			break; 						//跳出分支判断
		case 2: 						//速度1/4
			speed = '1';				//赋值速度全局变量为1
			MOTOR_ON = 25;				//设置PWM占空比为25/100
			//return '2';				//返回‘2’结果
			break; 						//跳出分支判断
		case 3: 						//速度3/4
			speed = '3';				//赋值速度全局变量为3
			MOTOR_ON = 75;				//设置PWM占空比为75/100
			//return '3';				//返回‘3’结果
			break; 						//跳出分支判断
		case 4: 						//方式二
			method = '2';				//将方式全局变量赋值为‘2’
			//return '4';				//返回‘4’结果
			break; 						//跳出分支判断
		case 5: 						//方式四
			method = '4';				//将方式全局变量赋值为‘4’
			//return '5';				//返回‘5’结果
			break;						//跳出分支判断
		case 6: 						//速度2/4
			speed = '2';				//赋值速度全局变量为2
			MOTOR_ON = 50;				//设置PWM占空比为50/100
			//return '6';				//返回‘6’结果
			break;						//跳出分支判断
		case 7: 						//速度4/4
			speed = '4';				//赋值速度全局变量为4
			MOTOR_ON = 100;				//设置PWM占空比为100/100
			//return '7';				//返回‘7’结果
			break;						//跳出分支判断
		case 8: 						//ON
			state =1;					//赋值洗衣机运行状态选择1
			//return '8';				//返回‘8’结果
			break;						//跳出分支判断
		case 9: 						//OFF
			state = 0;					//赋值洗衣机运行状态选择0
			//return '9';				//返回‘9’结果
			break;						//跳出分支判断
		case 10:						//START/PAUSE
		{							
			if(key==0)					//判断开始/暂停键是否按下,是继续
			{	
				st_pau=1;				//赋值洗衣机运行全局变量为1
				key++;					//key自加1
			}
			else						
			{
				st_pau=2;				//当前洗衣机运行全局变量为2
				key--;					//key自减1
			}
			//return 'A';				//返回‘A’结果
			break;						//跳出分支判断
		 }
	}
}

/*****************************LCD显示******************************/							 
void display()reentrant
{
  int level_1,level_2,level_3,voltage_1,voltage_2,voltage_3;
  //定义水位、电压显示百位、十位、各位。由于显示直接采用返回AD转换值,所以需要按照百、十、个位进行显示
  clearLCD();								//LCD清屏
  //process: 1浸泡,2脱水,3洗涤,4进水,5漂洗,
  //method:1方式一,2方式二,3方式三,4方式四
  //speed:1速度1/4,2速度2/4,3速度3/4,4速度4/4
  level_1 = ad_level / 100 + 48;			//获得水位检测百位,同时转化为ASCII码
  level_2 = (ad_level %100 ) /10 + 48;		//获得水位检测值十位,同时转化为ASCII码
  level_3 = (ad_level %10 ) + 48;		    //获得水位检测值个位,同时转化为ASCII码
  voltage_1 = ad_voltage / 100 + 48;	    //获得电压转换值百位,转化为ASCII码
  voltage_2 = (ad_voltage %100 ) /10 + 48;	//获得电压转换值十位,转化为ASCII码
  voltage_3 = (ad_voltage %10 ) + 48;		//获得电压转换值个位,转化为ASCII码
  if (state == 1)							//如果洗衣机当前运行状态为on开启状态
  {				
	  switch(process)					    //根据不同的运行状态,在LCD第一行显示运行状态信息
	  {
	  	case '1':	  						//进水
		  write_data('J');					//显示字符‘J’
		  write_data('I');					//显示字符‘I’
		  write_data('N');					//显示字符‘N’
		  write_data('S');					//显示字符‘S’
		  write_data('H');					//显示字符‘H’
		  write_data('U');					//显示字符‘U’
		  write_data('I');					//显示字符‘I’
		  write_data(' ');				    //显示空字符
		  write_data(' ');				    //显示空字符
		  write_data(' ');				    //显示空字符
		  write_data(' ');					//显示空字符
		  write_data('L');					//显示字符‘L’
		  write_data(level_1);				//显示水位检测百位值
		  write_data(level_2);				//显示水位检测十位值
		  write_data(level_3);				//显示水位检测个位值
		  write_data(' ');					//显示空字符
		  write_data('V');					//显示字符‘V’
		  write_data(voltage_1);			//显示电压检测百位值
		  write_data(voltage_2);			//显示电压检测十位值
		  write_data(voltage_3);			//显示电压检测个位值
		  motor_1_en = 1;					//进水阀电动机驱动打开
		  motor_2_en = 0;					//排水阀电动机驱动关闭
		  motor_3_en = 0;					//洗衣机电动机驱动关闭
		  break;							//跳出分支判断

		case '2':	  						//浸泡	
		  write_data('J');					//显示字符‘J’
		  write_data('I');					//显示字符‘I’
		  write_data('N');					//显示字符‘N’
		  write_data('P');					//显示字符‘P’
		  write_data('A');					//显示字符‘A’
		  write_data('O');					//显示字符‘O’
		  write_data(' ');					//显示空字符
		  write_data(' ');					//显示空字符
		  write_data(' ');					//显示空字符
		  write_data(' ');					//显示空字符
		  write_data(' ');					//显示空字符
		  write_data('L');					//显示字符‘L’
		  write_data(level_1);				//显示水位检测百位值
		  write_data(level_2);				//显示水位检测十位值
		  write_data(level_3);				//显示水位检测个位值
		  write_data(' ');					//显示空字符
		  write_data('V');					//显示字符‘V’
		  write_data(voltage_1);			//显示电压检测百位值
		  write_data(voltage_2);			//显示电压检测十位值
		  write_data(voltage_3);			//显示电压检测个位值
		  motor_1_en = 0;					//进水阀电动机驱动关闭
  	  	  motor_2_en = 0;					//排水阀电动机驱动关闭
	  	  motor_3_en = 0;				    //洗衣机电动机驱动关闭
		  break;							//跳出分支判断

		case '3':	  						//洗涤
		  write_data('X');					//显示字符‘X’
		  write_data('I');					//显示字符‘I’
		  write_data('D');				    //显示字符‘D’
		  write_data('I');					//显示字符‘I’
		  write_data(' ');					//显示空字符
		  write_data(' ');					//显示空字符
		  write_data(' ');					//显示空字符
		  write_data(' ');					//显示空字符
		  write_data(' ');				    //显示空字符
		  write_data(' ');				    //显示空字符
		  write_data(' ');					//显示空字符
		  write_data('L');					//显示字符‘’
		  write_data(level_1);			    //显示水位检测百位值
		  write_data(level_2);				//显示水位检测十位值
		  write_data(level_3);				//显示水位检测个位值
		  write_data(' ');					//显示空字符
		  write_data('V');					//显示字符‘V’
		  write_data(voltage_1);			//显示电压检测百位值
		  write_data(voltage_2);			//显示电压检测十位值
		  write_data(voltage_3);			//显示电压检测个位值
		  motor_3_en = 1;					//洗衣机电动机驱动打开
		  motor_1_en = 0;					//进水阀电动机驱动关闭
		  motor_2_en = 0;					//排水阀电动机驱动关闭
		  break;							//跳出分支判断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值