1、 全自动洗衣机课程设计 基于51单片机,C语言实现。 基本要求 模拟全自动洗衣机工作过程。以电机替代洗衣机电机。显示洗衣机工作的状态(进水、浸泡、洗衣、脱水、结束)。显示工作剩余时间(洗衣程序可自定义,时间精度:秒)。 洗衣时交替正、反转。 扩展要求 洗衣和脱水时电机转速不同。增加水位传感器输入。故障报警。增加声音提示。其它自定义功能。 设计用Preteus仿真: 仿真图如下:
2、
C文件函数代码:
#include
3、// //***************************// sbit mo_r = P3^2; //电机右控制线 sbit mo_l = P3^3; //电机左控制线 //****************************// sbit key_menu = P3^4; // 菜单按键 sbit key_on = P3^5; // 开始按键 sbit key_off = P3^6; // 结束按键 sbit key_se = P3^7; // 菜单选择按键 //***************************//
4、 sbit led_in = P0^0; // 进水指示灯 sbit led_xi = P0^1; // 洗衣指示灯 sbit led_pao = P0^2; // 泡洗指示灯 sbit led_xx = P0^3; // 脱水指示灯 sbit led_out = P0^4; // 出水指示灯 sbit led_over = P0^5; // 洗衣结束指示灯 sbit led_work = P0^6; // 电机工作指示灯 sbit led_wring = P0^7; // 报警指示灯 sbit other = P3^1; // 脱水电源
5、控制开关 sbit anther = P3^0; // 洗衣电源控制开关 //******************************// uchar code num[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // //*****************************// char sec = 0; // 时间秒 char min = 0; // 时间分 uchar count=0; // 中断计数 uchar flag0=0; /
6、/ 洗衣机工作状态标志 uchar flag1=0; // 进水次数标志 uchar flag2=0; // 出水次数标志 uchar flag3=0; // 泡洗次数标志 uchar err =0; // 报警标志 uchar quan = 0;//正反转计数 //**********************************// // 函数声明 //*************************************// void delay();// 延时函数 void in(); // 进水子程序 void o
7、ut(); // 出水子程序 void over(); // 结束子程序 void xi(); // 洗衣子程序 void pao(); // 泡衣子程序 void xx(); // 脱水子程序 void on(); // 工作on处理子程序 void se(); // 显示菜单选择 void SEG_display(); //显示时间子程序 void key_scan(); // 按键扫描子程序 //*****************************// // 延时函数 //***********************
8、// void delay(uint i) { uint x,y; for(x=i;x>0;x--) for(y=120;y>0;y--); } //******************************// // 工作on处理子程序 //********************************// void on() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; P0 = 0xff;
9、 if(flag0 == 0) in(); if(flag0 == 1) xi(); if(flag0 == 2) pao(); if(flag0 == 3) xx(); if(flag0 == 4) out(); } //*******************************// // 结束子程序 //*********************************// void over() { other=0; anther=0; P0 = 0xff; mo_r=
10、0; mo_l=0; led_over = 0; EA=0; } //*********************************// // 进水子程序 //*********************************// void in() { anther=0; other=0; P0 = 0xff; led_in = 0; flag1++; mo_r = 0; mo_l = 0; min = 0; sec = 8; } //*********************************// //
11、 洗衣子程序 //*********************************// void xi() { anther=1; other=0; P0 = 0xff; led_work = 0; led_xi = 0; mo_r = 1; mo_l = 0; min = 1; sec = 36; quan = 0; } //*********************************// // 泡衣子程序 //*********************************// void pao(
12、) { anther=1; other=0; P0 = 0xff; led_pao = 0; led_work = 0; flag3++; mo_r = 1; mo_l = 0; min = 1; sec = 35; quan = 0; } //*********************************// // 脱水子程序 //*********************************// void xx() { other=1; anther=0; P0 = 0xff; led_xx = 0;
13、 mo_r = 0; mo_l = 1; min = 0; sec = 50; } //*********************************// // 出水子程序 //*********************************// void out() { anther=0; other=0; P0 = 0xff; led_out = 0; flag2++; mo_r = 0; mo_l = 0; min = 0; sec = 5; } //*********************************
14、// // 显示菜单选择 //*********************************// void se() { P0 = 0xff; if(flag0 >= 5) flag0 = 0; if(flag0 == 0) { led_in = 0; } if(flag0 == 1) { led_xi=0; } if(flag0 == 2) { led_pao=0; } if(flag0 == 3) { led_xx=0; } if(flag0 == 4) { led_ou
15、t=0; } } //********************************// // 菜单处理子程序 //**********************************// void menu() { min = 0; sec = 0; mo_r=0; mo_l=0; SEG_display(); while(1) { if(key_on == 0) { delay(5); if(key_on == 0) { while(!key_on); on()
16、 break; } } //**************************// if(key_off == 0) { delay(5); if(key_off == 0) { while(!key_off); over(); break; } } //****************************// if(key_se == 0) { delay(5); if(key_se == 0) { while(!key_se);
17、 flag0++; se(); } } } } //*********************************// // 按键扫描子程序 //*********************************// void key_scan() { if(key_menu == 0) { delay(5); if(key_menu == 0) { while(!key_menu); menu(); } } //*****************************
18、// if(key_on == 0) { delay(5); if(key_on == 0) { while(!key_on); on(); } } //*********************************// if(key_off == 0) { delay(5); if(key_off == 0) { while(!key_off); over(); } } } //*******************************// // 显示子程序 //*
19、// void SEG_display() { P1=0x01; P2 = num[min/10]; delay(10); P1 = 0x02; P2 = num[min%10]; delay(10); P1 = 0x04; P2 = num[sec/10]; delay(10); P1 = 0x08; P2 = num[sec%10]; delay(10); } //*********************************// // 主函数 //*
20、// void main() { led_in=0; anther=0; other=0; while(1) { SEG_display(); key_scan(); } } //**********************************// // 定时器0中断处理程序 //**********************************// void timer0() interrupt 1 { TH0=(65536-50000)/256;
21、 TL0=(65536-50000)%256; count++; if(count==20) { count = 0; sec--; if((flag0==1)||(flag0==2)) { quan++; switch(quan) { case 1:mo_r=1;mo_l=0;break; case 10:mo_r=0;mo_l=0;break; case 15:mo_r=0;mo_l=1;break; case 25:mo_r=0;mo_l=0;break; d
22、efault:; } if(quan==30) { quan=0; } } //**********************************// if((sec == 0)&&(min != 0)) { min--; sec = 59; } //**********************************// if((sec<0)&&(min==0)&&(flag0==0)) //进水结束 { switch(flag1)
23、 { case 1:flag0=1;xi();break; case 2:flag0=2;pao();break; case 3:flag0=2;pao();break; case 4:flag0=2;pao();break; default: err=1;led_wring = 0; } } //**********************************// if((sec<0)&&(min==0)&&(flag0==1)) //洗衣结束 { flag0 = 4;
24、 out(); } //**********************************// if((sec<0)&&(min==0)&&(flag0==2)) //泡衣结束 { switch(flag3) { case 1:flag0=4;out();break; case 2:flag0=4;out();break; case 3:flag0=4;out();break; default: err=1;led_wring = 0; } } //***********
25、// if((sec<0)&&(min==0)&&(flag0==4)) //出水结束 { switch(flag2) { case 1:flag0=0;in();break; case 2:flag0=0;in();break; case 3:flag0=0;in();break; case 4:flag0=3;xx();break; default: err= 1;led_wring = 0; } } //***********************************// if((sec<0)&&(min==0)&&(flag0==3)) { sec = 0; over(); } } }






