(一)洗衣機故障檢修
我們有個老舊的全自動洗衣機,是廣東產的“愛德牌”。14年前因為出現無法排水故障,另外買了個金鈴洗衣機。當時看它各個部件和外觀都還挺好,想留待有空時再檢修,就沒有丟棄它。
最近想騰空雜物房,就考慮是否該丟棄這洗衣機了?考慮到擱置十多年,各個部件和馬達都應該銹蝕死了。但通電試機,沒想到它的馬達還能正常運轉。試運行它的“無水試機程序”,還能正常洗滌和進出水。灌水進去試,可以洗衣服,但排水只能排一半就停機了,也不能甩干。
拆開背蓋,看到主軸上有個離合器,通過皮帶和齒輪與馬達連接,但我完全看不明白它的工作原理。只好上網,查找該洗衣機的電路圖和相關維修資料,其中有關離合器的工作原理介紹如下:
-------------------==-----------------==
減速離合器洗滌工作過程:進入洗滌程序時,排水電磁鐵斷電,剎車桿在彈簧力的作用下,針剎車鎖定,使脫水軸不能轉動。同時剎車桿上一撥叉棘爪將棘輪撥過一個角度,方絲離合彈簧固定在棘輪壁上的這一端被撥動,另一端處于自由狀態,離合套與外套軸分離,由丁方絲離合彈簧被撥松,洗滌軸與脫水軸分離,當電動機轉動時,V帶傳動,從大帶輪傳過來的轉動通過齒輪軸傳至行星減速器,減速后由波輪軸傳出,帶動波輪旋轉。
洗滌時,電動機運轉,通過減速離合器,降低轉速帶動波輪間歇正反轉,進行洗滌,此時洗滌脫水桶不轉動;脫水時,電動機運轉,通過離合器,不減速(即高速)帶動脫水桶順時針方向運轉,進行脫水,此時波輪也隨著脫水桶一起運轉。
圖1)
---------------------------------------------------------==
上述信息我反復琢磨半天仍不得要領,只是粗略了解其大概工作原理。沒辦法,邊干邊體會吧!
為了便于檢修,我拆開洗衣機蓋板(控制主板、進水電磁閥、水位傳感器都固定在蓋板上)。由于外殼不好拆卸,我就把整個洗衣機翻轉過來。下圖2+圖3是離合器與排水電磁鐵(通過電磁鐵動作牽引排水閥)結構外觀—俯視圖和側視圖:
圖2)離合器 圖3)排水電磁鐵
我琢磨:我的洗衣機能夠正常洗滌,說明馬達及離合器沒太大問題。排水只能排一半,說明排水電磁閥也沒完全損壞,很可能是電磁鐵芯生銹導致行程受阻,離合桿和棘爪也沒能移動到位,以致影響馬達帶動不了脫水桶甩干。我試用起子撬動電磁鐵芯,強行讓離合桿和棘爪移動到位,并轉到皮帶輪,發現脫水桶是可以旋轉的,這說明離合器并沒有銹蝕,問題可能就是電磁鐵芯吸合不到位。
找點機油涂抹到電磁鐵芯和相關驅動機件上,多次運行脫水程序,給電磁鐵反復通電吸合再釋放。最后放水試機,洗滌和脫水都正常了。但又發生開機進水不停,似乎是水位傳感器有問題,導致單片機檢測不到有水信號,機器就不能開始洗滌程序。
愛德洗衣機的水位傳感器在市面上也沒有找到合適的替代品。從電路圖看不出水位傳感器的工作原理,我從網上找到資料有如下介紹:
-------------------------------=
圖4為該水位傳感器的結構示意圖,下部的氣室加橡皮膜組成壓力傳感部分,上部的活動磁芯和線圈與振蕩電路板一起組成LC振蕩電路。
工作時,隨著水位的升高,氣室中的壓力也升高。當壓力升高到一定值時,橡皮膜推塑料盤頂著磁芯上移,電感線圈的電感發生變化,LC振蕩電路的振蕩頻率也發生相應變化。當頻率達到程序控制器預定值后(表示預定水位),程序控制器便發出指令停止進水,并轉入洗滌程序。水位傳感器在出廠前,振蕩頻率定為高水位頻率22.60kHz,空水位頻率25.20kHz。 水位越低,傳感器輸出的信號頻率越高。
--------------------------------------=
網上的上述信息與愛德洗衣機的水位傳感器情況吻合。我拆開我們的水位傳感器,發現其橡皮膜已經老化開裂,怪不得不能工作了。我找氣球等類似材料替代原橡皮膜換上,水位傳感器又能工作了。不過水位感應誤差變大了,通過調節傳感器里面的螺絲,可以部分彌補誤差。但最后只能使用“中-低水位”,如果用高水位,結果進水到水溢出了,洗衣機仍會以為水位不夠而不斷進水。為了廢物利用,我只好將就地用“中-低水位”來洗衣服了!
3點備忘錄:
(1)洗衣機的開蓋安全開關SA1有防抖動功能:當洗衣機脫水時,如果衣物堆放不勻,致使脫水桶劇烈振動,以幾十周的頻率撞擊安全開關SAI的傳感桿, SA1連續輸出通、斷信號,微處理器(單片機)發出糾正指令,使洗衣機進入停水→進水一漂洗一排水一脫水程序,以便消除衣物擺放不勻造成的振動。如果反復幾次不能消除該現象,單片機會令洗衣機進入脫水保護狀態。該開關還有脫水時開蓋斷電功能,我使用感覺不太方便,就將其拆除了。以后不管是否開蓋,洗衣機都可以照樣脫水。
(2)排水電磁鐵標牌工作電壓是直流198V,從電路圖上看不出直流198V電壓的電路(其電源通斷由雙向可控硅控制)。實測工作電壓是直流202V,用交流檔測是96V交流---這可能是由220V交流半波整流得到的脈動直流。
(3)該洗衣機的電路原理圖如下(圖5):
圖5
圖6)洗衣機控制面板外觀
=======================---
(二)全自動洗衣機硬件修改及軟件設計
洗衣機用一段時間后,又發生洗衣到最后階段“甩干排水”時就停機了。檢查各個硬件未見有問題,估計是單片機程序因為某次無意的錯誤碰觸高壓打火干擾,導致軟件意外被修改?盡管這個可能性“很扯”,反正洗衣機就是可以循環3次洗滌和進水+排水,但最后一次的“甩干排水”就不執行了。
我試運行產品的無水洗衣模擬測試程序,洗滌進出水各個功能都是正常的(說明洗衣機的硬件沒問題)。因為該產品配有參考電路圖,我手頭又有好幾個洗衣機的例程,干脆嘗試更換單片機,自己重寫程序看看效果如何。
開始以為這是很簡單的工作,真正動手時,才發現問題多多。
最主要問題是原機單片機不知道是什么型號?其引腳排列和51系列產品完全不同,這就導致硬件工作量大為增加,比自己另外做一個洗衣機的工作量還要大。
下圖6+圖7,先將原單片機拆焊下來,加一個單片機插座,以便以后可以隨意更換單片機。
圖6)已經拆下了原單片機的部分電路板
圖7)加焊了一個單片機插座
圖8)原單片機底部引腳布線
圖9)更換51單片機后,重新更改的引腳走線。
圖10)最后修改好的電路板。
硬件修改完成后,在進行實際軟件設計時,才發現要按照原硬件原理圖接線來設計軟件,會有很多無法躲避的麻煩。
第一個難點:由于該單片機的硬件接口有限,原洗衣機操作面板顯示不同工作狀態的的14個LED燈與2個數碼管是共用單片機端口端口,軟件編程時就不能簡單地令某個端口變高或變低電平來控制LED的亮滅,這樣會導致數碼管亂閃。反之亦然,數碼管顯示時,LED也會亂閃。如何通過控制4個片選三極管來分時顯示LED和數碼管,浪費了我很多測試時間。
第二個難點:我是用定時器做洗衣程序調度器,單片機給洗衣機按鍵、LED、數碼管和馬達按不同時間間隙執行不同的動作,這比順序循環運行的軟件設計及調試要麻煩很多。陸陸續續搞了很長時間才把程序走通。
第三個難點:水位傳感器沒買到合適產品,自己換氣室的薄膜后,重新測試高中低不同水位對應不同輸出電壓值。期間要反復進水排水測試,也是挺費神的。最尷尬的是,我是在住房室內進行將水位和軟硬件聯合測試的。某次測試后,洗衣機沒排水就撂下不管了。結果我外出辦事半天后,洗衣機排水閥發生漏水故障,洗衣機里的水全漏出來,房間泡了1厘米的水,還通過地板裂縫漏到樓下鄰居的臥房,把人家的床鋪被子和床墊全淋濕透了。最后硬著頭皮給人家道歉、賠錢,過后很長時間都不好意思面對人家,真是難堪死了!
(三)最后實現的軟硬件情況說明:
洗衣機是用STC89C52RC或STC89C54RC類單片機,水位傳感器是用電感式震蕩電路。為了節省端口,洗衣狀態顯示的14個發光二極管是與2個LED數碼管共用端口的,由4個三極管(VT7-VT10)驅動發光,并經軟件分時控制來輪流顯示,這導致了系統軟件的復雜和不易讀懂。
全自動洗衣機-實際產品應用程序功能:
洗衣進程有3種:全洗衣(洗滌+漂洗+甩干);漂洗-甩干;單獨甩干。
洗衣模式有2種:標準、省時。
水位設定有4種:高,中,低2,低1。
按下起動按鍵后,洗衣機開始進水,到達設定水位后停止進水。緊接著電動機開始正反轉運行,每次正反轉由四個節拍組成:
1)正轉= 5-10秒; 2)停轉= 3-4秒; 3)反轉= 5-10秒; 4)停轉= 3-4秒。
進水= 3分鐘,洗滌= 省時39分鐘/標準51分鐘,排水=3分鐘,脫水=1.5分鐘。脫水時電動機正轉90秒(Tspin_Minute)。
預定洗滌時間完成后,就排水和甩干。到達預定的3次循環洗滌排水周期后,洗衣過程結束,并發出提醒蜂鳴聲。全過程約為省時39分鐘/標準51分鐘。
為防止意外,在進水和排水期間,如果超過80秒水位都沒變化,便認為進出水有故障而停機報警。
---------------------------------------------------=
(四)全自動洗衣機主要源碼
//*************洗滌方式選擇********************
//標準洗滌程序=1,經濟=2, F_Normal=1, F_Econormy=2,
void key_scan() //可以選擇洗滌-暫停-菜單(改變洗滌方式)
{ static uchar Kpress_Count; //按鍵次數計數器
if(Key_Start == 0) // = P33=Key_Start=開始或暫停按鍵,按下鍵= 低電平0
{ Beep50();
if(Key_Start == 0)
{ while(!Key_Start); //wait for key release
if(flag_Washing ==0) //= 0表示還未開始洗滌
// 1th按下啟動鍵=開始,如果重復按"開啟/暫停"key,其狀態flag_Washing會1-0反復轉換
{ flag_Washing = 1; //=1復位洗滌標志,
ET1=1; //打開調度器(setting里會令ET1=0)
if(Kpress_Count ==0) { //是1th按啟動鍵嗎?
//1th按啟動鍵,Int1_Count=0.給"正常洗衣"參數賦值。2th,Int1_Count>=1,不必再給"正常洗衣"參數賦值,避免暫停洗衣后,重新運行又賦初始值,導致半途洗衣定時不對。
Kpress_Count++;
wash_on(); //-----------start washing
}
else Redo(); //-----------redo washing, //允許定時器T1中斷并打開水泵+1秒后,由T1中斷服務來打開馬達
}
else if(flag_Washing) // -----------2th按下啟動鍵=暫停
{ flag_Washing = 0; //==0表示暫停洗滌或進出水
ET1=0; //關閉調度器,顯示將不能刷新,令洗衣機暫停! Suspend();
LED_Timer_on(); Beep50();
}//end else
}
}
}
void Timer0_Init(void) //T0設為16位計數器,對信號脈沖進行計數。
{ TMOD |= 0X05; //設16位計數工作方式1,手動重裝計數初值 方式選擇位C/T=1=計數方式
TH0=0; TL0=0; //計數器T0初值為0
TR0=1; ET0=1;
}
void Timer2_Init(void)
{// 復位時, T2MOD=T2CON=00H,方式選擇位C/T=0=定時工作方式。
T2CON=0;
RCAP2H=(65536-62500)>>8; //在程序初始化的時候給RCAP2L和RCAP2H賦值,
RCAP2L=(65536-62500)%256; //中斷產生時自動使TH2=RCAP2H,TL2=RCAP2L。
TH2=RCAP2H; TL2=RCAP2L;
ET2=1; //打開定時器2中斷
TR2=1; //定時器2開始計時
}
//T1=0001,設為16位定時工作方式1,作為1秒的調度器
void Timer1_Init(void)
{ TMOD &= 0X0f; // 高位T1計數方式清0
TMOD |= 0X10; // T1=計數方式1= 16位,
//T1方式選擇位C/T=0=定時工作方式,定時方式1= 16位,不自動重裝參數
PreT1h= PreloadT1H; PreT1l= PreloadT1L;
TH1= PreT1h; TL1= PreT1l;
TR1 = 1; ET1=1;
PT1= 1; //T1為最高優先級
}
//--------------水位脈沖從P3.4=T0輸入,要用到下面的中斷計數-----------------:
void timer0(void) interrupt 1 //16位計數器0溢出中斷
{//計數溢出時,中斷并累加計數(即每收到256個脈沖就中斷1次)。到1秒后,在T2中斷換算為頻率。
TH0=00; TL0=00; //clear counter,正常時,TH0和TL0記錄水位脈沖數
}
//-------------在中斷服務里計算水位頻率F_level----------------------------
void timer2(void) interrupt 5 //12M晶振,定時器2中斷(62.5ms中斷一次,每半秒測一次),
{ TF2=0; //定時器2的中斷標志位TF2不能夠由硬件清零,所以要在中斷服務程序中將其清零
count_T2++;
if (count_T2>=8) //定時0.5s時間到
{ TR0=0; //計數器停止計數
count_T2=0; //中斷次數清0
Led_1S= ~Led_1S; //=p16仿真時便于觀察
//仿真時,為了可以無水運行,如下修改(還需將下面的水位采集語句屏蔽:-------=start
if(W_progress==1) F_level= W_level; //進水時W_level=W_MIDD=242;
else if(W_progress==3) F_level= W_empty; //排水時,W_empty=252=超過最低水位=無水
//仿真時,為了可以無水運行,修改:------------------------------------------------=end
F_level = (uint)((TH0<<8)+TL0)/50; //如果不用(uint)限定,F_level會變成0?。?!
//比較20S間隔內2次水位,如果無變化,可能進出水有問題---start
T_in_out20s++ ;
if(T_in_out20s ==40)
{ F_level_40= F_level; } //1th水位值存于F_level_40
else if(T_in_out20s ==80) //(80-40)*0.5S=20S
{ F_level_80= F_level; } //2th水位值存于F_level_80
TL0=0; TH0=0; //清零16位計數器T0
TR0=1; //計數器T0開始計數
T2_FLAG=1; //標志位置1=頻率計算結束標志--未用到
}
}
//啟動洗滌程序后,就交由調度器控制。
void Timer1(void) interrupt 3 //-------1秒調度器
{ TH1= PreT1h; TL1= PreT1l; //reload 定時值PreloadT1H= (65536-50000)>>8;
if(T50ms_count++ >=20) // =1S interrupt --------------- (1)
{ T50ms_count = 0;
if(flag_Washing==1) //=已經按下啟動鍵,運行標志,=1為已經開始運行,0為暫停 --(2)
{
Second--; // 對各個洗滌進程做減時計算 (在menu里已經令Second=0)
if((Second <=0)&&(Minute != 0)) //這是洗滌減一計時器。
{ Minute--; Second = 59;
if(T_all_reman-- < 0) T_all_reman=0; //顯示剩余時間
} //Minute和Second 是各個洗滌階段的剩余耗時值
// W_progress =0-進水,1-洗滌,2-馬達正反轉, 3-漂洗(排水),4-甩干,
if(W_progress==0) //-------(A)-----在wash_on()開始后跳到這里
{ W_progress=1; Water_in(); //進水時間在Water_in()定義
T_in_out20s=0; err=0; } //清零進出水測頻時間間隔
else if(W_progress==1) //---(A)在(W_progress==0)開始進水,0.5S后跳到這里
{ //li-排水次數計數器Dump_count,初值=0,排一次水,運行一次out(),
//測試水位傳感器是否有問題:-----------------------------------------------------start
if(T_in_out20s >80) //T_in_out20s在T2累加,
{ //如果傳感器正常,無水時F_level>253,有水時0<F_level<253,
T_in_out20s =0; //清零以便T2中斷再次保存水位值。
if((F_level_40 & F_level_80) &&(F_level_40 ==F_level_80))
//如果40S內2次水位值不為0,而且相同,說明水位傳感器有問題。
{ if(err++>=2) W_progress=8; }
}
//--end of測試水位傳感器是否有問題:------------------------------------end
if(F_level >W_level) // 檢測到預定水位W_level嗎?
{ if((Second<0)&&(Minute==0)) //水位未到,但超時
{ W_progress =8; } //=err, goto (F)超時處理
} //進水期間W_progress=1
else if((F_level<=W_level)&&(F_level>0)) //如果未超時,去洗滌
{ W_progress=2;
xi(); Beep50(); } //去洗滌
} //-----------------------end of if(W_progress==1)
else if(W_progress== 2) //(B)-------馬達正反轉時間控制
{ T_motor++; //正反轉控制計時,
if(Washprogram ==1) //=normal wash mode
{ //如果是1th,T_motor++=1
switch(T_motor) //1th,T_motor=1=case1,每秒中斷后+1
{
//1th,電機右轉10秒;10th,電機停4秒;14th,電機左轉10秒;23th后,停止轉動
case 1: ZhengZhuan(); break; //第1秒,電機右轉
case 10: Stop_Motor(); break; //第10秒,電機停
case 14: FanZhuan(); break; //第14秒,電機左轉10秒
case 23:Stop_Motor(); break; //第19秒,電機停4秒
default: //第27秒后,如果洗滌時間未完,再去正轉
if(T_motor>=27) { T_motor=0; }
}
}
else if(Washprogram ==2) //=econormy wash mode
{
//if set minute=1,則每分鐘正反轉3.5-4次,然后甩干10秒=15聲,3個周期后=3分鐘,結束洗滌
switch(T_motor) //1th,T_motor=1=case1,每秒中斷后+1
{
//1th,電機右轉5秒;6th,電機停3秒;7th,電機左轉5秒;13th后,停止轉動。
case 1: ZhengZhuan(); break; //第1秒,電機右轉5秒
case 6: Stop_Motor(); break; //第6秒,電機停3秒
case 9: FanZhuan(); break; //第9秒,電機左轉5秒
case 14:Stop_Motor(); break; //第14秒,電機停3秒
default: //第15秒后,如果洗滌時間未完,再去正轉
if(T_motor>=17) { T_motor=0; }//17S后,從頭再來
}
}
if((Second<=0)&&(Minute==0))
//如果1th洗滌cycal時間到(Second=0xff=-1)就排水
{ W_progress =3; Water_out(); } //goto 排水處理
} //------------------end of if(W_progress==2)---
else if(W_progress==3) //(C)---------如果排水完,就甩干。
{
//測試水位傳感器是否有問題:-----------------------------------------------------start
if(T_in_out20s >80) //T_in_out20s在T2累加,
{ //如果傳感器正常,無水時F_level>253,有水時0<F_level<253,
T_in_out20s =0; //清零以便T2中斷服務里再次保存水位值。
if((F_level_40 & F_level_80) &&(F_level_40 ==F_level_80))
//如果40S內2次水位值不為0,而且相同,說明水位傳感器有問題。
{ if(err++>=2) W_progress=8; }
}
//測試水位傳感器是否有問題:-----------------------------------------------------end
if((F_level <W_empty)&&(F_level>0)) //是否還有水?
{ if((Second<=0)&&(Minute==0)) //超時了,還沒排干水=err
{ W_progress =8; } //goto (F)超時處理
}
else if(F_level >= W_empty) //水確實排干了
{ // 如果無水....
if(Wash_count < Wash_cycle) //水排干了,但洗滌次數未夠
{ W_progress =4;
Tuoshui(); Wash_count++; } //水排干了,去脫水,
else if(Wash_count >Wash_cycle) W_progress =9;
//如果超過3次排水,不甩干就結束-W_progress=9
//如果是單獨排水,就設置Wash_count =Wash_cycle+1 >3,所以只排水一次,不甩干就結束
}
} //-----------------------end of if(W_progress==3)
else if(W_progress==4) //(D) ----甩干完了,進水或結束
{ if((Second<=0)&&(Minute==0)) // ----甩干時間到否?
{// Wash_cycle =洗滌次數=3次=(進水+洗滌+排水+甩干)*3
if(Wash_count >=Wash_cycle) //甩干時間到了,結束洗滌
{ W_progress =9; } //goto (G)=over()
else
{ W_progress =0; Water_in(); }
//甩干時間到,但洗滌未夠3次,Wash_count<Wash_cycle,繼續洗滌
}
} //-----------------------end of if(W_progress==4)
//===============================================
else if(W_progress== 8) //(F)----------err超時處理
{ T_all_reman=99; Second=0; Minute=0; Beep300();
err =1; Stop_Motor();
Pump_out_off(); Pump_in_off();
}
else if(W_progress==9) //(G)----------洗滌結束
{ T_all_reman=88; Second=0; Minute=0; over(); }
//===================================================
} //---------end of if(!flag_Washing) //按下啟動鍵 ----(1)end
} //------------------end of if(T50ms_count++>=20)--------(2)end
}
//由于LED與SEG共用P0口,所以必須用輪流顯示LED,數碼管由中斷刷新
void Led_Update(void)
{ Seg_disable(); //數碼管不顯示
Show_water_led(); Delay_1ms(1); //須延時1MS才能看到LED亮
Show_progress_led(); Delay_1ms(1);
Show_program_led(); Delay_1ms(1);
if(f_Ledtimer == 1)
{ LED_Timer_on(); Delay_1ms(1); } //定時器LED亮,暫停時LED_Timer=on
else LED_Timer_off(); //正常工作時LED_Timer=off
}
/**********************管腳初始化程序******************/
void InitAll(void)
{ // LED_Regular =ON; //ON=1,默認為標準程序,燈亮
Pump_in = OFF; //OFF=0; 進水控制,關, 單個反相器驅動
Pump_out= 1; // P2^0=排水控制,1=關,因為本人另加有2個反相器串聯電路
Motor_R = OFF; //電機正轉,不走=OFF=0, 單個反相器驅動
Motor_L = OFF; //電機反轉,不走=OFF=0, 單個反相器驅動
Beeper = OFF; //報警喇叭,不叫=OFF=0
P1= 0xef; //let P1口為輸入= 3個按鍵=P12-P14-P15,注意:P17=beeper=0不響
K_program= 1; //let P33口為輸入,K_program = P3^3=啟停按鍵1=int1 port
//標志清零:
flag_Washing =0; //運行標志,1為已經開始運行,0為暫停
f_Ledtimer =0; // 控制LED亮或滅的標志,timer_led=off=0
F_level=W_empty; // F_level是檢測到的水位頻率,
W_level=W_MIDD; // W_level是預置的水位,W_MIDD=242,中LED=亮,
Level_case = F_MIDD; //設置水位時的增量累加器=1-2-3-4=high-middle-low2-low1,
T_Normal_min=9; //=9對應=9*3+24=51分鐘
T_Normal_sec=0;
T_Econormy_min=5; //=5對應=5*3+24=39分鐘 =省時洗滌,仿真=1
T_Econormy_sec=0;
//進出水+甩干的時間
Tin_Minute = 3; //water-in時間 =3分鐘
Tin_Second = 0; // =秒
Tout_Minute = 3; //water-out時間=3分鐘
Tout_Second = 0;
Tspin_Minute= 1; //甩干時間=1分30秒,如果2分鐘可能會太長.
Tspin_Second= 30; //如果仿真用30秒
T_in_out20s = 0; //20S時間間隔計數器--用于每20S測試一次進出水,看是否正常?
F_level_40 = 0;
F_level_80 = 0; //80S間隔水位頻率暫存值,比較其變化值來判斷進出水是否正常?
Wash_count =0; //實際循環洗滌次數計數器=清零
Wash_cycle = 3; //循環洗滌次數(一個循環=進水+洗滌+脫水)=3是標準洗滌次數
W_progress = 0; // 工作狀態跳轉控制標志=0-進水(浸泡),1-洗滌,2-排水,3-甩干
Washprogram= 2; //1=標準,2=省時
if(Washprogram== 1) //1=標準,2=省時
{ Txi_Minute = T_Normal_min; //正常洗滌=7分*3,對應=21分鐘;仿真時=0分鐘+30秒
Txi_Second = T_Normal_sec;
}
else
{ Txi_Minute = T_Econormy_min; //省時洗滌=5分*3,對應=15分鐘;仿真時=0分鐘+30秒
Txi_Second = T_Econormy_sec;
}
}
//==================================-
void main()
{ uchar Tms=500; //延時顯示參數-實際應用=APP=500
InitAll(); //管腳初始化,報警喇叭,進水、排水、電機正轉反轉均=關閉
Beep50(); //Beeper=0=stop蜂鳴器, =1=響=p17
Timer1_Init(); // T1作調度器
Timer0_Init(); // 定時器0中斷作為水位檢測脈沖計數
Timer2_Init(); // 定時器2中斷計時,將T0的頻率計數轉為頻率
EA=1;
T_all_reman= T_all; //T_all(洗滌總時長);T_all_reman=洗滌剩余時間
while(1)
{
//設置洗滌參數:
if(flag_Washing==0) //如果在暫停狀態(首次開機或按了暫停鍵)才可以設置洗滌參數
{
Set_Level_case(); //設置水位, =key2=p13, Level_case++;
//改變洗滌進程:
Set_progress(); //progress=key3=p15,
//改變洗滌方式:
Set_program(); //program=key4,洗滌方式:F_Normal=1, F_Econormy=2,
ET1= 0; //調度器T1關中斷,調度器不工作,停止循環顯示,
}
key_scan(); //選擇"啟動/暫停"
//=key scan + wash start。如果開始洗滌,就從wash_on()開始
Led_Update(); //洗衣狀態的LED顯示
Seg_Update(); //輪流顯示水位和剩余洗滌時間
//因為試運行出錯時,調度器里不能關斷pump-in,所以這里加-err超時處理
if((F_level <W_OVER)||(F_level==W_ERR))
// 檢測到的水位F_level有問題,W_ERR=0,W_OVER=220=過高水位
{ W_progress=8; T_all_reman=99;
Second=0; Minute=0; Beep300();
Stop_Motor(); Pump_out_off(); Pump_in_off();
}
}
}
//程序結束。
20220814