設計原理及單元模塊
3.1設計原理及方法根據層次化設計理論,該設計問題自頂向下  可分為單片機最小系統模塊、顯示模塊、開關控制模塊、電機驅動模塊、報警模塊,其系統框圖如圖所示。
圖3.1 電梯控制系統框圖 本次設計是采用開關控制實現上下到指定樓層,通過電機轉動帶動電梯箱上下運動,到達指定樓層。顯示模塊是顯示此時的樓層,報警模塊具有錯誤操作報警以及樓層到達的提示功能。 3.2單元模塊設計
3.2.1單片機最小系統模塊圖3.2.1單片機最小系統 單片機最小系統包括主芯片,復位電路和晶振脈沖產生電路。X1為12MHz晶振,與30Pf電容并聯,產生1us的脈沖信號作為單片機的“心臟”部分。復位電路是開關與10uf電容并聯組成的上電自動復位電路,在RST端為高電平時單片機清零,也即開關按下會產生清零信號。RP1為排阻,作為P0端的上拉電阻,接此原因是P0端口是由OC門組成。U1為數據輸入端口,通過電腦編程能將程序通過此接口燒錄入單片機中。 
3.2.2 開關控制模塊圖3.2.2 開關控制模塊 開關控制模塊采用4*4矩陣形式電路可以減少單片機接口的使用。寫鍵盤代碼時運用的是逐行掃描判斷鍵值按下與否。編程如下: uchar key_scan(void) { uchar scode,recode; P1=0xf0; if((P1&0xf0)!=0xf0) { delay1(2); if((P1&0xf0)!=0xf0)//有鍵按下 { scode=0xfe;//輔助變量,設定行 while((scode&0x10)!=0) { P1=scode;//將某一行設為0,從而判斷是否為該行 if((P1&0xf0)!=0xf0) { recode=P1&0xf0;//列碼 scode=scode&0xf0;//行碼 return(scode+recode);//按鍵坐標} else scode=(scode<<1)|0x01;//下一行判斷 }}} return 0;} 3.2.3電機驅動模塊圖3.2.3電機驅動模塊 電機驅動采用L297環形計數分配器和L298大功率步進電機驅動器完成。本次設計采用步進電機,目的是方便智能控制,可實現調速功能。電機使用的是二相步進電機,由于僅用來實驗,所以電機采用5V電源供電即可,實際中必須使用大電壓來供電方能帶動重物(人等)。 環形分配器L297引腳圖如圖3.2.3-1: 圖3.2.3-1 L97引腳圖 L297功能介紹: SYNC為斬波器輸出端,多個L297一起用時用此端口連接在一起共用一組時鐘振蕩; HPME端為集電極開路輸出端; A~D為四相輸入端; INIH1,INIH2為控制A~D相驅動,此引腳為低電平時A~D相禁止輸入; ENABLE端為使能輸入端,低電平阻止電機驅動; RESET為復位端; HALF/FULL為半角全角控制端,高電平時選擇半步輸入; CLOCK為時鐘輸入端,控制電機速度; CW/CCW為方向控制端; OSC為斬波器頻率輸入端; SEN1和SEN2為電流檢測端。 大功率步進電機驅動器L298引腳圖如圖3.2.3-2: 圖3.2.3-2 L298引腳圖 L298功能介紹: SENA和SENB為電流檢測端; IN1~IN4為A~D相輸入控制端; ENA和ENB為使能輸入端,低電平禁止輸入; OUT1~OUT4為輸出端。  3.2.4顯示模塊圖3.2.4顯示模塊 由于點陣和雙位數碼管耗電流較大,不能直接連接單片機IO口驅動其正常工作,所以加上鎖存器74HC573和顯示譯碼器CD4511驅動。其中利用CD4511模塊的另一作用是節省接口,因為本次設計外圍電路較多,單片機接口不夠,使用此驅動是必要的。 鎖存器74HC573引腳圖如圖3.2.4-1: 圖3.2.4-1 74HC573引腳圖 74HC573功能介紹: D0~D7為輸入端; Q0~Q7為輸出端; OEN為輸出使能端,當其輸入為高電平時輸出關斷,輸入為低電平時輸出正常; DEN為輸出輸入使能端,當此端口為高電平時,輸出跟隨D0~D7,當此端口為低電平時,輸出保持上一時刻的狀態; 顯示譯碼器CD4511引腳圖如圖3.2.4-2: 圖3.2.4-2 CD4511引腳圖 CD4511功能介紹: A~D為輸入端; QA~QG為輸出端; LT為試燈輸入端,當此端口為低電平時,無論其他的狀態如何,始終輸出數字8,作為判斷數碼管的好壞端口使用; LE/STB為滅燈輸入端,當此端口輸入低電平時數碼管滅,輸入高電平時數碼管正常顯示; BI為動態消零信號輸入端,當此端口輸入低電平時且LT為高電平時,當輸入0000時,輸出0熄;  點陣的使用介紹: 點陣是8*8位的,相當于由64個LED組成,8個陽極控制端口,8個陰極控制端口; 數碼管的使用介紹: 數碼管是采用兩位共陰極數碼管,通過對a~g的編碼來顯示數字。 3.2.5報警模塊圖3.2.5報警模塊 本設計采用8550三極管驅動蜂鳴器。當PO口送高電平時,三極管處于截止狀態,三極管Vce電壓約為VCC,蜂鳴器只有很少電流流過,沒法驅動其發聲。當PO口送低電平時,三極管處于飽和導通狀態,三極管Vce約為0.3V,蜂鳴器有較大電流流過,能驅動其報警發聲。 3.2.6電路總圖圖3.2.6 電路總圖 由于protel99se內部元件不齊全,本次設計全部采用手工繪制元件庫以達到訓練的最佳效果。
4軟件模塊
圖4 程序流程圖 注:詳細程序見附錄二 5 PCB印刷版圖模塊
5.1 protel99se功能介紹Protel99SE是應用于Windows9X/2000/NT操作系統下的EDA設計軟件,采用設計庫管理模式,可以進行聯網設計,具有很強的數據交換能力和開放性及3D模擬功能,是一個32位的設計軟件,可以完成電路原理圖設計,印制電路板設計和可編程邏輯器件設計等工作,可以設計32個信號層,16個電源--地層和16個機加工層。  5.2 PCB版圖圖5.2.1非鍍銅版圖 在生成PCB之前,要進行元件的封裝。由于protel99se內部封裝不齊全,本次設計全部采用手工繪制封裝庫以達到最佳訓練效果。PCB布線規則是盡量使正面走線和反面走線成90度角,以達到最小干擾。 圖5.2.2鍍銅頂層圖樣 圖5.2.3 鍍銅底層圖樣 圖5.3.4 3D版圖正面 圖5.3.5 3D版圖背面
附錄一元件清單  單片機源程序如下:
- #include"reg52.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar DZ1[]={0x08,0x14,0x2a,0x08,0x08,0x08};
- uchar DZ2[]={0xbf,0xdf,0xef,0xf7,0xfd,0xfb};
- uchar DZ3[]={0x08,0x08,0x08,0x2a,0x14,0x08};
- uchar shuma[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
- uchar LC[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xedb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//樓層編碼
- uchar key,dir,floor,zancun,s,x,p2;
- sbit DA=P0^0;
- sbit DB=P0^1;
- sbit DC=P0^2;
- sbit DD=P0^3;
- sbit w1=P0^4;//數碼管位選1
- sbit w2=P0^5;//數碼管位選2
- sbit wa=P0^6;//點陣陽極使能
- sbit wb=P0^7;//點陣陰極使能
- sbit EN=P3^0;//電機使能
- sbit CW=P3^1;//方向控制
- sbit CLOCK=P3^2;//速度控制
- sbit red=P3^3;//上鍵顯示
- sbit green=P3^4;//下鍵顯示
- sbit beep=P3^5;//報警
- void delay1(uchar z)
- {
- uchar i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void delay2(uchar z)
- {
- uchar i,j;
- for(i=z;i>0;i--)
- {
- if(key==0)//減短代碼運行時間,使用更多時間掃描鍵盤
- break;
- else
- for(j=110;j>0;j--);
- }
-
- }
- uchar key_scan(void)
- {
- uchar scode,recode;
- P1=0xf0;
- if((P1&0xf0)!=0xf0)
- {
- delay1(2);
- if((P1&0xf0)!=0xf0)//有鍵按下
- {
- scode=0xfe;//輔助變量,設定行
- while((scode&0x10)!=0)
- {
- P1=scode;//將某一行設為0,從而判斷是否為該行
- if((P1&0xf0)!=0xf0)
- {
- recode=P1&0xf0;//列碼
- scode=scode&0x0f;//行碼
- return(scode+recode);//按鍵坐標
- }
- else
- scode=(scode<<1)|0x01;//下一行判斷
- }
- }
- }
- return 0;
- }
- void display1(void)//上箭頭顯示
- {
- uchar i,j;
- for(i=0;i<1;i++)
- {
- wa=1;
- P2=DZ1[i];
- for(j=500;j>0;j--);
- wa=0;
- wb=1;
- P2=DZ2[i];
- for(j=500;j>0;j--);
- wb=0;
- }
- }
- void display2(void)//下箭頭顯示
- {
- uchar i,j;
- for(i=0;i<1;i++)
- {
- wa=1;
- P2=DZ3[i];
- for(j=500;j>0;j--);
- wa=0;
- wb=1;
- P2=DZ2[i];
- for(j=500;j>0;j--);
- wb=0;
- }
- }
- void shuxian(uchar z)//數碼管顯示
- {
- uchar temp;
- w1=0;
- p0=shuma[z/10];
- temp=P0;
- P0=p0|temp;
- w1=1;
- w2=0;
- p0=shuma[z%10];
- temp=P0;
- P0=p0|temp;
- w2=1;
- }
- void init(void)//初始化
- {
- dir=0;
- w1=1;
- w2=1;
- wa=0;
- wb=0;
- floor=0;
- zancun=1;
- beep=1;
- EN=0;
- EA=1;
- ET1=1;//T1中斷允許
- TMOD=0x10;//T1的8位計數
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- }
- void main(void)
- {
- init();
- while(1)
- {
- key=key_scan();
- if(key!=0)
- {
- delay2(10);
- if(key!=0)
- {
- TR1=1;
- switch(key)
- {
- case LC[14]:
- dir=1;//按鍵儲存上鍵值
- break;
- case LC[15]:
- dir=2;//按鍵儲存下鍵值
- break;
- default break;
- }
- if(dir==1)
- {
- shuxian(s);
- display1();
- if((zancun-floor)>=0)
- {
- switch(key)
- {
- case LC[0]:
- floor=1;
- break;
- case LC[1]:
- floor=2;
- break;
- case LC[2]:
- floor=3;
- break;
- case LC[3]:
- floor=4;
- break;
- case LC[4]:
- floor=5;
- break;
- case LC[5]:
- floor=6;
- break;
- case LC[6]:
- floor=7;
- break;
- case LC[7]:
- floor=8;
- break;
- case LC[8]:
- floor=9;
- break;
- case LC[9]:
- floor=10;
- break;
- case LC[10]:
- floor=11;
- break;
- case LC[11]:
- floor=12;
- break;
- case LC[12]:
- floor=13;
- break;
- case LC[13]:
- floor=14;
- break;
- }
- }
- else //不符邏輯報警停止電機轉動
- beep=0;
- EN=0;
- TR1=0;
- }
- if(dir==0)
- {
- shuxian(x);
- display2();
- if((zancun-floor)<=0)
- {
- switch(key)
- {
- case LC[0]:
- floor=1;
- break;
- case LC[1]:
- floor=2;
- break;
- case LC[2]:
- floor=3;
- break;
- case LC[3]:
- floor=4;
- break;
- case LC[4]:
- floor=5;
- break;
- case LC[5]:
- floor=6;
- break;
- case LC[6]:
- floor=7;
- break;
- case LC[7]:
- floor=8;
- break;
- case LC[8]:
- floor=9;
- break;
- case LC[9]:
- floor=10;
- break;
- case LC[10]:
- floor=11;
- break;
- case LC[11]:
- floor=12;
- break;
- case LC[12]:
- floor=13;
- break;
- case LC[13]:
- floor=14;
- break;
- }
- }
- else //不符邏輯報警停止電機轉動
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
以上的Word格式文檔51黑下載地址:
基于單片機電梯控制系統設計.doc
(1.38 MB, 下載次數: 55)
2021-4-3 15:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|