基于的51单片机全自动洗衣机设计.docx
《基于的51单片机全自动洗衣机设计.docx》由会员分享,可在线阅读,更多相关《基于的51单片机全自动洗衣机设计.docx(18页珍藏版)》请在冰豆网上搜索。
基于的51单片机全自动洗衣机设计
全自动洗衣机课程设计
基于51单片机,C语言实现。
基本要求
模拟全自动洗衣机工作过程。
以电机替代洗衣机电机。
显示洗衣机工作的状态(进水、浸泡、洗衣、脱水、结束)。
显示工作剩余时间(洗衣程序可自定义,时间精度:
秒)。
洗衣时交替正、反转。
扩展要求
洗衣和脱水时电机转速不同。
增加水位传感器输入。
故障报警。
增加声音提示。
其它自定义功能。
设计用Preteus仿真:
仿真图如下:
C文件函数代码:
#include
//****************************//
#defineucharunsignedchar
#defineuintunsignedint
//*******************************//
//***************************//
sbitmo_r=P3^2;//电机右控制线
sbitmo_l=P3^3;//电机左控制线
//****************************//
sbitkey_menu=P3^4;//菜单按键
sbitkey_on=P3^5;//开始按键
sbitkey_off=P3^6;//结束按键
sbitkey_se=P3^7;//菜单选择按键
//***************************//
sbitled_in=P0^0;//进水指示灯
sbitled_xi=P0^1;//洗衣指示灯
sbitled_pao=P0^2;//泡洗指示灯
sbitled_xx=P0^3;//脱水指示灯
sbitled_out=P0^4;//出水指示灯
sbitled_over=P0^5;//洗衣结束指示灯
sbitled_work=P0^6;//电机工作指示灯
sbitled_wring=P0^7;//报警指示灯
sbitother=P3^1;//脱水电源控制开关
sbitanther=P3^0;//洗衣电源控制开关
//******************************//
ucharcodenum[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//
//*****************************//
charsec=0;//时间秒
charmin=0;//时间分
ucharcount=0;//中断计数
ucharflag0=0;//洗衣机工作状态标志
ucharflag1=0;//进水次数标志
ucharflag2=0;//出水次数标志
ucharflag3=0;//泡洗次数标志
ucharerr=0;//报警标志
ucharquan=0;//正反转计数
//**********************************//
//函数声明
//*************************************//
voiddelay();//延时函数
voidin();//进水子程序
voidout();//出水子程序
voidover();//结束子程序
voidxi();//洗衣子程序
voidpao();//泡衣子程序
voidxx();//脱水子程序
voidon();//工作on处理子程序
voidse();//显示菜单选择
voidSEG_display();//显示时间子程序
voidkey_scan();//按键扫描子程序
//*****************************//
//延时函数
//****************************//
voiddelay(uinti)
{
uintx,y;
for(x=i;x>0;x--)
for(y=120;y>0;y--);
}
//******************************//
//工作on处理子程序
//********************************//
voidon()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
P0=0xff;
if(flag0==0)
in();
if(flag0==1)
xi();
if(flag0==2)
pao();
if(flag0==3)
xx();
if(flag0==4)
out();
}
//*******************************//
//结束子程序
//*********************************//
voidover()
{other=0;
anther=0;
P0=0xff;
mo_r=0;
mo_l=0;
led_over=0;
EA=0;
}
//*********************************//
//进水子程序
//*********************************//
voidin()
{anther=0;
other=0;
P0=0xff;
led_in=0;
flag1++;
mo_r=0;
mo_l=0;
min=0;
sec=8;
}
//*********************************//
//洗衣子程序
//*********************************//
voidxi()
{anther=1;
other=0;
P0=0xff;
led_work=0;
led_xi=0;
mo_r=1;
mo_l=0;
min=1;
sec=36;
quan=0;
}
//*********************************//
//泡衣子程序
//*********************************//
voidpao()
{
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;
}
//*********************************//
//脱水子程序
//*********************************//
voidxx()
{other=1;
anther=0;
P0=0xff;
led_xx=0;
mo_r=0;
mo_l=1;
min=0;
sec=50;
}
//*********************************//
//出水子程序
//*********************************//
voidout()
{anther=0;
other=0;
P0=0xff;
led_out=0;
flag2++;
mo_r=0;
mo_l=0;
min=0;
sec=5;
}
//*********************************//
//显示菜单选择
//*********************************//
voidse()
{
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_out=0;
}
}
//********************************//
//菜单处理子程序
//**********************************//
voidmenu()
{
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();
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);
flag0++;
se();
}
}
}
}
//*********************************//
//按键扫描子程序
//*********************************//
voidkey_scan()
{
if(key_menu==0)
{
delay(5);
if(key_menu==0)
{
while(!
key_menu);
menu();
}
}
//********************************//
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();
}
}
}
//*******************************//
//显示子程序
//*********************************//
voidSEG_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);
}
//*********************************//
//主函数
//*********************************//
voidmain()
{
led_in=0;
anther=0;
other=0;
while
(1)
{
SEG_display();
key_scan();
}
}
//**********************************//
//定时器0中断处理程序
//**********************************//
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
sec--;
if((flag0==1)||(flag0==2))
{
quan++;
switch(quan)
{
case1:
mo_r=1;mo_l=0;break;
case10:
mo_r=0;mo_l=0;break;
case15:
mo_r=0;mo_l=1;break;
case25:
mo_r=0;mo_l=0;break;
default:
;
}
if(quan==30)
{
quan=0;
}
}
//**********************************//
if((sec==0)&&(min!
=0))
{
min--;
sec=59;
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==0))//进水结束
{
switch(flag1)
{
case1:
flag0=1;xi();break;
case2:
flag0=2;pao();break;
case3:
flag0=2;pao();break;
case4:
flag0=2;pao();break;
default:
err=1;led_wring=0;
}
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==1))//洗衣结束
{
flag0=4;
out();
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==2))//泡衣结束
{
switch(flag3)
{
case1:
flag0=4;out();break;
case2:
flag0=4;out();break;
case3:
flag0=4;out();break;
default:
err=1;led_wring=0;
}
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==4))//出水结束
{
switch(flag2)
{
case1:
flag0=0;in();break;
case2:
flag0=0;in();break;
case3:
flag0=0;in();break;
case4:
flag0=3;xx();break;
default:
err=1;led_wring=0;
}
}
//***********************************//
if((sec<0)&&(min==0)&&(flag0==3))
{sec=0;
over();
}
}
}