找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2835|回复: 7
打印 上一主题 下一主题
收起左侧

洗衣机控制程序

[复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:74868 发表于 2018-8-2 16:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;                                                        //跳出分支判断

                 case '4':                                                          //漂洗
                  write_data('P');                                        //显示字符‘P’
                  write_data('I');                                        //显示字符‘I’
                  write_data('A');                                        //显示字符‘A’
                  write_data('O');                                        //显示字符‘O’
                  write_data('X');                                        //显示字符‘X’
                  write_data('I');                                        //显示字符‘I’
                  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_3_en = 1;                                        //洗衣机电动机驱动打开
                  motor_1_en = 0;                                        //进水阀电动机驱动关闭
                  motor_2_en = 0;                                    //排水阀电动机驱动关闭
                  break;                                                        //跳出分支判断

                case '5':                                                          //脱水
                  write_data('T');                                        //显示字符‘T’
                  write_data('U');                                        //显示字符‘U’
                  write_data('O');                                        //显示字符‘O’
                  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 = 0;                                        //进水阀电动机驱动关闭
                  motor_2_en = 1;                                        //排水阀电动机驱动打开
                  motor_3_en = 0;                                        //洗衣机电动机驱动关闭
                  break;                                                        //跳出分支判断
                }
                if(st_pau==2)                                                //当前洗衣机运行全局变量为2
                {
              write_data(' ');                                //显示空字符
                          write_data(' ');                                //显示空字符
                          write_data(' ');                                //显示空字符
                          write_data(' ');                                //显示空字符
                          write_data(' ');                                //显示空字符
                          write_data(' ');                                //显示空字符
                          write_data(' ');                            //显示空字符
                          write_data('P');                                //显示字符‘P’
                          write_data('A');                                //显示字符‘A’
                          write_data('U');                                //显示字符‘U’
                          write_data('S');                                //显示字符‘S’
                          write_data('E');                            //显示字符‘E’
                }
                else                                                               
                {                                
                        switch(method)                                        //判断方式全局变量
                        {
                            case '1':                                         //方式一
                                  write_data('M');                        //显示字符‘M’
                                  write_data('E');                        //显示字符‘E’
                                  write_data('T');                        //显示字符‘T’
                                  write_data('H');                        //显示字符‘H’
                                  write_data('O');                        //显示字符‘O’
                                  write_data('D');                        //显示字符‘D’
                                  write_data(':');                        //显示字符‘:’
                                  write_data('1');                        //显示字符‘1’
                                  write_data(' ');                        //显示空字符
                                  break;                                        //跳出分支判断
                            case '2':                                         //方式二
                                  write_data('M');                        //显示字符‘M’
                                  write_data('E');                        //显示字符‘E’
                                  write_data('T');                        //显示字符‘T’
                                  write_data('H');                        //显示字符‘H’
                                  write_data('O');                        //显示字符‘O’
                                  write_data('D');                        //显示字符‘D’
                                  write_data(':');                        //显示字符‘:’
                                  write_data('2');                        //显示字符‘2’
                                  write_data(' ');                        //显示空字符
                                  break;                                        //跳出分支判断
                            case '3':                                         //方式三
                                  write_data('M');                        //显示字符‘M’
                                  write_data('E');                        //显示字符‘E’
                                  write_data('T');                        //显示字符‘T’
                                  write_data('H');                        //显示字符‘H’
                                  write_data('O');                        //显示字符‘O’
                                  write_data('D');                        //显示字符‘D’
                                  write_data(':');                        //显示字符‘:’
                                  write_data('3');                        //显示字符‘3’
                                  write_data(' ');                        //显示空字符
                                  break;                                        //跳出分支判断
                            case '4':                                         //方式四
                                  write_data('M');                        //显示字符‘M’
                                  write_data('E');                        //显示字符‘E’
                                  write_data('T');                        //显示字符‘T’
                                  write_data('H');                        //显示字符‘H’
                                  write_data('O');                        //显示字符‘O’
                                  write_data('D');                        //显示字符‘D’
                                  write_data(':');                        //显示字符‘:’
                                  write_data('4');                    //显示字符‘4’
                                  write_data(' ');                        //显示空字符
                                  break;                                        //跳出分支判断
                          }
                          switch(speed)                                        //判断速度全局变量
                          {
                            case '1':                                         //速度一
                                  write_data('S');                        //显示字符‘S’
                                  write_data('P');                        //显示字符‘P’
                                  write_data('E');                        //显示字符‘E’
                                  write_data('E');                        //显示字符‘E’
                                  write_data('D');                        //显示字符‘D’
                                  write_data(':');                        //显示字符‘:’
                                  write_data('1');                        //显示字符‘1’
                                  break;                                        //跳出分支判断
                            case '2':                                         //速度二
                                  write_data('S');                        //显示字符‘S’
                                  write_data('P');                        //显示字符‘P’
                                  write_data('E');                        //显示字符‘E’
                                  write_data('E');                        //显示字符‘E’
                                  write_data('D');                        //显示字符‘D’
                                  write_data(':');                        //显示字符‘:’
                                  write_data('2');                    //显示字符‘2’
                                  break;                                        //跳出分支判断
                            case '3':                                         //速度三
                                  write_data('S');                        //显示字符‘S’
                                  write_data('P');                        //显示字符‘P’
                                  write_data('E');                        //显示字符‘E’
                                  write_data('E');                        //显示字符‘E’
                                  write_data('D');                        //显示字符‘D’
                                  write_data(':');                        //显示字符‘:’
                                  write_data('3');                    //显示字符‘3’
                                  break;                                        //跳出分支判断
                            case '4':                                         //速度四
                                  write_data('S');                    //显示字符‘S’
                                  write_data('P');                    //显示字符‘P’
                                  write_data('E');                        //显示字符‘E’
                                  write_data('E');                        //显示字符‘E’
                                  write_data('D');                        //显示字符‘D’
                                  write_data(':');                        //显示字符‘:’
                                  write_data('4');                        //显示字符‘4’
                                  break;                                        //跳出分支判断
                                }                          
                   }
        }
        else
        {
                  write_data('N');                                        //显示字符‘N’
                  write_data('O');                                        //显示字符‘O’
                  write_data('W');                                        //显示字符‘W’
                  write_data(' ');                                        //显示空字符
                  write_data('M');                                        //显示字符‘M’
                  write_data('A');                                        //显示字符‘A’
                  write_data('C');                                        //显示字符‘C’
                  write_data('H');                                        //显示字符‘H’
                  write_data('I');                                        //显示字符‘I’
                  write_data('N');                                        //显示字符‘N’
                  write_data('E');                                        //显示字符‘E’
                  write_data(' ');                                        //显示空字符
                  write_data('I');                                    //显示字符‘I’
                  write_data('S');                                        //显示字符‘S’
                  write_data(' ');                                        //显示空字符
                  write_data('O');                                        //显示字符‘O’
                  write_data('F');                                        //显示字符‘F’
                  write_data('F');                                        //显示字符‘F’
                  write_data(' ');                                        //显示空字符
                  write_data(' ');                                           //显示空字符
        }
  //P0 = 0XFF;
}

/****************************LCD初始化*****************************/                                                         
void init_LCM()                                                
{
        write_com(0x30);                                //发送控制命令0x30
        write_com(0x30);                                //发送控制命令0x30
        write_com(0x30);                                //发送控制命令0x30,做一个延时
        write_com(0x38);                                //发送控制命令0x38
        write_com(0x08);                                //发送控制命令0x08
        write_com(0x01);                                //发送控制命令0x01
        write_com(0x06);                                //发送控制命令0x06
        write_com(0x0e);                                //发送控制命令0x0e
}

/***************************LCD写数据函数**************************/
void write_data(char date)
{
        RS=1;                                                        //写指令电平置为高,进入写数据状态
        R_W=0;                                                        //读指令电平置为低,无效
        EN=1;                                                        //使能信号开
        P0=date;                                                //将数据送入p0口
        EN=0;                                                        //使能信号关
        check_BF();                                                //等待LCD繁忙状态结束
}

/***************************LCD写指令函数**************************/
void write_com(char command)               
{               

        RS=0;                                                        //写指令电平置为低,进入写指令状态
        R_W=0;                                                        //读写指令命令置为低电平
        EN=1;                                                        //使能信号开
        P0=command;                                                //将数据送入p0口
        EN=0;                                                        //使能信号关
        check_BF();                                                //等待LCD繁忙状态结束
}                                                                                         

/**************************LCD检查忙碌函数*************************/
void check_BF()
{
        char i,x=0x80;                                        //定义字符变量i,x                                       
        P0=0xff;                                                //P0口输出高电平,使得P0口电平输入允许
        while(x&0x80)                                        //当LCD还是处于繁忙状态时,进入循环
        {                                                               
          RS=0;                                                        //写指令置为1,读取指令状态
          R_W=1;                                                //读引脚电平置为高,为读取信息状态
          EN=1;                                                        //LCD使能信号开
          P0=0XFF;                                                //P0口输出高电平,使得P0口电平输入允许
          x=P0;                                                        //将P0口电平信息赋给x
          EN=0;                                                        //LCD使能信号关闭
          for (i=0;i<10;i++);                        //循环等待
        }
        EN=0;                                                        //关闭使能信号
}

/****************************LCD清屏函数***************************/
void clearLCD()
{
  write_com(0x01);                                        //写入LCD清屏指令
}

/******************************方式一******************************/                                                         
void fangshi1()
{
        switch(step)                                        //判断洗衣机当前运行步骤
        {
                case 0:                                                //步骤0
                        process = '1';                        //进水
                        break;                                        //跳出分支判断
                case 1:                                                //步骤1
                        process = '2';                        //浸泡
                        break;                                        //跳出分支判断
                case 2:                                                //步骤2
                        process = '3';                        //洗涤
                        break;                                        //跳出分支判断
                case 3:                                                //步骤3
                        process = '5';                        //脱水
                        break;                                        //跳出分支判断
                case 4:                                                //步骤4
                        process = '1';                        //进水
                        break;                                        //跳出分支判断
                case 5:                                                //步骤5
                        process = '4';                        //漂洗
                        break;                                        //跳出分支判断
                case 6:                                                //步骤6
                        process = '5';                        //脱水
                        break;                                        //跳出分支判断
                case 7:                                                //步骤7
                        process = '1';                        //进水
                        break;                                        //跳出分支判断
                case 8:                                                //步骤8
                        process = '4';                        //漂洗
                        break;                                        //跳出分支判断
                case 9:                                                //步骤9
                        process = '5';                        //脱水
                        break;                                        //跳出分支判断
                case 10:                                        //步骤10
                        clrpara();                                //复位所有参数
                        break;                                        //跳出分支判断
        }
}

/******************************方式二******************************/                                                         
void fangshi2()
{
        switch(step)                                        //判断洗衣机当前运行步骤
        {
                case 0:                                                //步骤0
                        process = '1';                        //进水
                        break;                                          //跳出分支判断
                case 1:                                                //步骤1
                        process = '3';                        //洗涤
                        break;                                        //跳出分支判断
                case 2:                                                //步骤2
                        process = '5';                        //脱水
                        break;                                        //跳出分支判断
                case 3:                                                //步骤3
                        process = '1';                        //进水
                        break;                                        //跳出分支判断
                case 4:                                                //步骤4
                        process = '4';                        //漂洗
                        break;                                        //跳出分支判断
                case 5:                                            //步骤5
                        process = '5';                        //脱水
                        break;                                        //跳出分支判断
                case 6:                                                //步骤6
                        process = '1';                        //进水
                        break;                                        //跳出分支判断
                case 7:                                                //步骤7
                        process = '4';                        //漂洗
                        break;                                        //跳出分支判断
                case 8:                                                //步骤8
                        process = '5';                        //脱水
                        break;                                        //跳出分支判断
                case 9:                                                //步骤9
                        clrpara();                                //复位所有参数
                        break;                                        //跳出分支判断

        }
}

/******************************方式三******************************/                                                         
void fangshi3()
{
        switch(step)                                        //判断洗衣机当前运行步骤
        {
                case 0:                                                //步骤0
                        process = '1';                        //进水
                        break;                                        //跳出分支判断
                case 1:                                                //步骤1
                        process = '3';                        //洗涤
                        break;                                        //跳出分支判断
                case 2:                                                //步骤2
                        process = '5';                        //脱水
                        break;                                        //跳出分支判断
                case 3:                                                //步骤3
                        process = '1';                        //进水
                        break;                                        //跳出分支判断
                case 4:                                                //步骤4
                        process = '4';                        //漂洗
                        break;                                        //跳出分支判断
                case 5:                                                //步骤5
                        process = '5';                        //脱水
                        break;                                        //跳出分支判断
                case 6:                                                //步骤6
                        clrpara();                                //复位所有参数
                        break;                                        //跳出分支判断
        }
}

/******************************方式四******************************/                                                         
void fangshi4()
{
        switch(step)                                        //判断洗衣机当前运行步骤
        {
                case 0:                                                //步骤0
                        process = '5';                        //脱水
                        break;                                        //跳出分支判断
                case 1:                                                //步骤1
                        clrpara();                                //复位所有参数
                        break;                                        //跳出分支判断
        }
}

/*******************************复位*******************************/                                                         
void clrpara()
{
        EX0=0;                                         
        TR0=0;
        st_pau=2;                                                //洗衣机是否运行全局变量为2
        step=0;                                                        //洗衣机运行步骤全局变量为0
        //P2=0xff;                                                //P0输出0xff信息
        state=0;                                                //洗衣机运行状态设置为OFF状态
        process='1';                                        //洗衣机过程全局变量为1
        method='1';                                                //洗衣机方式全局变量为1
        speed='1';                                                //电动机速度全局变量为1
        ad_level=0;                                                //水位AD监测值为0
        ad_voltage=0;                                        //电压AD检测值为0
        motor_1_en = 0;                                        //进水阀驱动机关闭
          motor_2_en = 0;                                        //排水阀驱动机关闭
        motor_3_en = 0;                                        //洗衣机电动机关闭
        TR1=0;
        flag=1;                                                        //标志位为1,开始播放音乐
        //TR1=1;                                                        //启动定时器0
        init_LCM();                                                //LCD初始化程序
        display();                                                //LCD刷新显示
        //speaker_on();                                        //音乐播放程序
}

/***************************音乐播放程序***************************/
void speaker_on()
{
        uchar i,j;                                                //定义变量i,j
    i=0;                                        //变量i赋值为0
        while(f_TAB[i][0]!=0xff)//判断
        {
                Ch=f_TAB[i][1];                //TH0赋值
                Cl=f_TAB[i][0];                //TL0赋值
                TH1=Ch;                                //TH0赋值
                TL1=Cl;                                //TL0赋值
                TR1=1;
                for(j=0;j<time_TAB[i];j++)                          //控制节拍数
                delay();                                                          //延时 1 个节拍单位
                TR1=0;                                                                  //关闭定时器 T0
                i++;                                                                  //播放下一个音符  
        }

}
/****************************主程序入口****************************/                                                         
void main()
{

        //中断0按键
        IT0 = 1;                                                //中断方式为下降沿
        EX0 = 1;                                                //开启外部中断

        //定时器0、1,定时器0、1中断,用于状态改变计数,pwm调制计数
        TMOD = 0x11;                                        //定时器为定时中断模式1
        TH0 = TIME0H;                                        //定时器0计数高位加载
        TL0 = TIME0L;                                        //定时器0计数低位加载
        TH1 = TIME1H;                                        //定时器1计数高位加载
        TL1 = TIME1L;                                        //定时器1计数低位加载
        ET0 = 1;                                                //定时器0中断允许
        ET1 = 1;                                                //定时器1中断允许
        TR0 = 1;                                                //定时器0计数器启动
        TR1 = 1;                                                //定时器1计数器启动
        P2 = 0xff;                                                //P0输出0xff信息
        state = 0;                                                //洗衣机运行状态设置为OFF状态
        process = '1';                                        //洗衣机过程全局变量为‘1’
        method = '1';                                        //洗衣机方式全局变量为‘1’
        speed = '1';                                        //电动机速度全局变量为‘1’
        st_pau = '0';                                        //洗衣机是否运行全局变量为‘0’
        step = 0 ;                                          //洗衣机运行步骤全局变量为‘0’
        MOTOR_ON = 25;                                        //电动机PWM控制计数为25
        ad_level = 0;                                        //水位AD监测值为0
        ad_voltage = 0;                                        //电压AD检车值为0
        time_count = 0;                                        //定时0中断计数器全局变量为0
        time_count1 = 0;                                //定时1中断计数器全局变量为0
        flag=0;                                                        //标志位为0
        speaker = 0;                                        //蜂鸣器关闭
        init_LCM();                                                //初始化LCD
        display();                                                //刷新显示
        EA = 1;                                                        //开启单片机中断允许位,允许中断开始
        P0 = 0xff;                                                //P0输出高电平,使得可以进行外部电压信号输入

        while(1)                                
        {
                //测试水位
                while(flag==0)
                {
                        con = 0;                                        //AD转换输出关闭
                        add_A = 0;                                        //选择水位模拟信号进行AD转换
                        START = 1;                                        //设置START引脚为高电平
                        START = 0;                                        //设置START引脚为低电平,得到下降沿,启动AD检测

                        while(!EOC);                                //等待AD转换结束
                        lock_OE = 0;                                //74ls373锁存信号为低,通道开启
                        P0 = 0xff;                                        //P0引脚输出高电平,允许引脚电平的读入
                        con = 1;                                        //AD转换芯片输出使能
                        ad_level = P0;                                //将AD转换赋值为AD_LEVEL全局变量
                        con = 0;                                        //AD转换芯片输出禁止
                        lock_OE = 1;                                //74ls373锁存信号开启,进行电平锁存
                        add_A = 1;                                        //选择AD模块为1号通道信号进行模数转换,即电压信号
                        START = 1;                                        //START引脚输出高电平
                        START = 0;                                        //START引脚输出低电平,开始AD转换
                        while(!EOC);                                //等待AD转换结束
                        lock_OE = 0;                                //74ls373锁存信号关闭,AD转换信号可以输出
                        P0 = 0xff;                                        //P0输出高电平,使得外部电压可以进行输入
                        con = 1;                                        //AD转换结果使能
                        ad_voltage = P0;                        //将P0引脚的AD转换结果赋值给电压检测全局变量
                        con = 0;                                        //AD转化结果输出关闭
                        lock_OE = 1;                                //74ls373锁存信号开启,使得P0口与AD转换引脚隔离
                }
                if(flag==1)
                {
                        speaker_on();
                        flag=0;
                }

        }

}

/**************************外部中断0子程序*************************/                                                         
void int_0() interrupt 0
{
        uint temp;                                                //定义变量temp,用来读取P2信息
        temp = P2;                                                //temp读取P2信息
        translate(temp&0x0f);                        //与0x0f相与,得到低四位电平信号,并传入translate()函数        
        display();                                                //LCD显示刷新
}

/***************************定时0中断入口**************************/                                                         
void time_0() interrupt 1
{
        time_count1 ++;                                        //全局定时中断计数自加1
        if (time_count1 > 6)                        //如果全局定时中断次数大于6,则
        {
          time_count1 = 0;                                //全局定时中断次数置零
        }
        //只考虑正转
        if(st_pau==1)                                        //如果洗衣机处于运行状态,则
        {
                MOTOR_NOW++;                                //PWM计数次数自加1
                if (MOTOR_NOW > MOTOR_ON)   //如果PWM计数次数大于高电平计数值
                {
                  motor_high = 0;                        //PWM高电平引脚输出低电平
                 }
                else
                {
                  motor_high = 1;                        //PWM高电平输出高电压
                }
                if (MOTOR_NOW >  MOTOR_COUNT) //如果PWM计数值大于PWM计数周期
                {
                  MOTOR_NOW = 0;                        //PWM计数值置零
                }
                motor_low = 0;                                //PWM低电平输出低电平
        }
        TH0=TIME0H;                                                //定时器0高位计数载入
        TL0=TIME0L;                                                //定时器低位计数载入

}

/***************************定时1中断入口**************************/                                                         
void vTimer0() interrupt 3
{
        if(flag==0)
        {
                TR1=0;
                if(st_pau==1)
                {
                        time_count++;
                        if(time_count> 5)
                        {
                                time_count=0;
                                step++;
                                display();
                        }
                }
                switch(method)
                {
                        case '1':                                 //方式一
                                fangshi1();
                                break;                        
                        case '2':                                 //方式二
                                fangshi2();
                                break;
                        case '3':                                 //方式三
                                fangshi3();
                                break;        
                        case '4': //方式四
                                fangshi4();        
                                break;
                }                                                                                                
                TH1=TIME1H;
                TL1=TIME1L;
                TR1=1;
        }
        else
        {
                        speaker=~speaker;                                                  //取反
                        TH1=Ch;                                                         //TH1赋值
                        TL1=Cl;                                                         //TL1赋值
        }

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:206314 发表于 2018-9-3 12:04 | 只看该作者
学习一下
回复

使用道具 举报

板凳
ID:92076 发表于 2018-11-15 22:32 | 只看该作者
学习一下
回复

使用道具 举报

地板
ID:562940 发表于 2019-6-15 10:05 | 只看该作者
可以可以。。
回复

使用道具 举报

5#
ID:24479 发表于 2021-5-24 09:52 | 只看该作者
很有参考价值!
回复

使用道具 举报

6#
ID:58106 发表于 2021-5-24 17:00 | 只看该作者
就这?有需要量产的可以@我
回复

使用道具 举报

7#
ID:928284 发表于 2021-5-27 18:00 | 只看该作者
很强大,我们就是做洗衣机的,希望通过学习,能看懂。
回复

使用道具 举报

8#
ID:832425 发表于 2021-5-28 11:41 | 只看该作者
这样也行?学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表