|
本帖最后由 51黑mcu 于 2016-6-3 19:56 编辑
51单片机制作的全自动洗衣机全部资料。
单片机全自动洗衣机仿真图
单片机全自动洗衣机程序:
- #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赋值
- }
-
- }
复制代码
全部资料下载:
全自动洗衣机.rar
(71.56 KB, 下载次数: 226)
|
评分
-
查看全部评分
|