標題: 小白求助!關于單片機洗衣機控制系統的設計 [打印本頁]
作者: iamkenny 時間: 2016-12-17 19:00
標題: 小白求助!關于單片機洗衣機控制系統的設計
小白剛學單片機不久 碰到了老師布置這個題目 感覺毫無頭緒。。 再此求教各位大神!
洗衣機控制系統設計設計內容:
1、 用直流電機的轉速表征三種不同洗衣方式,弱洗、強洗、漂洗;(20分)
2、 實現最長10分鐘定時;(20分)
3、 用三個獨立按鍵設置待洗衣物的不同洗滌方式: (40分)
絲質衣服: 漂洗 定時3分鐘
棉質衣服:弱洗 2分鐘;強洗 5分鐘;漂洗 3分鐘;
化纖衣服: 強洗 4分鐘;漂洗 2分鐘;
4、 定時時間到,蜂鳴器報警提示。(20分)
作者: angmall 時間: 2016-12-18 22:22
- // 基于單片機的洗衣機的控制系統設計
- /*
- 1洗衣機的功能及設計
- 1.1洗衣機功能要求 洗衣機的主要工作程序是:洗滌——脫水——漂洗——脫水——漂洗——脫水。上述工作程序中,包含三個過程,洗滌過程、漂洗過程、脫水過程。
- (1)洗滌過程:放好待洗物,啟動開關,進水閥通電,向洗衣機供水,當供水達到預定水位時,水位開關接通,進水閥斷電關閉,停止供水。洗滌電動機接通電源,帶動波輪(或桶)旋轉,產生各種形式的水流攪動衣物進行洗滌。通過電動不停的正轉、停、反轉、反復循環,形成洗滌水對洗滌物產生強烈的翻滾作用。同時,衣物之間、衣物與四周桶壁之間產生互相摩擦和撞擊力,以次達到洗滌衣物的目的。 (2)漂洗過程:漂洗的目的在于清除衣物上的洗滌液,因此,漂洗過程與洗滌過程的電器動作是完全相同的。
- (3)脫水過程:洗滌或漂洗后,需要對衣物進行脫水以便晾干,節省水資源,所以脫水是洗衣過程中必不可少的環節。洗滌或漂洗過程結束后,電動機停止轉動,排水閥通電,打開排水閥門排水。當水位低到一定程度時,滿足安全條件,脫水電動機接通,電機帶動脫水桶高速旋轉,利用離心力把衣服上的水從桶壁的小眼里甩出。全部洗衣工作完成后,由蜂鳴器發出音響,表示衣物已洗干凈。
- 1.2洗衣機硬件電路設計
- 1.2.1 洗衣機總體設計框圖
- 橢圓型表示指示燈:從上到下依次為強洗、弱洗、洗滌次數、洗衣定時、脫水定時、洗衣剩余時間、脫水剩余時間。 電動機正轉為強洗,正反交替轉動設定為弱洗,初始設定的狀態為強洗,若要選擇弱洗模式需按下增加按鍵,再次按下選擇按鍵,則表示洗滌次數的指示燈被點亮,選擇增加或減少按鍵對時間進行加減。然后對脫水時間設定,最后按下啟動鍵,洗衣機開始工作。
- 1.2.3硬件電路的主要模塊
- 根據洗衣機的基本功能,硬件電路設計需要考慮:水流強度的問題、洗滌、漂洗、脫水時間設定長短的問題、工作時間或剩余時間的顯示、工作過程中的暫停、啟動、復位、洗完后的報警等問題。 采用5l系列單片機作為控制核心,主要包括功能設置及控制電路、洗衣機狀態顯示及輸出控制電路。主要組成部件有:單片機、74LSl38譯碼器、ULN2003、指示燈、數碼管、電動機、蜂鳴器以及按鍵等。
- (1)功能設置及控制電路
- ①暫停鍵K0,接P3.3,用外部中斷1實現工作過程的暫停,根據人的需要可以進行手工洗滌; ②水位開關K1,接P1.O,水位到位時,K1閉合。在進水期間,系統不斷檢測K1,當檢測到K1閉合就停止進水; ③按鍵K2,接P1.6,作為工作過程中的啟動鍵;
- ④按鍵K3是洗衣強度選擇鍵,接P3.4,每按一次代表一種強度。分別是標準、弱洗、強洗和自編,由4個指示燈進行顯示; ⑤按鍵K4,接P3.5,對洗衣時間進行設置,并用數碼管LEDl和LED2顯示:
- ⑥按鍵K5,接P3.6,對漂洗、脫水次數進行設置,并用數碼管LEDI顯示;
- ⑦壓電蜂鳴器接P1.7,作為洗衣時間到以及故障發生的報警器。
- (2)洗衣機狀態顯示 74LSl38譯碼器為3—8譯碼器,選用它可以解決I/0口線數量不足問題。從控制要求可知,洗衣機的工作模式以及工作程序必須有7中不同的顯示加以區別。74LSl38譯碼器的輸入端C、B、A分別接P1.3、P1.4、P1.5,輸出端分別與7個發光二極管DO--D6的陰極相連,發光二極管陽極接電源。輸出端YO控制D0“弱洗”指示燈:Y1控制D1“標準洗”指示燈,Y2控制D2“強洗”指示燈,Y3控制D3“自編”指示燈,Y4控制D4“洗衣”指示燈,Y5控制D5“漂洗”指 示燈,Y6控制D6“脫水”指示燈
- (3)輸出控制電路 輸出控制電路由觸發器電路和相應的雙向晶閘管組成?刂齐姍C正反轉以及進水閥和排水閥的開啟和關閉。通過觸發器電路和相應的雙向晶閘管,電動機的正轉和反轉用單片機P1.1和P1.2進行控制;進水電磁閥和排水電磁閥用單片機的P3.0和P3.1進行控制
- 1.3洗衣機軟件系統設計
- 1.3.1主程序設計
- 根據硬件設計要求,控制主程序流程圖如圖所示。洗衣機通電之后,單片機上電,首先進行程序的初始化,包括定時器O、外部中斷O、外部中斷l的初始化,以及各參數初值的設定。默認洗衣強度為“標準洗”,漂洗次數3次。然后掃描K2、K3、K4、K5鍵的狀態,確定洗衣強度R2、洗衣時間R3和漂洗次數R4。洗衣機處于待命狀態,控制指示燈顯示洗衣強度,液晶顯示預設洗衣時間。當發現啟動鍵K2按下,洗衣機從待命狀態進入工作狀態。完成進水——洗滌——脫水——漂洗的循環過程。當洗衣結束時,控制蜂鳴器發聲。
- */
- #include <reg51.h> //各個引腳功能定義
- sbit key_move_stop = P2^0; //啟動、暫停按鍵
- sbit key_wash_dehydration = P2^1; //洗滌、脫水按鍵
- sbit key_water_detection = P3^2; //水位檢測按鍵 外部中斷0
- sbit key_cap_open = P3^3; //機蓋裝置按鍵 外部中斷1
- sbit LED1 = P0^0; //啟動指示燈 sbit LED2 = P0^1; //暫停指示燈
- sbit LED3 = P0^2; //洗滌指示燈 sbit LED4 = P0^3; //脫水指示燈
- sbit LED5 = P0^4; //進水閥指示燈 sbit LED6 = P0^5; //排水閥指示燈
- sbit LED7 = P0^6; //水位滿指示燈 sbit LED8 = P0^7; //機蓋松指示燈
- sbit LED9 = P2^7; //報警指示燈
- sbit LS138A = P2^2; //數碼管片選
- sbit LS138B = P2^3; sbit LS138C = P2^4;
- sbit BEEP = P2^6; //蜂鳴器報警
- sbit PWM = P2^5; //直流電動機
- //共陰數碼管 0-9 -
- unsigned int code Disp_Tab[] =
- {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
- unsigned int i=0,LedNumVal=0; //數碼管計時 0-9 選擇
- unsigned int lednum = 0; //定時器0 數碼管計時速率調控變量
- unsigned int LedOut[3]; //數碼管計時存儲區
- unsigned char key_s,key_v; //按鍵掃描變量
- static unsigned int m = 0; //啟動、暫停鍵計數變量
- static unsigned int movenum = 0; //暫停功能變量
- /***********************************************************/
- unsigned char scan_key() //啟動/暫停鍵;洗滌/脫水鍵掃描
- {
- unsigned char Key_s; Key_s = 0x00;
- Key_s |= key_wash_dehydration; Key_s <<= 1;
- Key_s |= key_move_stop;
- return Key_s;
- }
- /************************************************************/
- void delay( unsigned int a) //數碼掃描延時子程序
- {
- unsigned char b;
- for(; a > 0; a--)
- for(b = 200; b > 0; b--);
- }
- /**********************************************************/
- void delayms( unsigned char ms) //按鍵消抖延時子程序
- {
- unsigned char k;
- while(ms--)
- {
- for(k = 0; k < 120; k++);
- }
- }
- /***********************************************************/
- void beep() {
- unsigned int n = 0;
- BEEP = 1;LED9 = 1;
- for(; n<6;n++)
- {
- BEEP = 0;LED9 = 0;
- delayms(3000);
- BEEP = 1;LED9 = 1;
- delayms(1000);
- }
- }
- /*************************************************************/
- void led_display_zero() //數碼管清零并直流電動機停止 蜂鳴器響三下
- {
- beep();
- PWM = 1;
- while(1)
- {
- unsigned int i = 0;
- unsigned int LedNumVal = 0;
- PWM = 1;
- if(key_wash_dehydration ==0) //洗滌后脫水按下鍵跳出
- {
- LED3 =1;
- LED4 =0;
- LED6 =0; break;
- }
-
- LedOut[0]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位帶小數點
- LedOut[1]=Disp_Tab[LedNumVal%100/10]; //十位
- LedOut[2]=Disp_Tab[LedNumVal%10]; //個位
-
- for( i=0; i<3; i++)
- {
- P1= LedOut[i];
- switch(i)
- {
- case 0:LS138A=1; LS138B=0; LS138C=0; break;
- case 1:LS138A=0; LS138B=1; LS138C=0; break;
- case 2:LS138A=0; LS138B=0; LS138C=1; break;
- default:break;
- }
- delay(10);
- P1 = 0x00;
- }
- }
- }
- /*************************************************************/
- void led_display_over() //數碼管清零并直流電動機停止 蜂鳴器響三下
- {
- beep();
- PWM = 1;
- while(1)
- {
- unsigned int i = 0;
- unsigned int Led = 0;
- LED1 = 1; //啟動指示燈
- LED2 = 1; //暫停指示燈
- LED3 = 1; //洗滌指示燈
- LED4 = 1; //脫水指示燈
- LED5 = 1; //進水閥指示燈
- LED6 = 1; //排水閥指示燈
- LED7 = 1; //水位滿指示燈
- LED8 = 1; //機蓋松指示燈
- LED9 = 1; //出水閥指示燈
- if(key_move_stop ==0) //脫水后按下鍵跳出
- {
- LED1 = 0; //啟動指示燈
- LED2 = 1; //暫停指示燈
- LED3 = 1; //洗滌指示燈
- LED4 = 1; //脫水指示燈
- LED5 = 0; //進水閥指示燈
- LED6 = 1; //排水閥指示燈
- LED7 = 1; //水位滿指示燈
- LED8 = 1; //機蓋松指示燈
- LED9 = 1; //報警指示燈
- break;
- }
- LedOut[0]=Disp_Tab[Led%1000/100]|0x80; //百位帶小數點
- LedOut[1]=Disp_Tab[Led%100/10]; //十位
- LedOut[2]=Disp_Tab[Led%10]; //個位
- for( i=0; i<3; i++)
- {
- P1= LedOut[i];
- switch(i)
- {
- case 0:LS138A=1; LS138B=0; LS138C=0; break;
- case 1:LS138A=0; LS138B=1; LS138C=0; break;
- case 2:LS138A=0; LS138B=0; LS138C=1; break;
- default:break;
- }
- delay(10);
- P1 = 0x00;
- }
- }
- }
- /*************************************************************/
- void cap_open() //數碼管清零并直流電動機停止 蜂鳴器響三下
- {
- beep(); //需要復位跳出
- PWM = 1;
- while(1)
- {
- unsigned int i = 0;
- unsigned int LedNum = 0;
- LedOut[0]=Disp_Tab[LedNum%1000/100]|0x80; //百位帶小數點
- LedOut[1]=Disp_Tab[LedNum%100/10]; //十位
- LedOut[2]=Disp_Tab[LedNum%10]; //個位
- for( i=0; i<3; i++)
- {
- P1= LedOut[i];
- switch(i)
- {
- case 0:LS138A=1; LS138B=0; LS138C=0; break;
- case 1:LS138A=0; LS138B=1; LS138C=0; break;
- case 2:LS138A=0; LS138B=0; LS138C=1; break;
- default:break;
- }
- delay(10);
- P1 = 0x00;
- }
- }
- }
- /************************************************************/
- void led_display_move() //數碼管計時并直流電動機運轉
- {
- while(1)
- {
- PWM = 0;
- if(LedNumVal == 101) //計時到100時自動清零并蜂鳴器響三下
- {
- LedNumVal = 0;
- TR0 = 0;
- break;
- }
- if(key_move_stop ==0)
- {
- movenum++;
- if(movenum%2==1)
- {
- LED1 = 1; //啟動指示燈
- LED2 = 0; //暫停指示燈
- TR0 = 0; //關閉定時器0
- }
- else
- {
- LED1 = 0;
- LED2 = 1;
- TR0 = 1; //開啟定時器0
- }
- }
- while(key_move_stop ==0); //等待按鍵釋放
- LedOut[0]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位帶小數點
- LedOut[1]=Disp_Tab[LedNumVal%100/10]; //十位
- LedOut[2]=Disp_Tab[LedNumVal%10]; //個位
- for( i=0; i<3; i++)
- {
- P1 = LedOut[i];
- switch(i)
- {
- case 0:LS138A=1; LS138B=0; LS138C=0; break;
- case 1:LS138A=0; LS138B=1; LS138C=0; break;
- case 2:LS138A=0; LS138B=0; LS138C=1; break;
- default:break;
- }
- delay(10);
- P1 = 0x00;
- }
- }
- }
- /***********************************************************/
- void move_stop_led()
- {
- m++;
- if(m == 1)
- {
- EX0=1; //外部中斷0允許中斷 水位檢測
- LED1 = 0; //啟動指示燈
- LED2 = 1; //暫停指示燈
- LED3 = 1; //洗滌指示燈
- LED4 = 1; //脫水指示燈
- LED5 = 0; //進水閥指示燈
- LED6 = 1; //排水閥指示燈
- LED7 = 1; //水位滿指示燈
- LED8 = 1; //機蓋松指示燈
- LED9 = 1; //報警指示燈
- }
- else if((m>1)&&(m%2==1))
- {
- LED1 = 0; //啟動指示燈
- LED2 = 1; //暫停指示燈
- } else
- {
- LED1 = 1; //啟動指示燈
- LED2 = 0; //暫停指示燈
- TR0 = 0; //停止定時器工作
- }
- }
- /**********************************************************/
- void wash_dehydration_led()
- {
- static unsigned int j = 0;
- j++;
- if(j%2 == 1) //啟動并洗滌
- {
- LED1 = 0; //啟動指示燈
- LED2 = 1; //暫停指示燈
- LED3 = 0; //洗滌指示燈
- LED4 = 1; //脫水指示燈
- LED5 = 1; //進水閥指示燈
- LED6 = 1; //排水閥指示燈
- LED7 = 1; //水位滿指示燈
- LED8 = 1; //機蓋松指示燈
- LED9 = 1; //報警指示燈
- led_display_move();
- led_display_zero();
- }
- else //啟動并脫水
- {
- LED1 = 0; //啟動指示燈
- LED2 = 1; //暫停指示燈
- LED3 = 1; //洗滌指示燈
- LED4 = 0; //脫水指示燈
- LED5 = 1; //進水閥指示燈
- LED6 = 0; //排水閥指示燈
- LED7 = 1; //水位滿指示燈
- LED8 = 1; //機蓋松指示燈
- LED9 = 1; //報警指示燈
- led_display_move();
- led_display_over();
- }
- }
- /*********************************************************/
- void proc_key(unsigned char key_v)
- {
- if((key_v & 0x01) == 0)
- { move_stop_led();
- }
- else if((key_v & 0x02) == 0)
- { if(m%2==1)
- { TR0 = 1; //定時器0開始工作
- wash_dehydration_led();
- }
- }
- }
- /*********************************************************/
- main() {
- IT0 = 1; //外部中斷0 水位檢測 跳沿觸發方式
- EX0=0; //不允許外部中斷0中斷
- IT1 = 1; //外部中斷1 機蓋打開 跳沿觸發方式
- EX1 = 1; //允許外部中斷1中斷
- TMOD = 0x01; //定時器0 定時模式 方式1
- ET0 = 1; //允許定時器0中斷
- TR0 = 0; //停止定時器工作
- TH0 = 0xDB;
- TL0 = 0xF0; //10ms EA=1;
- P0 = 0xff;
- key_v = 0x03;
- LS138A=0;
- LS138B=0;
- LS138C=0;
- while(1)
- {
- key_s = scan_key();
- if(key_s != key_v)
- {
- delayms(10);
- key_s = scan_key(); //啟動/暫停鍵 洗滌/脫水鍵掃描
- if(key_s != key_v)
- {
- key_v = key_s;
- proc_key(key_v);
- delayms(30);
- }
- }
- }
- }
- void counter0(void) interrupt 0
- {
- EX0=0;
- LED7 = 0; //水位滿
- LED5 = 1; //進水閥指示燈
- EX0=1;
- }
- void time0(void) interrupt 1
- {
- lednum++;
- TR0 = 0;
- TH0 = 0xDB; //10ms
- TL0 = 0xF0;
- if(lednum == 50)
- {
- lednum = 0;
- LedNumVal++;
- }
- TR0 = 1;
- }
- void counter1(void) interrupt 2
- {
- EX1 = 0;
- LED1 = 1; //啟動指示燈
- LED2 = 1; //暫停指示燈
- LED3 = 1; //洗滌指示燈
- LED4 = 1; //脫水指示燈
- LED5 = 1; //進水閥指示燈
- LED6 = 1; //排水閥指示燈
- LED7 = 1; //水位滿指示燈
- LED8 = 1; //機蓋松指示燈
- cap_open();
- }
復制代碼
作者: 謝金汛 時間: 2019-6-13 09:20
樓主設計出來了嗎?
作者: ygs2527 時間: 2019-7-3 15:07
666樓主設計出來了嗎?
作者: 不鳴001 時間: 2020-11-20 00:27
你好,你有proteus的圖嗎
作者: 器車人 時間: 2020-11-20 09:25
找個電機驅動ic,然后學會調速PWM控制,然后學習單片機,定時器,按鍵輸入
作者: changhz 時間: 2020-11-20 09:42
不錯,占個位,抽空測試看看
作者: zzyiSir 時間: 2020-12-9 12:38
樓主設計出來了嗎?求proteus圖
作者: spxbaba 時間: 2020-12-11 13:13
二樓難道不是答案么?
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |