单片机/MCU论坛
直播中

陈静

11年用户 33经验值
私信 关注
[问答]

全自动洗衣机程序失常





     小生于去年3月份开始利用业余时间自学单片机技术,5月份搞了一份全自动洗衣机控制板,   程序在protens上模拟运行正常,实际成品中每天使用至今半年多,总的来说还可以, 只 是偶尔有时出现了当跑到了脱水的时候排水阀打开了,水排干了,而电机却还处在正反转的洗衣状态。因此还洗烂过老婆大人的心爱的小灰灰,被罚做家务一星期。 小生技术有限,搞不明是何故,  恳请前辈们,师傅们帮忙分析一下,不怜赐教是什么原因引起的。电路与程序如下,由于偏幅问题,程序只上到了标准洗部份,后面的手洗,强洗等基本与标准洗差不多,只是增加与减少洗的时间。小生第一次发贴,请多多指教。
PCB_Project3.pdf (341.87 KB)
(下载次数: 112, 2013-3-5 12:20 上传)












#include
#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;
***it k=P3^7;//按键。
***it zheng=P0^0;//主电机正转
***it fan=P0^1;//主电机反转
***it pai=P0^2;//排水阀
***it jin=P0^3;//进水阀
***it guan=P0^4;//总电源开关动作。
***it jink=P0^5;//水位开关
***it mk=P3^2;//门开关
***it led1=P3^6;//洗指示
***it led2=P3^5;//漂指示
***it led3=P3^4;//脱水指示
***it 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)

zhihuizhou

2013-3-5 13:56:51
耐心等待  不要着急 哈哈
举报

老吴

2013-3-5 17:53:09
没细看程序,感觉这类程序不要用外部中断。
举报

陈静

2013-3-6 08:34:44
引用: wufa1986 发表于 2013-3-5 17:53
没细看程序,感觉这类程序不要用外部中断。

我这里的外部中断是用于脱水时的盖门保护,防止伤到人。谢谢您的指点。
举报

xinxin305392193

2013-3-9 16:19:59
很不错,自己写这么多啊?学习下
举报

960321985

2013-3-13 13:40:36
学习了
举报

老虎发威

2013-3-14 09:01:47
{:1:}
举报

汤志锋

2013-3-14 11:44:59
我现在也正在学习当中,目前还帮不了你,不过你家洗衣机的单片机都是自己开发的,还是不错的,值得学习。
举报

pizili1981

2013-3-14 14:47:44
程序没看出什么问题来。建议把洗衣完成后的电源开关动作(guan=on; delay(500); guan=off; )前加上或者换成初始化init()。
有一个问题就是洗涤和脱水应该有离合器的控制,以控制电机带动洗涤轴或脱水轴转动,这里没有看到在哪里实现。难道是P1控制的?但是P1在洗衣过程中一直没有变化。
举报

pizili1981

2013-3-14 15:01:34
刚下载电路图看了,P1是显示输出到数码管。。。
举报

pizili1981

2013-3-14 15:28:28
楼主有没有注意你的洗衣机洗衣时外筒一起转吗?或者脱水时外筒不转?
我怀疑PCB图中的电源弹跳开关是否就是控制离合器的。
举报

zhangjiang

2013-3-15 10:30:46
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

陈静

2013-3-16 22:11:28
引用: pizili1981 发表于 2013-3-14 15:28
楼主有没有注意你的洗衣机洗衣时外筒一起转吗?或者脱水时外筒不转?
我怀疑PCB图中的电源弹跳开关是否就是 ...

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

更多回帖

发帖
×
20
完善资料,
赚取积分