100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > T047基于51单片机全自动智能洗衣机烘干脱水浸泡proteus仿真原理图PCB

T047基于51单片机全自动智能洗衣机烘干脱水浸泡proteus仿真原理图PCB

时间:2019-05-21 14:04:04

相关推荐

T047基于51单片机全自动智能洗衣机烘干脱水浸泡proteus仿真原理图PCB

功能:

0.本项目采用STC89C52作为单片机系统的控制MCU

1.系统支持速洗、标准洗、浸泡洗、脱水和烘干五种模式

2.按下开关键显示“FF”,此时按下启动键可进入水位设置,再次按下开关键,回到“FF”,按下模式按键选择工作模式,然后点击启动开始工作

3.数码管可显示当前剩余时间,时间每减1,对应真实时间5s

4.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:

PCB :

主程序:

#include "reg52.h" //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include "tlc0832.h"unsigned char waterLevel;// 水位,保存sbit RELAY_IN = P2^1;// 进水阀控制端口sbit RELAY_OUT = P2^2;// 排水阀控制端口sbit RELAY_HEAT = P2^0;// 烘干sbit MOTOR_A = P1^3;// 电机控制sbit MOTOR_B = P1^4;// 电机控制sbit LED1 = P1^7; // 速洗指示灯sbit LED2 = P1^6; // 标准洗指示灯sbit LED3 = P1^5; // 浸泡洗指示灯sbit LED4 = P3^2; // 脱水指示灯sbit LED5 = P3^3; // 烘干指示灯sbit SEG_S1 = P2^6;// 数码管显示第一位公共端sbit SEG_S2 = P2^7;// 数码管第二位显示控制公共端sbit KEY_SWITCH = P3^4; // 洗衣机电源开关sbit KEY_MODE = P3^5; // 洗衣机模式选择sbit KEY_START = P3^6; // 启动按键sbit BUZZER = P2^3; // 洗涤完报警unsigned int time50ms, time1s_1, time5s, timeFlag, time1s; // 用于全局时钟定义bit forwardFlag; // 电机,正反转标志位unsigned char time[] = {20, 40, 80, 5, 20}; // 五个模式显示时间unsigned char dis_seg[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00}; // 共阴数码管码表/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x01;TL0 = 0x00;//设置定时初始值TH0 = 0x4C;//设置定时初始值 50msEA = 1; // 总中断打开ET0 = 1; // 定时器中断打开// TR0=1; //定时器开关打开}void delay(unsigned int t){while (t--);}void WaterLevel_Ctrl(){switch (waterLevel){case 1:if (0xbe < ReadADC(AIN0_GND)) // 10*25 =250{TR0 = 1;RELAY_IN = 1;}else{TR0 = 0;RELAY_IN = 0;RELAY_OUT = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;}break;case 2:if (0x9e < ReadADC(AIN0_GND)) // 10*25 =250{TR0 = 1;RELAY_IN = 1;}else{TR0 = 0;RELAY_IN = 0;RELAY_OUT = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;}break;case 3:if (0x91 < ReadADC(AIN0_GND)) // 10*25 =250{TR0 = 1;RELAY_IN = 1;}else{TR0 = 0;RELAY_IN = 0;RELAY_OUT = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;}break;case 4:if (0x8a < ReadADC(AIN0_GND)) // 10*25 =250{TR0 = 1;RELAY_IN = 1;}else{TR0 = 0;RELAY_IN = 0;RELAY_OUT = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;}break;case 5:if (0x81 < ReadADC(AIN0_GND)) // 10*25 =250{TR0 = 1;RELAY_IN = 1;}else{TR0 = 0;RELAY_IN = 0;RELAY_OUT = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;}break;case 6:if (0x6e < ReadADC(AIN0_GND)) // 10*25 =250{TR0 = 1;RELAY_IN = 1;}else{TR0 = 0;RELAY_IN = 0;RELAY_OUT = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;}break;case 7:if (0x61 < ReadADC(AIN0_GND)) // 10*25 =250{TR0 = 1;RELAY_IN = 1;}else{TR0 = 0;RELAY_IN = 0;RELAY_OUT = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;}break;case 8:if (0x55 < ReadADC(AIN0_GND)) // 10*25 =250{TR0 = 1;RELAY_IN = 1;}else{TR0 = 0;RELAY_IN = 0;RELAY_OUT = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;}break;case 9:if (0x44 < ReadADC(AIN0_GND)) // 10*25 =250{TR0 = 1;RELAY_IN = 1;}else{TR0 = 0;RELAY_IN = 0;RELAY_OUT = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;}break;case 10:if (0x34 < ReadADC(AIN0_GND)) // 10*25 =250{TR0 = 1;RELAY_IN = 1;}else{TR0 = 0;RELAY_IN = 0;RELAY_OUT = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;}break;}// if(waterLevel*25<ReadADC(AIN0_GND))// 10*25 =250// {TR0=1;k1=1;}else{TR0=0;k1=0;RELAY_OUT=MOTOR_A=MOTOR_B=RELAY_HEAT=1;forwardFlag=0;}// SendByte(ReadADC(AIN0_GND));}void Stop_Ctrl(){// SendByte(ReadADC(AIN0_GND));if (ReadADC(AIN0_GND) < 0xe0){TR0 = 1;}elseTR0 = 0;}/*------------------------------------------------主程序------------------------------------------------*/// void InitUART (void)//{////SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收//TMOD |= 0x20;// TMOD: timer 1, mode 2, 8-bit 重装//TH1 = 0xF3;// TH1: 重装值 9600 波特率 晶振 11.0592MHz//TR1 = 1; // TR1: timer 1 打开//EA = 1; //打开总中断////ES = 1; //打开串口中断// }// void SendByte(unsigned char dat)//{// SBUF = dat;// while(!TI);// TI = 0;//// }void main(){unsigned int modeFlag, dig_2, dig_1; // modeFlag用于计算模式unsigned int sd = 0;// 蜂鸣器循环次数报警KEY_SWITCH = KEY_MODE = KEY_START = 1;// 案件给高电平Init_Timer0();// 定时器初始化// InitUART ();dig_2 = dig_1 = 15;while (1){// SendByte(ReadADC(AIN0_GND));if (KEY_SWITCH == 0){delay(20000); // 按键延时去抖dig_2 = dig_1 = 15;while (KEY_SWITCH == 0); // 等待按键释放while (1){stop: // 跳转介质为if (KEY_MODE == 0){delay(20000);while (KEY_MODE == 0);modeFlag++; // 每次进入模式选择+if (modeFlag == 6){modeFlag = 1;} // 当循环到6重新,跳动到第一个switch (modeFlag) // 判断进入点亮相应,LED{case 1:LED1 = 0;LED2 = LED3 = LED4 = LED5 = 1;break; // 点亮之后直接退出case 2:LED2 = 0;LED1 = LED3 = LED4 = LED5 = 1;break;case 3:LED3 = 0;LED2 = LED1 = LED4 = LED5 = 1;break;case 4:LED4 = 0;LED2 = LED3 = LED1 = LED5 = 1;break;case 5:LED5 = 0;LED2 = LED3 = LED4 = LED1 = 1;break;}dig_2 = time[modeFlag - 1] / 10; // 显示时间转换 25/10;dig_1 = time[modeFlag - 1] % 10; // 显示时间转换 25%10;// if(modeFlag==5){modeFlag=0;}}if (KEY_START == 0) // 判断,是否启动按键按下{delay(20000); // 延时去抖switch (modeFlag) // 判断为哪一个模式,并,把时间给定时器{// 如果都不是,则为零case 1: //速洗time5s = 20;timeFlag = 0;break;case 2: //标准洗time5s = 40;timeFlag = 0;break;case 3: //浸泡洗time5s = 80;timeFlag = 0;break;case 4: //脱水time5s = 5;timeFlag = 0;break;case 5: //烘干time5s = 20;timeFlag = 0;break;}if (time5s == 0) // 判断如果启动时时间为零,则进入设置水位模式{while (1) // 死循环,一直在设置水位{if (KEY_START == 0) // 帮,启动按键再次按下时水加{delay(20000); // 简单延时去抖waterLevel++; // ,变量加if (waterLevel == 11)waterLevel = 1; // 最高水位设置为10当再次达到11位变为1while (KEY_START == 0); // 等待按键释放}SEG_S1 = 0;SEG_S2 = 1; // 打开第一个数码管P0 = dis_seg[waterLevel / 10]; // 进行数据处理并打印delay(10); // 进行延时稳定P0 = 0x00; // 萧影SEG_S1 = 1;SEG_S2 = 0;P0 = dis_seg[waterLevel % 10];delay(10);P0 = 0x00;if (KEY_SWITCH == 0){delay(20000);while (KEY_SWITCH == 0);goto stop;} // 如果当开关按下时跳转到前面,开机状态}}while (KEY_START == 0); // 判断案件释放TR0 = 1; // 打开定时器进行计数while (1) // 死循环,用于判断整个流程完成{SEG_S1 = 0;SEG_S2 = 1; // 数码管显示用于打印定时器时间P0 = dis_seg[time5s / 10];delay(10);P0 = 0x00;SEG_S1 = 1;SEG_S2 = 0;P0 = dis_seg[time5s % 10];delay(10);P0 = 0x00;switch (modeFlag) // 判断模式{case 1: //速洗switch (timeFlag){case 0:WaterLevel_Ctrl();break;case 1:RELAY_IN = RELAY_OUT = RELAY_HEAT = 1;forwardFlag = 1;break;case 7:RELAY_OUT = 0;RELAY_IN = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;Stop_Ctrl();break;case 8:MOTOR_A = 0;RELAY_IN = RELAY_OUT = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;break;case 9:WaterLevel_Ctrl();break;case 10:RELAY_IN = RELAY_OUT = RELAY_HEAT = 1;forwardFlag = 1;break;case 14:RELAY_OUT = 0;RELAY_IN = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;Stop_Ctrl();break;case 15:MOTOR_A = 0;RELAY_IN = RELAY_OUT = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;break;}break;case 2: //标准洗switch (timeFlag){case 0:WaterLevel_Ctrl();break;case 1:RELAY_IN = RELAY_OUT = RELAY_HEAT = 1;forwardFlag = 1;break;case 15:RELAY_OUT = 0;RELAY_IN = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;Stop_Ctrl();break;case 16:MOTOR_A = 0;RELAY_IN = RELAY_OUT = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;break;case 17:WaterLevel_Ctrl();break;case 18:RELAY_IN = RELAY_OUT = RELAY_HEAT = 1;forwardFlag = 1;break;case 30:RELAY_OUT = 0;RELAY_IN = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;Stop_Ctrl();break;case 31:MOTOR_A = 0;RELAY_IN = RELAY_OUT = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;break;}break;case 3: //浸泡洗switch (timeFlag){case 0:WaterLevel_Ctrl();break;case 1:RELAY_IN = RELAY_OUT = RELAY_HEAT = MOTOR_A = MOTOR_B = 1;break;case 40:RELAY_IN = RELAY_OUT = RELAY_HEAT = 1;forwardFlag = 1;break;case 55:RELAY_OUT = 0;RELAY_IN = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;Stop_Ctrl();break;case 56:MOTOR_A = 0;RELAY_IN = RELAY_OUT = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;break;case 57:WaterLevel_Ctrl();break;case 58:RELAY_IN = RELAY_OUT = RELAY_HEAT = 1;forwardFlag = 1;break;case 70:RELAY_OUT = 0;RELAY_IN = MOTOR_A = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;Stop_Ctrl();break;case 71:MOTOR_A = 0;RELAY_IN = RELAY_OUT = MOTOR_B = RELAY_HEAT = 1;forwardFlag = 0;break;}break;

仿真演示视频:

/video/BV1pP411u7Mz/

实物演示视频:

/video/BV1AR4y1Z7ty/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。