《基于單片機的洗衣機設計》由會員分享,可在線閱讀,更多相關《基于單片機的洗衣機設計(19頁珍藏版)》請在裝配圖網上搜索。
單片機原理及系統(tǒng)課程設計報告
單片機原理及系統(tǒng)課程設計
評語:
考勤10分
守紀10分
過程30分
設計報告30分
答辯20分
總成績(100分)
專 業(yè): 自動控制
班 級:
姓 名:
學 號:
指導教師:
蘭州交通大學自動化與電氣工程學院
2014 年 1 月 12 日
基于AT89C51單片機的全自動洗衣機設計
1 設計目的及要求
1.1設計目的
洗衣機已成為人們日常生活中必不可少的一部分,但是傳統(tǒng)的基于繼電器的控制,已不能滿足人們對洗衣機的要求。因此設計了基于單片機的洗衣機控制電路系統(tǒng),由單片機控制實現洗衣機的各項功能。單片機的體積小,控制功能靈活,因此,設計出基于單片機的全自動洗衣機控制電路系統(tǒng)具有很強的實用性。由于個人能力有限,所設計的洗衣機比前沿科技產品要差很遠。所以這次課程設計的主要目的在于通過親手操作,查找資料,培養(yǎng)自己的分析設計能力,把這學期課程中零散的知識進行整合,將理論的知識聯(lián)系到實際的生活中,在實例中深入理解一些理論知識,并從中有所收獲。
1.2設計要求
模擬全自動洗衣機工作過程。以電機替代洗衣機電機。顯示洗衣機工作的狀態(tài)(進水、浸泡、洗衣、脫水、結束)。顯示工作剩余時間(洗衣程序可自定義,時間精度:秒)。洗衣時交替正、反轉。
2 設計方案及原理
2.1設計方案
利用AT89C51單片機的P0,P1,P2,P3串行口的輸入輸出功能,控制數碼管、電動機、發(fā)光二極管的工作狀態(tài),進而模擬洗衣機的基本工作過程。
洗衣機的主要工作過程是:進水—洗滌—漂洗—換水—漂洗—換水—漂洗—換水—脫水—結束。上述工作過程中,包含三個過程:洗滌過程、漂洗過程、脫水過程。
(1) 洗滌過程:放好待洗物,啟動開關,進水閥通電,向洗衣機供水,供水結束后,洗滌電動機接通電源,通過電機不停的正轉、反轉,形成洗滌水對洗滌物產生強烈的翻滾作用;同時衣物之間、衣物與四周桶壁之間產生互相摩擦和撞擊力,達到洗滌衣物的目的。
(2) 漂洗過程:漂洗的目的在于清除衣物上的洗滌液,因此,漂洗過程與洗滌過程的電機動作是完全相同的。
(3) 脫水過程:漂洗過程結束后,電動機停止轉動,排水閥通電,打開排水閥門排水。當排水到一定程度,滿足安全條件時,脫水電動機接通,電機帶動脫水桶高速旋轉,利用離心力把衣服上的水從桶壁的小眼里甩出。
全部洗衣工作完成后,結束指示的LED燈點亮,表示衣物已經洗好,洗衣機就會自動停止工作。
2.2 設計原理
系統(tǒng)設計包括晶振和復位模塊,電機驅動模塊,LED顯示模塊,按鍵控制模塊以及數碼管顯示模塊五部分。利用AT89C51單片機芯片,芯片左排引腳外接晶振和復位電路,通過74LS245鎖存器連接至數碼管,控制數碼管穩(wěn)定顯示。右排引腳外接電機驅動電路和各開關以及LED燈。通過人工按壓相應的開關,接通電機驅動電路相應的接線端子,實現電機正反轉以及LED顯示??傮w設計原理框圖如圖1所示。
圖1 系統(tǒng)原理框圖
通過對開關的操作實現選擇想要進行的任何操作。當選擇好模式后進入該模式。該模式的參數已裝入在單片機中,在單片機中程序的控制下進行工作。
程序實現的主要功能是洗滌,漂洗和脫水的控制。其中洗滌時間設初值為136s,由于洗衣過程中電機要不停的正反轉,所以用P3.2和P3.3控制。通過流經電機兩端電平的高低控制電流的流向,從而改變電機的轉向,實現正反轉。漂洗過程和洗滌過程較為相似,由于漂洗要多次進行,所以用進水次數標志位flag1控制,當flag1為2,3,4時為漂洗過程。脫水過程是在出水次數flag2的控制下進行。當flag2為4時脫水,當脫水時間到達0后,脫水結束,洗衣結束。上述三個過程中電機工作利用晶體管組成的驅動電路進行驅動。
3 硬件設計
3.1主要元器件
在本設計中主要使用了以下元器件:AT89C51單片機芯片、74LS245芯片 、晶體振蕩器、數碼管、發(fā)光二極管、直流電動機、三極管。
3.2 硬件連接圖
該設計主要應用80C51單片機,外接一些必要的擴展電路,構成系統(tǒng)電路原理圖,如圖2所示。
圖2 硬件連接圖
3.3 系統(tǒng)設計原理
該設計采用模塊化的方法,系統(tǒng)原理圖分為五個模塊,分別為晶振和復位模塊,電機驅動模塊,LED顯示模塊,按鍵控制模塊以及數碼管顯示模塊。
晶振和復位模塊主要通過51單片機的內部振蕩方式,產生原始的時鐘頻率。電機驅動模塊主要包含電阻、三極管放大器和一個電機,通過與51單片機的P3.0-P3.3引腳連接,用于驅動相應的洗衣、漂洗和脫水程序。LED顯示模塊主要通過與51單片機的P0口8個引腳連接,當按下相應按鍵時,對應的LED指示燈點亮,實現對洗衣機控制過程的指示。按鍵控制模塊,其連接于P3口部分引腳上,實現對洗衣過程的選擇及控制。數碼管顯示模塊,其直接與單片機的P2口相連。
4 軟件設計
4.1 主程序流程圖
按下K1鍵,洗衣機進入待命狀態(tài);當按下K2鍵后,洗衣機才進入工作狀態(tài)。其主程序及流程圖見附錄2.1。
4.2 洗滌過程流程圖
電機正反轉均為15s,程序及流程圖見附錄2.2。
4.3 漂洗過程流程圖
漂洗前先打開排水閥排水5s。然后啟動電動機漂洗,一次漂洗結束后,接著判斷漂洗次數即flag3的值,若flag3 為3則漂洗結束,若flag3不為3,則再次執(zhí)行漂洗操作,進入下一循環(huán)。程序及流程圖見附錄2.3。
5 系統(tǒng)仿真及實際調試
系統(tǒng)仿真結果圖如圖3所示。
圖3 系統(tǒng)仿真結果圖
6 總結
經過一個學期的時間完成了基于單片機的洗衣機控制系統(tǒng)的設計,本系統(tǒng)是基于單片機及其接口技術、計算機技術、微電子技術綜合應用的設計。實現了對洗衣機整個洗衣過程的控制包括用戶參數輸入、洗衣、脫水和結束演奏四個階段??刂葡到y(tǒng)主要由電源電路、控制電路兩大模塊構成。電源電路為控制電路提供穩(wěn)定的5V直流電壓,為電動機提供電;控制電路負責控制洗衣機的工作過程,主要由AT89C51單片機、四位共陽數碼管、按鍵、LED指示燈、電動機、進水排水電磁閥組成。在系統(tǒng)設計中查閱了大量相關的中文和外文資料以及各芯片的廠家技術資料手冊借鑒了很多前人成熟的經驗。
對于以上之粗淺體會進一步的總結和提高,需要有更多的社會實踐來提供,我也相信在不久的將來踏入社會,類似這樣的設計絕不在少數,只要我們努力學習、勇于實踐、勤學好問我們就會懂得以前不明白或不懂的道理,就會很快地成長和成熟起來。我也相信憑著我自強不息勇于拼搏的精神一定能夠很快的適應類似設計的需要,適應這個多變的社會,充分發(fā)揮長處朝我們的方向不斷前進前進再前進!
參考文獻
[1] 王思明,張金敏,茍軍年等 單片機原理及應用系統(tǒng)設計[M] 科學出版社 2012:176-189
[2] 譚浩強 C程序設計(第四版) [M] 清華大學出版社 2010:36-60
附錄
附錄一
源程序
#include
#define uchar unsigned char
#define uint unsigned int
//***************************//
sbit mo_r=P3^2; //電機右控制線
sbit mo_l=P3^3; //電機左控制線
//****************************//
sbit key_menu=P3^4; // 菜單按鍵
sbit key_on=P3^5; // 開始按鍵
sbit key_off=P3^6; // 結束按鍵
sbit key_se=P3^7; // 菜單選擇按鍵
//***************************//
sbit led_in=P0^0; // 進水指示燈
sbit led_xi=P0^1; // 洗衣指示燈
sbit led_pao=P0^2; // 泡洗指示燈
sbit led_xx=P0^3; // 脫水指示燈
sbit led_out=P0^4; // 出水指示燈
sbit led_over=P0^5; // 洗衣結束指示燈
sbit led_work=P0^6; // 電機工作指示燈
sbit other=P3^1; // 脫水電源控制開關
sbit anther=P3^0; // 洗衣電源控制開關
//******************************//
uchar code num[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//*****************************//
char sec=0; // 時間秒
char min=0; // 時間分
uchar count=0; // 中斷計數
uchar flag0=0; // 洗衣機工作狀態(tài)標志
uchar flag1=0; // 進水次數標志
uchar flag2=0; // 出水次數標志
uchar flag3=0; // 泡洗次數標志
uchar quan=0; // 正反轉計數
//**********************************//
void delay(); // 延時函數
void in(); // 進水子程序
void out(); // 出水子程序
void over(); // 結束子程序
void xi(); // 洗衣子程序
void pao(); // 泡衣子程序
void xx(); // 脫水子程序
void on(); // 工作on處理子程序
void se(); // 顯示菜單選擇
void SEG_display(); // 顯示時間子程序
void key_scan(); // 按鍵掃描子程序
void delay(uint i)
{
uint x,y;
for(x=i;x>0;x--)
for(y=120;y>0;y--);
}
// 工作on處理子程序
//********************************//
void on()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
P0 = 0xff;
if(flag0==0)
in();
if(flag0==1)
xi();
if(flag0==2)
pao();
if(flag0==3)
xx();
if(flag0==4)
out();
}
// 結束子程序
//*********************************//
void over()
{ other=0;
anther=0;
P0=0xff;
mo_r=0;
mo_l=0;
led_over=0;
EA=0;
}
// 進水子程序
//*********************************//
void in()
{ anther=0;
other=0;
P0=0xff;
led_in=0;
flag1++;
mo_r=0;
mo_l=0;
min=0;
sec=8;
}
// 洗衣子程序
//*********************************//
void xi()
{ anther=1;
other=0;
P0=0xff;
led_work=0;
led_xi=0;
mo_r=1;
mo_l=0;
min=1;
sec=36;
quan=0;
}
// 泡衣子程序
//*********************************//
void pao()
{
anther=1;
other=0;
P0=0xff;
led_pao=0;
led_work=0;
flag3++;
mo_r=1;
mo_l=0;
min=1;
sec=35;
quan=0;
}
// 脫水子程序
//*********************************//
void xx()
{ other=1;
anther=0;
P0=0xff;
led_xx=0;
mo_r=0;
mo_l=1;
min=0;
sec=50;
}
// 出水子程序
//*********************************//
void out()
{ anther=0;
other=0;
P0=0xff;
led_out=0;
flag2++;
mo_r=0;
mo_l=0;
min=0;
sec=5;
}
// 顯示菜單選擇
//*********************************//
void se()
{
P0=0xff;
if(flag0 >= 5)
flag0=0;
if(flag0==0)
{
led_in=0;
}
if(flag0==1)
{
led_xi=0;
}
if(flag0==2)
{
led_pao=0;
}
if(flag0==3)
{
led_xx=0;
}
if(flag0==4)
{
led_out=0;
}
}
// 菜單處理子程序
//**********************************//
void menu()
{
min=0;
sec=0;
mo_r=0;
mo_l=0;
SEG_display();
while(1)
{
if(key_on==0)
{
delay(5);
if(key_on==0)
{
while(!key_on);
on();
break;
}
}
//**************************//
if(key_off==0)
{
delay(5);
if(key_off==0)
{
while(!key_off);
over();
break;
}
}
//****************************//
if(key_se==0)
{
delay(5);
if(key_se==0)
{
while(!key_se);
flag0++;
se();
}
}
}
}
// 按鍵掃描子程序
//*********************************//
void key_scan()
{
if(key_menu==0)
{
delay(5);
if(key_menu==0)
{
while(!key_menu);
menu();
}
}
//********************************//
if(key_on==0)
{
delay(5);
if(key_on==0)
{
while(!key_on);
on();
}
}
//*********************************//
if(key_off==0)
{
delay(5);
if(key_off==0)
{
while(!key_off);
over();
}
}
}
// 顯示子程序
//*********************************//
void SEG_display()
{
P1=0x01;
P2=num[min/10];
delay(10);
P1=0x02;
P2=num[min%10];
delay(10);
P1=0x04;
P2=num[sec/10];
delay(10);
P1=0x08;
P2=num[sec%10];
delay(10);
}
// 主函數
//*********************************//
void main()
{
led_in=0;
anther=0;
other=0;
while(1)
{
SEG_display();
key_scan();
}
}
// 定時器0中斷處理程序
//**********************************//
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
sec--;
if((flag0==1)||(flag0==2))
{
quan++;
switch(quan)
{
case 1:mo_r=1;mo_l=0;break;
case 10:mo_r=0;mo_l=0;break;
case 15:mo_r=0;mo_l=1;break;
case 25:mo_r=0;mo_l=0;break;
default:;
}
if(quan==30)
{
quan=0;
}
}
//**********************************//
if((sec==0)&&(min != 0))
{
min--;
sec=59;
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==0)) //進水結束
{
switch(flag1)
{
case 1:flag0=1;xi();break;
case 2:flag0=2;pao();break;
case 3:flag0=2;pao();break;
case 4:flag0=2;pao();break;
}
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==1)) //洗衣結束
{
flag0=4;
out();
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==2)) //泡衣結束
{
switch(flag3)
{
case 1:flag0=4;out();break;
case 2:flag0=4;out();break;
case 3:flag0=4;out();break;
}
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==4)) //出水結束
{
switch(flag2)
{
case 1:flag0=0;in();break;
case 2:flag0=0;in();break;
case 3:flag0=0;in();break;
case 4:flag0=3;xx();break;
}
}
//***********************************//
if((sec<0)&&(min==0)&&(flag0==3))
{ sec=0;
over();
}
}
}
附錄2
附錄2.1主程序
void main()
{
led_in=0;
anther=0;
other=0;
while(1)
{
SEG_display();
key_scan();
}
}
// 定時器0中斷處理程序
//**********************************//
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
sec--;
if((flag0==1)||(flag0==2))
{
quan++;
switch(quan)
{
case 1:mo_r=1;mo_l=0;break;
case 10:mo_r=0;mo_l=0;break;
case 15:mo_r=0;mo_l=1;break;
case 25:mo_r=0;mo_l=0;break;
default:;
}
if(quan==30)
{
quan=0;
}
}
//**********************************//
if((sec==0)&&(min != 0))
{
min--;
sec=59;
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==0)) //進水結束
{
switch(flag1)
{
case 1:flag0=1;xi();break;
case 2:flag0=2;pao();break;
case 3:flag0=2;pao();break;
case 4:flag0=2;pao();break;
}
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==1)) //洗衣結束
{
flag0=4;
out();
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==2)) //泡衣結束
{
switch(flag3)
{
case 1:flag0=4;out();break;
case 2:flag0=4;out();break;
case 3:flag0=4;out();break;
}
}
//**********************************//
if((sec<0)&&(min==0)&&(flag0==4)) //出水結束
{
switch(flag2)
{
case 1:flag0=0;in();break;
case 2:flag0=0;in();break;
case 3:flag0=0;in();break;
case 4:flag0=3;xx();break;
}
}
//***********************************//
if((sec<0)&&(min==0)&&(flag0==3))
{ sec=0;
over();
}
}
}
附錄圖2.1 主程序流程圖
2.2洗滌過程程序
void xi()
{ anther=1;
other=0;
P0=0xff;
led_work=0;
led_xi=0;
mo_r=1;
mo_l=0;
min=0;
sec=30;
quan=0;
}
附錄圖2.2 洗滌程序流程圖
2.3 漂洗子程序
void pao()
{
anther=1;
other=0;
P0=0xff;
led_pao=0;
led_work=0;
flag3++;
mo_r=1;
mo_l=0;
min=0;
sec=10;
quan=0;
}
附錄圖2.3 漂洗程序流程圖
18
鏈接地址:http://appdesigncorp.com/p-10048540.html