家用洗衣机控制板程序

2020-01-27 11:40发布

#include <REG52.h>
#define  uchar unsigned char//语法定义
#define  uint  unsigned int //

//引脚定义//
sbit        led                =        P1 ^ 0;//LED指示灯(蓝) __
sbit        beep        =        P2 ^ 6;//扬声器 __
sbit        j1                =        P2 ^ 3;//继电器1 ++
sbit        j2                =        P2 ^ 1;//继电器2 ++
sbit        r1                =        P3 ^ 7;//无线键盘1 ++
sbit        r2                =        P3 ^ 6;//无线键盘2 ++
sbit        r3                =        P3 ^ 5;//无线键盘3 ++
sbit        r4                =        P3 ^ 4;//无线键盘4 ++
sbit        rn                =        P3 ^ 2;//无线键盘N(中断) ++

//寄存器定义//
uchar        time=0,force=0,config=0;//定义时间、强度和设置变量
uchar        t0_con,t0_con1,t0_con2;//T0计时器内部累加
uchar        led_con;//用于LED指示的标记       
uchar        keys;//定义键盘输入值
/*****************************************************************************/
//延时程序//
void delay(uint a){//延时限制在1 < a < 65535 ms//
        unsigned char i;
        while( --a != 0){
                for(i = 0; i < 125; i++);
        }
}
/*****************************************************************************/
//LED指示灯驱动程序//
void led_on(void){//LED长亮,不工作时状态//
        led                =        0;
        led_con        =        0;       
}
void led_1s(void){//LED每秒闪烁,用于定时等待状态//
        led_con        =        1;       
}
void led_50ms(void){//LED每50ms闪烁,用于电机运行中//
        led_con        =        2;       
}
//void led_off(void){//LED关//
//        led                =        1;       
//}
/*****************************************************************************/
//扬声器驱动程序//
void beep_off(void){//beep不响,无键值//
        beep        =        1;       
}
void beep_on(void){//beep长响//
        beep        =        0;       
}
void beep_s1(void){//beep单响一声//
        beep_on();
        delay(250);
        beep_off();       
}
void beep_s2(void){//beep连响2声//
        beep_s1();
        delay(100);
        beep_s1();       
}
void beep_2s(void){//beep2秒长响,洗衣开始//
        beep_on();
        delay(1000);
        beep_off();                       
}
void beep_call(void){//beep长响8声,洗衣结束//
        uchar i;
        for(i = 0; i < 5; i++){
                beep_2s();
                delay(250);
        }                       
}
/*****************************************************************************/
//无线键值处理程序(扫描)//
void key_init(void){//键盘初始化程序//
        keys        =        0;
}
void key_rxd(void){//键盘处理程序//
        key_init();
        if(rn == 1){//查看是否有键被按下
                delay(10);//延时去干扰
                if(rn == 1){
                        if(r1 == 1 && r2 == r3 == r4 == 0){keys = 1;}//查找键值并放入寄存器
                        if(r2 == 1 && r1 == r3 == r4 == 0){keys = 2;}
                        if(r3 == 1 && r1 == r2 == r4 == 0){keys = 3;}
                        if(r4 == 1 && r1 == r2 == r3 == 0){keys = 4;}
                }
        }
        while(rn == 1){//按键是否松开
        }
}
/*****************************************************************************/
//断电器控制程序//
void jj_off(void){//继电器关,不工作//
        j1        =        0;
        j2        =        0;
        delay(800);
}
void j1_on(void){//继电器1开,正转//
        j1        =        1;
        j2        =        0;
}
void j2_on(void){//继电器2开,反转//
        j1        =        0;
        j2        =        1;
}
void jj_run(uchar i){//继电器关,不工作//
        uchar        a;
        j1_on();
        a        =        i;
        while(a > 0) {
                delay(800);//基数是1s
                a--;
        }
        jj_off();
        j2_on();
        a        =        i;
        while(a > 0) {
                delay(800);//基数是1s
                a--;
        }
        jj_off();               
}
/*****************************************************************************/
//时间发生程序(计数器中断T0)//
void t0_init (void) {//T0定时器初始化//
        TH0                =        0x3c;//载入初值 50ms(12MHZ)
        TL0                =        0xb0;
        TMOD        =        0x01;//定时计数器0工作方式1
        ET0                =        1;//开定时器中断
        TR0                =        1;//启动定时器
        EA                =        1;//开总中断
        t0_con        =        20;//1s
        t0_con1        =        0;
        t0_con2        =        0;//
}
void t0 (void) interrupt 1 using 1{//定时器中断处理程序//
        TH0                =        0x3c;//载入初值
        TL0                =        0xb0;
        t0_con--;//到50ms计数减1
        if(led_con == 2){//使用50ms闪烁的LED
                led        =        ~led;
        }
        if(t0_con <= 0){//到1s的处理
                t0_con        =        20;
                if(led_con == 1){//使用1s闪烁的LED
                        led        =        ~led;
                }
                t0_con1++;
                if(t0_con1 >= 60){//到1分钟的处理
                        t0_con1        =        0;
                        t0_con2++;//到1分钟计数加1
                }                                                       
        }                       
}
/*****************************************************************************/
//洗涤程序//
void washing (void){//洗涤程序
        led_50ms();//洗衣时的LED状态
        jj_run(force);//根据强度运行
        key_rxd();
        if(keys == 2){//运行时按B键复位
                uchar        b;
                b        =        t0_con2;//等待时将时间值寄存
                led_1s();//等待状态
                beep_s1();//响1声
                while(keys != 1){key_rxd();}//再按A继续
                t0_con2        =        b;//放回时间值
                beep_s1();//响1声
        }
        if(keys == 4){t0_con2 = 250;}//运行时按D键复位                       
}

void wait (uchar u){//3分钟的初洗和浸泡时间//
        beep_2s();//长响1声
        t0_init ();//计时器重新开始工作
        while(t0_con2 <= 3){//开始洗衣
                washing();//开始洗涤
        }
        t0_init ();//计时器重新开始工作
        while(t0_con2 <= u){//延时N分钟
                led_1s();//每秒闪一次,表示定时状态
        }
}

void wash (void){//正式洗衣程序//
        beep_s2();//长响1声
        t0_init ();//计时器重新开始工作
        while(time        >=        t0_con2){//开始洗衣
                washing();
        }
}               
/*****************************************************************************/
//开机初始化程序//
void init (void){
        jj_off();
        led_on();//LED长亮,等待键入
        beep_2s();//       
        key_init();       
}
/*****************************************************************************/
//主程序//
void main (void){
while(1){//大循环,当洗衣结束后重新开始//
        init ();//开机初始化
       
        while(keys == 0){key_rxd();}//设置强度//
        beep_s1();//响1声
        force        =        keys;
        key_init();
        while(keys == 0){key_rxd();}//设置时间//
        beep_s2();//响2声
        time        =        (keys*5);
        key_init();
        while(keys == 0){key_rxd();}//设置方式//
        beep_2s();//长响1声
        config        =        keys;
        key_init();       
       
        if(config == 1){//3分钟初洗+延时浸泡15分钟 (A键)
                wait (15);       
        }
        if(config == 2){//3分钟初洗+延时浸泡30分钟 (B键)
                wait (30);               
        }
        if(config == 3){//延时浸泡15分钟 (C键)
                t0_init ();//
                while(t0_con2        <=        15){//延时60分钟
                        led_1s();//每秒闪一次,表示定时状态
                }               
        }
        wash ();//开始洗涤       
        beep_call();//洗衣结束音
}             
}

/******************************************************************************
程序说明:
                        您好!                       

洗衣机使用说明--设置说明


冷启动或复位后顺序按三次键,其功能设置如下:


NO.1 强度设置
---------------------------------------------
        A:柔和
        B:低
        C:中
        D:高


NO.2 时间设置
---------------------------------------------
        A:5分钟
        B:10分钟
        C:15分钟
        D:20分钟


NO.3 方式设置
---------------------------------------------
        A:3分钟初洗-->15分钟浸泡-->洗涤-->结束
        B:3分钟初洗-->30分钟浸泡-->洗涤-->结束
        C:15分钟浸泡-->洗涤-->结束
        D:洗涤-->结束


=============================================

洗涤时的操作
---------------------------------------------
        长按 B 键:暂停洗涤
        长按 A 键:继续洗涤(暂停时有效)
        长按 D 键:结束并复位程序
       

提示音说明
---------------------------------------------
        短鸣1次:强度设置完成
        短鸣2次:时间设置完成
        长鸣1次:冷启动/方式设置完成/开始洗涤
        长鸣6次:洗涤结束


指示灯说明
---------------------------------------------
        长亮:冷启动/等待输入/洗涤结束
        慢闪(每秒):浸泡
        快闪(每1/4秒):洗涤



******************************************************************************/
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//////////////本程序由DoYoung.net所有,未经作者同意请勿篡改或转载//////////////
///////////////////////////////////////////////////////////////////////////////
//////////////http://doyoung.net///////////////////////2007/02/05//////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。