找回密码
 注册
关于网站域名变更的通知
查看: 115|回复: 2
打印 上一主题 下一主题

C51单片机全自动洗衣机 Proteus仿真及源程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-6-21 09:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
一个用51单片机做的全自动洗衣机的Proteus仿真,带源程序,下面是原理图:" t7 n0 k& f) z* a
  I8 t" @3 C( D8 O2 V9 {6 v/ d
源程序:/ h; @1 M5 _! }* G2 b' E
  • #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[0]!=0xff)//判断
  •         {
  •                 Ch=f_TAB[1];                //TH0赋值
  •                 Cl=f_TAB[0];                //TL0赋值
  •                 TH1=Ch;                                //TH0赋值
  •                 TL1=Cl;                                //TL0赋值
  •                 TR1=1;
  •                 for(j=0;j<time_TAB;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赋值
  •         }
  • }
    8 q/ b7 O0 P& O: @* A
6 x8 q0 |6 C$ {- Y2 ~

2 I& {3 e! F3 V: n( B# {% U
- I7 d, [3 {. e& e# m( J& ?

该用户从未签到

2#
发表于 2022-6-21 10:03 | 只看该作者
大佬  有没有流程图啊。) e9 j6 i5 ]5 B6 A4 o

% a( d- ?$ a5 B. g5 B  t/ R* Y应该先说原理,否则比较难看懂。

该用户从未签到

3#
发表于 2022-6-21 14:09 | 只看该作者
操作顺序是啥啊 哪个大神知道么
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-29 20:15 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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