全自动洗衣机程序失常

2019-07-16 02:17发布





     小生于去年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;                                                       
                                }
                                               
                        }
                }
       
               
        }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
jackytangzf
1楼-- · 2019-07-17 02:06
我现在也正在学习当中,目前还帮不了你,不过你家洗衣机的单片机都是自己开发的,还是不错的,值得学习。
pizili1981
2楼-- · 2019-07-17 06:25
 精彩回答 2  元偷偷看……
pizili1981
3楼-- · 2019-07-17 12:10
刚下载电路图看了,P1是显示输出到数码管。。。
pizili1981
4楼-- · 2019-07-17 16:06
楼主有没有注意你的洗衣机洗衣时外筒一起转吗?或者脱水时外筒不转?
我怀疑PCB图中的电源弹跳开关是否就是控制离合器的。
张江湖
5楼-- · 2019-07-17 21:57
值得学习。
1541033002
6楼-- · 2019-07-17 23:12
pizili1981 发表于 2013-3-14 15:28
楼主有没有注意你的洗衣机洗衣时外筒一起转吗?或者脱水时外筒不转?
我怀疑PCB图中的电源弹跳开关是否就是 ...

电源弹跳开关是控制电源开关的,没错,这种开关是的原理当有220V的电时会从开的状态跳到关的状态,也就切断电源了,另外离合器是受排水牵引器控制的,洗的时候没排水牵引器没工作当然也就锁住了外筒的转动,到脱水的时候排水牵引器是一直工作的,它拉开的离合器外筒也就自然咬住了转轴跟着一起转了,谢谢交流。

一周热门 更多>