#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秒):洗涤