51單片機洗衣機控制板及C語言程序,該控制板單片機采用AT89C51單片機,所設計全自動洗衣機功能有:標準洗衣、經濟洗衣、單獨洗衣以及排水四種洗衣等四種方式,有強洗、弱洗及運行/暫停、顯示及報警功能,程序利用利用Protues仿真軟件觀察洗衣機的運行狀態和過程。整個設計能達到預想的設計效果。
#include ‘reg51.h’
#define uchar unsigned char
#define uint unsigned int
#define Enable(); EA=1;
#define Disable(); EA=0;
#define BIAOZHUN 0
#define JINGJI 1
#define DANDU 2
#define PAISHUI 3
#define QIANGXI 0
#define RUOXI 1
#define T_JinShui 240 //4min*60s
#define T_PaiShui 60 //1min*60s
#define T_XiDi 360 //6min*60s
#define T_PiaoXi_1 240 //4min*60s
#define T_PiaoXi_2 120 //2min*60s
#define T_TuoShui 120 //2min*60s
#define ZHENGZHUAN 0
#define STOP 1
#define FANZHUAN 2
#define ZhengZhuan(); PIN_Motor_A = 0; PIN_Motor_B = 1;
#define Stop(); PIN_Motor_A = 1; PIN_Motor_B = 1;
#define FanZhuan(); PIN_Motor_A = 1; PIN_Motor_B = 0;
#define ZanTing(); ET0 = 0; ET1 = 0; Stop();
#define JiXu(); ET0 = 1; ET1 = 1;
#define flag_Ok (flag_JinShui||flag_PaiShui||flag_XiDi||flag_PiaoXi||flag_TuoShui)
sbit LED_BiaoZhun = P1^0; //標準程序顯示燈
sbit LED_JingJi = P1^1; //經濟程序顯示燈
sbit LED_DanDu = P1^2; //單獨程序顯示燈
sbit LED_PaiShui = P1^3; //排水程序顯示燈
sbit LED_QiangXi = P1^4; //強洗狀態燈
sbit LED_RuoXi = P1^5; //弱洗狀態燈
sbit LED_XiDi = P1^6; //洗滌狀態燈
sbit LED_PiaoXi = P1^7; //漂洗狀態燈
sbit LED_TuoShui = P2^0; //脫水狀態燈
sbit PIN_BaoJing = P2^1; //報警喇叭
sbit PIN_JinShui = P2^2; //進水控制
sbit PIN_PaiShui = P2^3; //排誰控制
sbit PIN_Motor_A = P2^4; //電機腳A
sbit PIN_Motor_B = P2^5; //電機腳B
sbit K_SEL_ChengXu = P3^0; //選擇程序鍵
sbit K_SEL_QiangRuo = P3^1; //選擇強弱鍵
sbit p32 = P3^2; //
sbit p33 = P3^3; //
sbit SW_ShuiWei = P3^6; //水位開關
sbit SW_AnQuan = P3^7; //安全開關
void Programme_PaiShui(void);
uchar flag_SEL_ChengXu; //默認為標準程序,
bit flag_SEl_QiangRuo; //默認為強洗,1為弱洗
bit flag_Run; //運行標志,1為運行
bit flag_JinShui; //進水標志,1為進水
bit flag_PaiShui; //排水標志,1為排水
bit flag_XiDi; //置洗滌標志
bit flag_PiaoXi; //置漂洗標志
bit flag_TuoShui; //脫水標志
bit flag_BaoJing; //報警標志
uchar _50ms; //每50ms加一次的變量
uint s; //秒
uint T_S; //定時總時間
uchar T_Motor; //電機控制時間
void Delay_10ms(uint T1)
{ uint t1,t2;
for(t1=0;t1
for(t2=0;t2《1250;t2++);//10ms
}
void Pin_Init(void)
{ LED_BiaoZhun = 0; //默認為標準程序,燈亮
LED_JingJi = 1; //經濟程序顯示燈,滅
LED_DanDu = 1; //單獨程序顯示燈,滅
LED_PaiShui = 1; //排水程序顯示燈,滅
LED_QiangXi = 0; //默認為強洗狀態,燈亮
LED_RuoXi = 1; //弱洗狀態燈,滅
LED_XiDi = 1; //洗滌狀態燈,運行后燈亮
LED_PiaoXi = 1; //漂洗狀態燈,運行后燈亮
LED_TuoShui = 1; //脫水狀態燈,運行后燈亮
PIN_BaoJing = 1; //報警喇叭,不叫
PIN_JinShui = 1; //進水控制,關
PIN_PaiShui = 1; //排誰控制,關
PIN_Motor_A = 1; //電機腳A,不走
PIN_Motor_B = 1; //電機腳B,不走
}
void ExInt_Init(void)
{ IT0 = 1;
EX0 = 1;
IT1 = 1;
EX1 = 1;
}
void Timer0_Init(void) //其中沒ET0是為以后控制暫停用的
{ TMOD = TMOD | 0X01; //定時方式1
TH0 = 0X3C; //50ms
TL0 = 0XB0;
TR0 = 1;
_50ms = 0;
s = 0;
}
void Timer1_Init(void) //其中沒ET1是為以后控制暫停用的
{ TMOD = TMOD | 0X10; //定時方式1
TH1 = 0X3C; //50ms
TL1 = 0XB0;
}
void T_Motor_Ctl(uchar t1,uchar t2,uchar t3)
{ if(!flag_SEl_QiangRuo)//強洗
T_Motor = t1;
if(flag_SEl_QiangRuo)//弱洗
T_Motor = t2;
if(flag_TuoShui) //脫水
T_Motor = t3;
}
void Motor_Init(void)
{ ZhengZhuan();
T_Motor_Ctl(4,3,5);
}
void No_BaoJing(void)
{ flag_BaoJing= 0; //置報警標志
PIN_BaoJing = 1; //報警喇叭
TR1 = 0;
//而進水、排水已沒時間限制了
}
void int0(void) interrupt 0
{
if(!p32)
{ Delay_10ms(1); //延時10ms左右,去抖動
if(!p32)
{ if(!flag_Run)
flag_Run = 1; //置運行標志
else if(flag_BaoJing)
No_BaoJing(); //解除報警
else if(flag_Ok)
{ static bit flag_ZanTing;
flag_ZanTing = ~flag_ZanTing;
if(flag_ZanTing)
{ZanTing();}//必須加{}
else
{JiXu();} //必須加{}
}//end else
}//end if(!p32) 2
}//end if(!p32) 1
}
void BaoJing(void)
{ flag_BaoJing= 1; //置報警標志
TR0 = 0;
TR1 = 1;
}
void Ok_Timer(void)
{ s = 0;
if(flag_JinShui || flag_PaiShui) //進水中~、排水中~
{ BaoJing(); //報警程序
}//end if(flag_JinShui || flag_PaiShui)
else
{ flag_XiDi = 0; //清洗滌標志
flag_PiaoXi = 0; //清漂洗標志
flag_TuoShui= 0; //清脫水標志
Stop();
}//end else
}
void Motor(void)
{ static uchar s_Motor;
s_Motor++;
if(s_Motor==T_Motor)
{ static uchar Motors;
s_Motor = 0;
Motors++;
if(Motors==3)
Motors = 0;
switch(Motors)
{ case ZHENGZHUAN : ZhengZhuan();
T_Motor_Ctl(4,3,5);
break;
case STOP : Stop();
T_Motor_Ctl(1,2,2);
break;
case FANZHUAN : FanZhuan();
T_Motor_Ctl(4,3,5);
break;
default : break;
}//end switch
}//end if
}
void Timer0(void) interrupt 1
{
TR0 = 0; //停止計數
TH0 = 0X3C; //重裝定時器值
TL0 = 0XB0;
TR0 = 1;
_50ms++;
if(_50ms == 20) //1s到
{ _50ms = 0;
s++;
if(s == T_S) //定時到
Ok_Timer();
if(flag_XiDi || flag_PiaoXi || flag_TuoShui)
Motor(); //電機控制程序
}//end if(_50ms == 20)
}//end Timer0()
void int1(void) interrupt 2
{ if(!p33)
{ Delay_10ms(1); //延時10ms左右,去抖動
if(!p33)
{
}//end if(!p33) 2
}//end if(!p33) 1
}
void Timer1(void) interrupt 3
{ static uchar _50ms; //每50ms加一次的變量
TR1 = 0; //停止計數
TH1 = 0X3C; //重裝定時器值
TL1 = 0XB0;
TR1 = 1;
_50ms++;
if(_50ms == 14) //0.7s到
{ _50ms = 0;
if(flag_XiDi) //洗滌中~
LED_XiDi = ~LED_XiDi; //洗滌狀態燈閃爍
if(flag_PiaoXi) //漂洗中~
LED_PiaoXi = ~LED_PiaoXi; //漂洗狀態燈閃爍
if(flag_TuoShui) //脫水中~
LED_TuoShui = ~LED_TuoShui; //脫水狀態燈閃爍
if(flag_BaoJing)
PIN_BaoJing = ~PIN_BaoJing; //報警
}//end if(_50ms == 14)
}
void SEL_ChengXU(void)
{ if(!K_SEL_ChengXu) //程序選擇鍵
{ Delay_10ms(1); //延時10ms左右,去抖動
if(!K_SEL_ChengXu)
{ while(!K_SEL_ChengXu);
flag_SEL_ChengXu++;
if(flag_SEL_ChengXu==4)
flag_SEL_ChengXu = 0;
switch(flag_SEL_ChengXu)
{ case BIAOZHUN : LED_BiaoZhun= 0; //亮
LED_JingJi = 1; //滅
LED_DanDu = 1; //滅
LED_PaiShui = 1; //滅
break;
case JINGJI : LED_BiaoZhun= 1;
LED_JingJi = 0;
LED_DanDu = 1;
LED_PaiShui = 1;
break;
case DANDU : LED_BiaoZhun= 1;
LED_JingJi = 1;
LED_DanDu = 0;
LED_PaiShui = 1;
break;
case PAISHUI : LED_BiaoZhun= 1;
LED_JingJi = 1;
LED_DanDu = 1;
LED_PaiShui = 0;
break;
default : break;
}//end switch
}//end if(!K_Sel_ChengXu) 2
}//end if(!K_Sel_ChengXu) 1
}//END
void SEL_QiangRuo(void)
{ if(!K_SEL_QiangRuo) //強弱選擇鍵
{ Delay_10ms(1); //延時10ms左右,去抖動
if(!K_SEL_QiangRuo)
{ while(!K_SEL_QiangRuo);
flag_SEl_QiangRuo = ~flag_SEl_QiangRuo;
if(!flag_SEl_QiangRuo)
{ LED_QiangXi = 0; //強洗狀態,燈亮
LED_RuoXi = 1; //弱洗狀態燈,滅
}//end if(!flag_SEl_QiangRuo)
else
{ LED_QiangXi = 1; //強洗狀態,燈亮
LED_RuoXi = 0; //弱洗狀態燈,滅
}//end else
}//end if(!K_SEL_QiangRuo) 2
}//end if(!K_SEL_QiangRuo) 1
}
void JinShui(void)
{ PIN_JinShui = 0;
flag_JinShui = 1;
TR1 = 0;
Timer0_Init();
T_S = T_JinShui;
while(SW_ShuiWei);
PIN_JinShui = 1;
flag_JinShui = 0;
TR0 = 0;
TF0 = 0;
}
void PaiShui(void)
{ PIN_PaiShui = 0;
flag_PaiShui = 1;
TR1 = 0;
Timer0_Init();
T_S = T_PaiShui;
while(!SW_ShuiWei);
TR0 = 0;
TF0 = 0;
Delay_10ms(500);//延時50s,經驗值5000
PIN_PaiShui = 1;
flag_PaiShui = 0;
}
void XiDi(void)
{ flag_XiDi = 1;
TR1 = 1;
Timer0_Init();
T_S = T_XiDi;
Motor_Init();
while(flag_XiDi);
TR1 = 0;
LED_XiDi = 1;
}
void PiaoXi(uchar t)
{ flag_PiaoXi = 1;
TR1 = 1;
Timer0_Init();
T_S = t;
Motor_Init();
while(flag_PiaoXi);
}
void BaoHu_GaiKai(void)
{ if(SW_AnQuan) //蓋開
{ ZanTing();
LED_TuoShui = 0;
}//end if
else
{ JiXu(); //電機不用管,最多5s不轉
}//end else
}
void TuoShui(void)
{ flag_TuoShui = 1;
PIN_PaiShui = 0;
TR1 = 1;
Timer0_Init();
T_S = T_TuoShui;
Motor_Init();
while(flag_TuoShui)
{ BaoHu_GaiKai();
}//end while
TR1 = 0;
LED_TuoShui = 1; //而出水閥一直開著
}
void Programme_BiaoZhun(void)
{ LED_XiDi = 0; //洗滌狀態燈
LED_PiaoXi = 0; //漂洗狀態燈
LED_TuoShui = 0; //脫水狀態燈
JinShui();
XiDi();
PaiShui();
JinShui();
PiaoXi(T_PiaoXi_1);//4min*60s//4*60
PaiShui();
JinShui();
PiaoXi(T_PiaoXi_2);//2min*60s//2*60
Programme_PaiShui();
}
void Programme_JingJi(void)
{ TR1 = 0;
LED_XiDi = 0; //洗滌狀態燈
LED_PiaoXi = 0; //漂洗狀態燈
LED_TuoShui = 0; //脫水狀態燈
JinShui();
XiDi();
PaiShui();
JinShui();
PiaoXi(T_PiaoXi_1);//4min*60s
Programme_PaiShui();
}
void Programme_DanDu(void)
{ LED_XiDi = 0; //洗滌狀態燈
LED_PiaoXi = 1; //漂洗狀態燈
LED_TuoShui = 1; //脫水狀態燈
JinShui();
XiDi();
}
void Programme_PaiShui(void)
{ LED_XiDi = 1; //洗滌狀態燈
LED_PiaoXi = 1; //漂洗狀態燈
LED_TuoShui = 0; //脫水狀態燈
PaiShui();
TuoShui();
}
void main()
{
Pin_Init(); //管腳初始化
ExInt_Init(); //外中斷初始化
Timer1_Init();
ET0 = 1;
ET1 = 1;
Enable(); //開總中斷
while(1)
{ if(!flag_Run) //運行前按鍵才有效
{ SEL_ChengXU(); //程序選擇程序
SEL_QiangRuo(); //強弱選擇程序
}//end if(!flag_Run)
if(flag_Run)//用else不,按啟動鍵后,有時沒反映????//
{ PIN_PaiShui = 1; //關排水閥
switch(flag_SEL_ChengXu)
{ case BIAOZHUN : Programme_BiaoZhun(); //標準洗衣程序
break;
case JINGJI : Programme_JingJi(); //經濟洗衣程序
break;
case DANDU : Programme_DanDu(); //單獨洗衣程序
break;
case PAISHUI : Programme_PaiShui(); //排水洗衣程序
break;
default : break;
}//end switch
}//end esle
flag_Run = 0;
}//end while
}
評論
查看更多