小生于去年3月份开始利用业余时间自学
单片机技术,5月份搞了一份全自动洗衣机控制板, 程序在protens上模拟运行正常,实际成品中每天使用至今半年多,总的来说还可以, 只 是偶尔有时出现了当跑到了脱水的时候排水阀打开了,水排干了,而电机却还处在正反转的洗衣状态。
因此还洗烂过老婆大人的心爱的小灰灰,被罚做家务一星期。 小生技术有限,搞不明是何故, 恳请前辈们,师傅们帮忙分析一下,不怜赐教是什么原因引起的。
电路与程序如下,由于偏幅问题,程序只上到了标准洗部份,后面的手洗,强洗等基本与标准洗差不多,只是增加与减少洗的时间。小生第一次发贴,请多多指教。
PCB_Project3.pdf
(341.87 KB, 下载次数: 101)
#include <AT89X52.H>
#define on 0
#define off 1
#define uint unsigned int
#define uchar unsigned char
uchar code sm[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x89,0x86,0xab};
uchar a,c,i,ii,iii;
uint b;
sbit k=P3^7;//按键。
sbit zheng=P0^0;//主电机正转
sbit fan=P0^1;//主电机反转
sbit pai=P0^2;//排水阀
sbit jin=P0^3;//进水阀
sbit guan=P0^4;//总
电源开关动作。
sbit jink=P0^5;//水位开关
sbit mk=P3^2;//门开关
sbit led1=P3^6;//洗指示
sbit led2=P3^5;//漂指示
sbit led3=P3^4;//脱水指示
sbit bb=P3^3;//蜂鸣器
void delay (uint t)
{
uint x,y;
for(x=t;x>0;x--)
for(y=119;y>0;y--);
}
void init ();
void shi_yi();
void to_shui();
void key();
void cs_7();
void cs_6();
void cs_5();
void cs_4();
void cs_3();
void cs_2();
void cs_1();
void cs_0();
void main ()
{
init();
while(1)
{
key();
P1=sm[a];
if(a==8)
{
TR0=0;
led1=led2=led3=0;
}
if(a==7)//标准洗
cs_7();
if(a==6)//浸泡洗
cs_6();
if(a==5)//强力,手洗
cs_5();
if(a==4)//快洗
cs_4();
if(a==3)//单洗,留水
cs_3();
if(a==2)//洗衣,漂衣,留水
cs_2();
if(a==1)//过水脱
cs_1();
if(a==0)//不过水脱
cs_0();
}
}
void init ()
{
TMOD=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
//EX0=1;
IT0=0;
a=8;
b=0;
c=0;
led1=0;
led2=0;
led3=0;
zheng=off;
fan=off;
pai=off;
jin=off;
guan=off;
bb=0;
P1=sm[a];
}
void shi_yi()//洗衣
{
zheng=on;
delay(3000);
zheng=off;
delay(2000);
fan=on;
delay(3000);
fan=off;
delay(2000);
}
void to_shui()//脱水
{
EX0=1;
P1=sm[a];
pai=on;
delay(30000);
for(i=10;i>0;i--)
{
P1=sm[a];
pai=on;
zheng=on;
delay(8000);
zheng=off;
delay(2000);
}
for(i=8;i>0;i--)
{
P1=sm[a];
pai=on;
zheng=on;
delay(3000);
zheng=off;
delay(1000);
}
for(i=2;i>0;i--)
{
P1=sm[a];
pai=on;
zheng=on;
delay(8000);
zheng=off;
delay(2000);
}
pai=on;
zheng=on;
delay(60000);
P1=sm[a];
zheng=off;
for(i=3;i>0;i--)
delay(40000);
P1=sm[a];
pai=off;
delay(20000);
P1=sm[a];
EX0=0;
}
void key()
{
if(k!=1)
{
delay(10); //去抖延时
if(k!=1)
{
while(k!=1);//松手检测
delay(10);//松手去抖
a--;
b=0;
if(a==-1)
a=8;
}
}
}
void e_
time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
b++;
if(b==200)
c=1;
if(b==30000)//防无水与不排水保护延时
c=3;
if(c==3)
{
while(1)
{
P1=sm[9];
jin=1;
pai=1;
}
}
}
void exter0()interrupt 0//外部中断
{
zheng=off;
pai=off;
P1=sm[11];
}
void cs_7()
{
TR0=0;
TR0=1;//开启定时
if(c==1)//5秒后
{
if(ii==0)
{
jin=on;//开进水阀 准备执行洗衣
TR0=1;//开保护计时
while(jink!=0)
jin=on;
if(jink==0)//如果水位动作
{
TR0=0;//关保护计时
jin=off;//关进水阀
for(i=150;i>0;i--)//执行300次洗程序
shi_yi();
for(i=2;i>0;i--)//脱水前调整平衡
{
zheng=on;
delay(1000);
zheng=off;
delay(500);
fan=on;
delay(1000);
fan=off;
delay(500);
}
pai=on;//打开排水阀
TR0=1;//开启保护计时
while(jink!=1)
pai=on;
if(jink==1)//当水排完
{
TR0=0;//关保护计时
delay(30000);
to_shui();//执行脱水程序
ii++;
}
}
}
if(ii==1)
{
jin=on;//开进水阀 准备执行洗衣
TR0=1;//开保护计时
led1=1;
while(jink!=0)
jin=on;
if(jink==0)//如果水位动作
{
TR0=0;//关保护计时
jin=off;//关进水阀
for(i=50;i>0;i--)//执行五次洗程序
shi_yi();
for(i=2;i>0;i--)//脱水前调整平衡
{
zheng=on;
delay(1000);
zheng=off;
delay(500);
fan=on;
delay(1000);
fan=off;
delay(500);
}
pai=on;//打开排水阀
TR0=1;//开保护计时
while(jink!=1)
pai=on;
if(jink==1)//当水排完
{
TR0=0;//关保护计时
delay(30000);
to_shui();//执行脱水程序
ii++;
}
}
}
if(ii==2)
{
jin=on;//开进水阀 准备执行洗衣
TR0=1;//开保护计时
led2=1;
while(jink!=0)
jin=on;
if(jink==0)//如果水位动作
{
TR0=0;//关保护计时
jin=off;//关进水阀
for(i=20;i>0;i--)
shi_yi();
for(i=2;i>0;i--)//脱水前调整平衡
{
zheng=on;
delay(1000);
zheng=off;
delay(500);
fan=on;
delay(1000);
fan=off;
delay(500);
}
pai=on;//打开排水阀
TR0=1;//开保护计时
while(jink!=1)
pai=on;
if(jink==1)//当水排完
{
TR0=0;//关保护计时
delay(30000);
to_shui();//执行脱水程序
a=10;
led3=1;
guan=on;
delay(500);
guan=off;
}
}
}
}
}
电源弹跳开关是控制电源开关的,没错,这种开关是的原理当有220V的电时会从开的状态跳到关的状态,也就切断电源了,另外离合器是受排水牵引器控制的,洗的时候没排水牵引器没工作当然也就锁住了外筒的转动,到脱水的时候排水牵引器是一直工作的,它拉开的离合器外筒也就自然咬住了转轴跟着一起转了,谢谢交流。
一周热门 更多>