內容: 設自動洗衣機的控制要求是:啟動后先開啟進水閥進水,水位到達設定值后關閉,然后波輪按正轉5秒、反轉5秒,正、反轉之間停3秒的規律不斷循環轉動,直至達到設定時間停止,之后打開排水閥放水,水放完后洗衣桶旋轉脫水,1分鐘后停止并關閉排水閥,洗衣過程結束。要求水位設置不少于高、中、低三檔,洗衣時間在3——12分鐘范圍內可調,以1分鐘為單位,排水時間定為1分鐘。運動執行器用指示燈模擬,水位用開關模擬,試設計該洗衣機的控制電路。 要求: - 畫出控制系統的框圖,說明系統方案設計的思路、理由或依據;
- 選擇、確定組成控制系統的各個單元,并闡述選擇確定的原則或依據;
- 畫出完整的電氣原理圖,介紹整體電路的工作原理、性能或特點;
- 如采用單片機控制,給出單片機程序的流程圖和清單,說明程序的工作原理。
- 制作實物電路,驗證設計、制作是否正確。
- 題目分析及設計思路;(弄清楚要完成設計的技術要點、關鍵是什么,有哪些需要注意的事項,可以采用哪些方法和手段,有哪些可用的方案或電路形式,等等。)
要完成本項目設計的技術要點是對洗衣機的整個運行流程深刻理解之后,再用程序將他表現出來,說以關鍵就在于程序的編寫。需要注意的是運動執行器是用指示燈模擬,水位用開關模擬,還要求水位設置不少于高、中、低三檔,洗衣時間在3——12分鐘范圍內可調所以大概就要用到6個發光二極管和8個復位按鍵,因此就要對整個流程控制的邏輯順序有個很好的設計。對于程序的編寫可以采用單片機或PLC(就目前所學而言),而對于這樣一個簡單的小程序就采用單片機即可。 - 方案設計說明;(在充分調研、思考的基礎上確定電路方案并說明理由。畫出電路的系統框圖,說明系統框圖的原理。)
一開始看到這個題目我就打算使用單片機來完成本設計,因為單片機使用方便,只需一個最小系統即可,在宿舍就可完成對程序的編寫和修改,而PLC價格昂貴且不能隨時可用。就本項目采用單片機而言需要一個單片機最小系統,思維數碼管及驅動,一組LED和按鍵。 系統框圖: 通過對八個按鍵的操作,可對水位設置,洗衣時間設置,開始洗衣,水位確定。四位數碼管可顯示水位的設置值,洗衣時間設置值,還有洗衣時間計時等。六個LED有兩個表示洗衣機波輪的正反轉,兩個進水和排水,一個脫水,一個洗衣指示燈。通過編寫程序實現單片機對按鍵,四位數碼管和發光二極管的控制。 系統流程圖:
- 單元設計說明;(按項目的具體要求撰寫,沒有可不寫。)
單片機最小系統: 系統框圖: 最小系統電路圖: 通過單片機掃描水位設置按鍵和洗衣時間設置按鍵來設置水位和洗衣時間在四位數碼管上顯示設置的值和計時時間。進水閥指示燈亮表示進水閥已打開,正轉和反轉指示燈亮表示洗衣機波輪的正轉和反轉。脫水閥亮表示脫水閥已打開可以排水。 - 制作、調試情況;(如實介紹,重點介紹制作、調試過程中遇到的問題和解決問題的方法)
在制作,調試中遇到了許多大大小小的問題,在這選一些較為重要的寫出。 - 在焊接完單片機最小系統進行調試時指示燈不會亮,也不能下載程序,經過幾番檢查發現指示燈正負接反,單片機引腳焊點有虛焊點。
- 編寫好程序進行調試時,四位數碼管不能正常顯示,經檢查發現共陽的數碼管使用了共陰的數碼管編碼。
- 在調試程序中,發現四位數碼管顯示較暗且有閃爍,經多次調試,將數碼管顯示程序寫在定時器中斷函數里,發現結果好多了。
- 在測試程序中發現按鍵不起作用,檢查了程序和硬件電路發現按鍵連接的是地,而程序寫的高電平接通。改了下程序結果就出來了。
八個按鍵從左到右的作用:按鍵1水位設置和洗衣時間設置切換選擇,按鍵2和按鍵3是加減數值,按鍵4是啟動,按鍵5按鍵6按鍵7按鍵8是表示水位的零水位和高中低水位。 通過本次實訓,收獲頗多,感覺自己有進步了一點,許多東西只用大腦去想是不行的,理論可行但實際可不可行就不知道,這就需要實際動手操作了才知道,一開始看了這個項目覺得很簡單,隨便編寫個程序就可以了,但實際坐下來就沒有那么簡單了,首先硬件電路焊接就出現許多問題,跟別說編寫和調試程序就用了一個多星期。不過實際做出來,感覺還是挺好的。這也讓我進一步了解了單片機的使用,掌握了一些運動控制的思路與方法。 - #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar gewei,shiwei;
- uchar xiyitime,num3;
- uchar shuiweizhi,shuiwei;
- uint num1,num2;
- sbit wei1=P1^0;
- sbit wei2=P1^1;
- sbit wei3=P1^2;
- sbit wei4=P1^3;
- sbit shuiwei0=P1^4; //
- sbit shuiwei1=P1^5; //低水位
- sbit shuiwei2=P1^6; //中水位
- sbit shuiwei3=P1^7; // 高水位
- sbit shezhi_key=P2^0;
- sbit qidong_key=P2^1;
- //sbit xiyi_key=P2^0;
- sbit up_key=P2^2;
- sbit down_key=P2^3;
- sbit shuifa=P2^4;
- sbit paishuifa=P2^5;
- sbit zhengzhuang=P2^6;
- sbit fanzhuang=P2^7;
- sbit tuoshui=P3^6;
- sbit zhishiled=P3^7;
- //此表為 LED 的字模, 共陰數碼管 0-9 -
- unsigned char code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e}; //段碼控制
- unsigned char code segtab1[]={0x40,0x4F,0x24,0x30,0x19,0x12,
- 0x02,0x78,0x00,0x10}; //共陰0-9帶小數點編碼
- //延時X毫秒函數11.0592Mhz時
- void delay_xms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- //延時X秒函數
- void delay_s(uint xs)
- {
- uint x;
- for(x=xs;x>0;x--)
- delay_xms(1000);
- }
- //延時X分鐘函數
- void delay_min(uint xmin)
- {
- uint m,n;
- for(m=xmin;m>0;m--)
- for(n=60;n>0;n--)
- delay_s(1);
- }
- //取操作數的個十位
- void chuli(uint num)
- {
- gewei=num%10;
- shiwei=(num/10)%10;
- }
- //按鍵掃描函數
- void keysaomiao()
- {
- uchar jianzhi;
- if(shezhi_key==0)
- {
- delay_xms(10);
- if(!shezhi_key)
- {
- jianzhi++;
- if(jianzhi>2)
- jianzhi=1;
- while(!shezhi_key);
- }
- }
- if(jianzhi==1) //水位設置
- {
- if(up_key==0)
- {
- delay_xms(10);
- if(up_key==0)
- {
- shuiwei++;
- if(shuiwei>3)
- {
- shuiwei=0;
- }
- while(!up_key);
- }
- }
- if(down_key==0)
- {
- delay_xms(10);
- if(down_key==0)
- {
- if(shuiwei<=0)
- {
- shuiwei=3;
- }
- shuiwei--;
- while(!down_key);
- }
- }
- chuli(shuiwei);
- P0=segtab[gewei];
- wei1=0;
- delay_xms(5);
- wei1=1;
- P0=segtab[shiwei];
- wei2=0;
- delay_xms(5);
- wei2=1;
- P0=0xFE;
- wei3=0;
- delay_xms(5);
- wei3=1;
- P0=0x9C;
- wei4=0;
- delay_xms(5);
- wei4=1;
- }
- if(jianzhi==2)
- {
- if(up_key==0)
- {
- delay_xms(10);
- if(up_key==0)
- {
- xiyitime++;
- if(xiyitime>12)
- {
- xiyitime=3;
- }
- while(!up_key);
- }
- }
- if(down_key==0)
- {
- delay_xms(10);
- if(down_key==0)
- {
- xiyitime--;
- if(xiyitime<3)
- {
- xiyitime=12;
- }
- while(!down_key);
- }
- }
- chuli(xiyitime);
- P0=segtab[gewei];
- wei1=0;
- delay_xms(5);
- wei1=1;
- P0=segtab[shiwei];
- wei2=0;
- delay_xms(5);
- wei2=1;
- P0=0xF7;
- wei3=0;
- delay_xms(5);
- wei3=1;
- P0=0xA3;
- wei4=0;
- delay_xms(5);
- wei4=1;
- }
- }
- //水位檢測子函數
- void shuiweijiance()
- {
- if(shuiwei0==0)
- {
- delay_xms(10);
- if(shuiwei0==0)
- {
- shuiweizhi=0;
- while(!shuiwei0);
- }
- }
- if(shuiwei1==0)
- {
- delay_xms(10);
- if(shuiwei1==0)
- {
- shuiweizhi=1;
- while(!shuiwei1);
- }
- }
- if(shuiwei2==0)
- {
- delay_xms(10);
- if(shuiwei2==0)
- {
- shuiweizhi=2;
- while(!shuiwei2);
- }
- }
- if(shuiwei3==0)
- {
- delay_xms(10);
- if(shuiwei3==0)
- {
- shuiweizhi=3;
- while(!shuiwei3);
- }
- }
- }
- //初始化函數
- void init()
- {
- num2=60;
- num3=4;
- shuiweizhi=0;
- xiyitime=3;
- TMOD=0x01;
- //TH0=(65536-45872)/256;//11.0592M晶振
- //TL0=(65536-45872)%256;
- TH0 = 0xB1;//12M晶振
- TL0 = 0xE0;
- EA=1;
- ET0=1;
- }
- /************主函數**********************/
- void main()
- {
- uint i,j;
- init();
- P0=0xbf;
- wei1=0;
- wei2=0;
- wei3=0;
- wei4=0;
- while(qidong_key)
- {
- keysaomiao();//水位和洗衣時間設置
- }
- num3=xiyitime-1;
- if(qidong_key==0)
- {
- delay_xms(10);
- if(qidong_key==0)//啟動鍵按下
- {
- shuifa=0; //開進水閥進水
- while(shuiwei!=shuiweizhi)//檢測是否到達設定水位
- {
- shuiweijiance();
- chuli(shuiweizhi);
- P0=segtab[gewei];
- wei1=0;
- delay_xms(5);
- wei1=1;
- P0=segtab[shiwei];
- wei2=0;
- delay_xms(5);
- wei2=1;
- delay_xms(5);
- chuli(shuiwei);
- P0=segtab[gewei];
- wei3=0;
- delay_xms(5);
- wei3=1;
- P0=segtab[shiwei];
- wei4=0;
- delay_xms(5);
- wei4=1;
- }
- while(i<100)
- {
- i++;
- shuiweijiance();
- chuli(shuiweizhi);
- P0=segtab[gewei];
- wei1=0;
- delay_xms(5);
- wei1=1;
- P0=segtab[shiwei];
- wei2=0;
- delay_xms(5);
- wei2=1;
- delay_xms(5);
- chuli(shuiwei);
- P0=segtab[gewei];
- wei3=0;
- delay_xms(5);
- wei3=1;
- P0=segtab[shiwei];
- wei4=0;
- delay_xms(5);
- wei4=1;
- }
- delay_s(1);
- while(j<300)
- {
- j++;
- chuli(shuiwei);
- P0=segtab[gewei];
- wei1=0;
- delay_xms(5);
- wei1=1;
- P0=segtab[shiwei];
- wei2=0;
- delay_xms(5);
- wei2=1;
- chuli(xiyitime);
- P0=segtab[gewei];
- wei3=0;
- delay_xms(5);
- wei3=1;
- P0=segtab[shiwei];
- wei4=0;
- delay_xms(5);
- wei4=1;
- }
- shuifa=1;
- zhishiled=0;
- TR0=1;
- while(!num3==0)
- {
- if(num2>=59)
- zhengzhuang=0;
- if(num2==55)
- zhengzhuang=1;
- if(num2==52)
- fanzhuang=0;
- if(num2==46)
- fanzhuang=1;
- if(num2==42)
- zhengzhuang=0;
- if(num2==35)
- zhengzhuang=1;
- if(num2==30)
- fanzhuang=0;
- if(num2==23)
- fanzhuang=1;
- if(num2==19)
- zhengzhuang=0;
- if(num2==13)
- zhengzhuang=1;
- if(num2==9)
- fanzhuang=0;
- if(num2==3)
- fanzhuang=1;
- }
- TR0=0;
- zhengzhuang=1;
- fanzhuang=1;
- paishuifa=0;
- while(1)
- {
- if(shuiwei0==0)
- delay_xms(10);
- if(shuiwei0==0)
- {
- P0=0xbf;
- wei1=0;
- wei2=0;
- wei3=0;
- wei4=0;
- tuoshui=0;
- delay_min(1);
- tuoshui=1;
- paishuifa=1;
- P0=0;
- delay_s(2);
- zhishiled=1;
- break;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整的Word格式文檔51黑下載地址:
http://www.zg4o1577.cn/bbs/dpj-122928-1.html
|