完整版 电路图和程序代码 下载地址
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; //跳出分支判断