一.課程設計題目 基于51單片機的三層電梯控制 二.課程設計的目的 1學習P口的使用方法 2掌握如何利用單片機控制LED動態顯示 3掌握動態掃描顯示的基本原理,動態顯示的控制電路及控制程序 4掌握微機控制系統的鍵盤組成及工作原理 5認識微機控制系統的鍵盤設計,了解單片機鍵盤的特點和應用 三.設計要求 設計一個自動電梯模擬升降控制系統,通過乘客的自行按鍵達到電梯的升降功能。結合硬件與軟件對應。端口P0.0-0.6用來控制LED燈的亮與滅,其中從低位到高位分別為一層燈,二層燈,三層燈(前述三個信號為電梯內請求信號,乘客在電梯內部方可置為有效),一層上燈,二層上燈,二層下燈,三層下燈(上述四個信號為電梯外部信號,乘客在電梯外部方可置為有效)P2口與鍵盤對應連接,數碼管采用串行輸入方式,鍵盤從低位到高位分別為一層按鍵,二層按鍵,三層按鍵,一層上升按鍵,二層上升按鍵,二層下降按鍵,三層下降按鍵.P1.0與數碼管的時鐘輸入端相連,P1.1與數碼管的串行口相連,用來顯示電梯的上升下降和當前所在樓層,電梯門是否開啟三種狀態,p表示上升,d表示下降,1,2,3表示當前樓層,如果數碼管閃爍,表示電梯門開啟,反之則關斷。 四.控制系統的總體設計方案 微型計算機的出現使計算機在邏輯處理和工業控制等方面的非凡能力得到了更好的體現。尤其是其非凡的嵌入能力對于滿足嵌入式應用需求具有獨特的優勢。 隨著城市建設的不斷發展,樓群建筑不斷增多,電梯在當今社會的生活中有著廣泛的應用。電梯作為樓群建筑中垂直運行的交通工具已與人們的日常生活密不可分。 實際上電梯是根據外部呼叫信號(呼梯信號)以及自身控制規律等運行的,而呼叫是隨機的,電梯實際上是一個人機交互式的控制系統,單純用順序控制或邏輯控制 是不能滿足控制要求的,因此,大部分電梯控制系統都采用隨機邏輯方式控制。 在目前廣泛使用的電梯控制系統中,絕大多數為繼電器控制型,所有的邏輯及控制關系完全由諸多繼電器互相配合來完成,該控制系統的缺點是:(1)隨著樓層的 增高,使用繼電器的數量越來越多,造價和體積也越來越大;(2)繼電器這種觸點式的電控元器件不宜長時間頻繁工作,因而采用在電梯系統當中常發生觸電表面 燒結、控制失靈的故障。 因此我們設計一個3層自動電梯模擬升降控制系統,通過乘客的自行按鍵達到升降功能。采用單片機作為控制核心進行仿真。 本次設計是應用AT89C51芯片進行設計制作的模擬電梯控制系統,通過乘客的按鍵達到對電梯升降的控制,并且模擬電梯的運行狀態。 在設計方案中,通過對各個P口的合理安排和統一協調,通過按鍵、和LED數碼管來實現對設計設計方案的仿真演示。另外在實驗程序中通過對不同按鍵鍵碼在功能上的分配,在按鍵按下之后使CPU做相應的工作,即LED數碼管顯示與之相應的樓層和使彩燈顯示相應的電梯狀態。最后,結合PCB板的實際接線情況進行編程。使實驗順利仿真。 五.控制系統的硬件系統設計 5.1.AT89C51單片機介紹 微型計算機系統的硬件部分通常由五部分組成:中央處理器CPU 、數據存儲器RAM、程序存儲器ROM、定時/計數器、I/O接口。 MCS-51單片機內部的總體硬件結構: 1、中央處理單元CPU(8位) 用于數據處理、位操作(位測試、置位、復位)。 2、只讀存儲器ROM(4KB或8KB) 用于永久性存儲應用程序,掩膜ROM、EPROM、EEPROM。 3、隨機存取存取器RAM(128B 或256B) 用于程序運行中存儲工作變量和數據。 4、并行輸入/輸出口 I / O(32線) 4個8位并行I/O口P0、P1、P2、P3口用作系統總線、擴展外存、I / O接口芯片。 5、串行輸入/輸出口 UART (二線) 1個全雙工的異步串行口;用于串行通信。 6、定時/計數器 T(16位增量可編程) 2 個或三個16位定時器/計數器;它與CPU之間各自獨立工作,當它計數滿時向CPU中斷。 7、時鐘電路 fosc 振蕩頻率fosc在1.2~12Mhz; 分為內部振蕩器、外接振蕩電路。 8、中斷系統 5源中斷、 2個中斷優先級; ,可編程進行控制。 5.2.硬件系統原理框圖 
七. 軟硬件調試 系統調試包括硬件調試和軟件調試,而且兩者是密不可分的。我們設計好的硬件電路和軟件程序,只有經過聯合調試,才能驗證其正確性;軟硬件的是否達到設計任務的要求,也只有經過調試,才能發現問題并加以解決、完善,最終實現設計目的。 7.1 硬件調試 硬件調試僅這里作比較簡單的介紹,不必費太多的心思。 7.2 軟件調試 軟件調試一般包括分塊調試和聯機調試兩個階段。程序的分塊調試一般在單片機開發裝置上進行,可根據所調程序功能塊的入口參量初值編制一個特殊的程序段,并連同被調程序功能塊一起在開發裝置上運行;也可配合對應硬件電路單獨運行某程序功能塊,然后檢查是否正確,如果執行結果與預想的不一致,可以通過單步運行或設置斷點的方法,查出原因并加以改正,直到運行結果正確為止。這時該 程序功能塊已調試完畢,可去掉附加程序段。其它程序功能塊可按此法進行調試。程序聯機調試就是將已調試好的各程序功能塊按總體結構聯成一個完整程序,在所研制的硬件電路上運行。從而試驗程序整體運行的完整性、正確性和與硬件電路的配合情況。軟件調試主要在電腦上進行仿真模擬。先全部編譯文件,觀察是否有錯誤和警告,在確定沒有錯誤和警告的情況下,點擊DEBUG。進去仿真階段。本次的實驗難度系數其實并不大,關鍵是要看各部分負責的同學的協助與互動,當然這也與老師的細心教導是分不開的。 除此之外,對系統軟件的熟悉和對程序編寫的熟練程度也很大意義上起到了加快實驗速度,減少差錯,減輕工作量的作用。 對于這些過程與步驟的熟悉與了解能很好的幫助我們解決在實際應用當中碰到的諸多問題,比如說在程序當中設計到延時,但是具體延時的時間,我們要從幾個方面考慮,最后調試了很多次,試驗了很多次的時間參數,最后才找到了一個比較合適的延時參數。除了認為的設定他的數值以外,我們還要熟悉和掌握芯片的自身功能,也就是它的運算速度。只要知道了運算速度,那么大致上的時間就可以根據計算認為得到。 還有在關于程序先后運行順序的設置上也很有講究。如果安排不好程序執行的步驟,將會造成電梯門沒關便開始上升下降或者LED動態顯示暫時熄滅不顯示等由于程序執行順序所導致的問題。所以,合理的安排步驟,并且配合這塊芯片本身的功能,可以發揮出事半功倍的效果。 但是在調試過程中還是出現了一些問題比如延時程序設定時間太短,數組定義錯誤,引腳對應錯誤等等 我認為對于我們這些初學者來說,出現這種錯誤也是在情理之中的,關鍵的問題是如何解決這些問題,我們通過同組同學的討論和向外組同學和老師的請教,經過了一次一次的調試,修改,歷經整整2天的時間完成了程序,我們組員表示在這次的設計當中學到了很多,下次我們會珍惜這機會的。
八.實驗小結
一周的課程設計馬上就要結束了,對于這周的課程設計大體也有了不少自己的學習經驗和對于這課程設計的心得,我們這小組做的是電梯升降序控制器,以下便是我的對其簡單的小結: 1.由于我們小組在之前有了明確的分工所以整體來說我們小組進程還是比較順利的,在編程序方面在以xx同學為主力在第一天我們將其大致完成了,在電路圖方面我們小組由xx利用了Poteus軟件制作,雖然在之前我們并沒有學過這個軟件的使用方法,但經過一天的自我學習,我們最終還是按要求完成了制圖。 2.第二天由于程序的基本成型,并在電路板上進行了實踐的操作,流程圖這一塊便有我來制作了,由于我們的程序比較大應用的模塊比較多說以,制作流程圖還是花了我不少的時間。 3.第三天我們將寫好的程序燒進了單片機,并給老師看過之后,老師指導我們修改了部分細節后,我們便開始制作最后的收尾工作,xx同學將最后的圖紙完善,xxx,xxx同學進行最后的實驗排版,我對流程圖按照修改后的程序進行了最后的修正。 4.當然在最終的結果中還是存在些不足,但總的來說,我們這次收獲了更多。在與同學和老師的交流中,我們再次系統的復習了專業知識,對專業知識掌握和運用更加熟練。此次課程設計,我們收獲的不只是將其完成,更多的是再次把知識學習鞏固了一遍。在這次設計的學習中,我們得到了不少啟示,相信在以后的學習生活上也會給予我們很多的幫助。
九.心得體會
大三的第二學期末的第一門課程設計馬上就要結束了,整體來說這周時間并不十分緊張,我們有了充分的時間去學習課程設計所需要的其他軟件的應用,總體來說我們還是收獲頗豐,我做的是單片機的流程圖,平時一般的流程圖都是老師給了參考的流程,而且在制作報告的時候還是手寫的,現在這一切都是自己操作,第一天剛開始的時候有點手足無措的感覺,突然發現原來實際與想法還是會有一定的差距的,比如有一次流程圖的橫向很寬,一頁紙完全放不下,但是相對長度卻綽綽有余,但將頁面橫置卻花了很長時間。這次課程設計從選題到定稿,從理論到實踐,在接近一個星期的日子里,可以說是苦多于甜,但是學到了很多很多的東西,同時不僅可以鞏固以前所學過的知識,而且還學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實踐相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論。在設計的過程中遇到問題,可以說是困難重重,這畢竟是第一次做的,難免會遇到各種各樣的問題,同時在設計的過程中發現了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固,比如說不懂一些元器件的使用方法,對單片機匯編語言掌握得不好等等。通過這次課程設計之后,也把之前所學過的知識重新溫故了。
總的來說這次的課程設計還算滿成功的,收獲也很豐富的,因此在最后我要感謝跟我同組的同學,是大家的努力換來的今天的結果,同時也要感謝老師對我們的指導。
單片機源程序如下:
- #include<reg51.h>
-
- void Zero();
- void Delay_ms(unsigned int Time);
- void Display(unsigned int n,unsigned char a);
- void Flash(unsigned int Time);
- void KBScan();
- void dl_ms();
- void Destination();
- void Up();
- void Down();
-
- unsigned char code TAB[3][8]={{0,0,0,0,0,1,1,0},{0,1,0,1,1,0,1,1},{0,1,0,0,1,1,1,1}};/*樓層數碼管顯示矩陣*/
- //P2與查詢式鍵盤硬件相連
- sbit P2_0=P2^0;
- sbit P2_1=P2^1;
- sbit P2_2=P2^2;
- sbit P2_3=P2^3;
- sbit P2_4=P2^4;
- sbit P2_5=P2^5;
- sbit P2_6=P2^6;
- sbit P2_7=P2^7;
- //P0與LED燈硬件相連
- sbit P0_0=P0^0;
- sbit P0_1=P0^1;
- sbit P0_2=P0^2;
- sbit P0_3=P0^3;
- sbit P0_4=P0^4;
- sbit P0_5=P0^5;
- sbit P0_6=P0^6;
- sbit P0_7=P0^7;
-
- sbit P1_0 = P1^0; /*用于產生時鐘信號*/
- sbit P1_1 = P1^1; /*用于產生串行輸入信號(顯示or清零)*/
-
- unsigned int lift=1; /*電梯所在樓層*/
- unsigned int status=1; /*電梯上行為1,下行為0*/
- unsigned char request[3]={0,0,0}; /*1~3樓有無請求,有請求為1*/
- unsigned char dst=1; /*電梯的目的樓層*/
-
- //清零程序
- void Zero()
- {
- unsigned char k;
- P1_1=0;
- P1_0=0;
- for(k=0;k<40;k++)
- {
- dl_ms();
- P1_0=1;
- dl_ms();
- P1_0=0;
- }
- }
-
- //延時程序,以毫秒為單位,用軟件計時,輸入的參數
- void Delay_ms(unsigned int Time)
- {
- unsigned int i=0,j=0;
- for(i=0;i<Time;++i)
- {
- KBScan();
- for(j=0;j<125;++j);
- }
- }
-
- //顯示某一樓層
- void Display(unsigned int n,unsigned char a)
- {
- unsigned char k;
- unsigned char b[]={0,0,0,0,0,0,0,0};
- if(a==1)
- {
- b[7]=1;b[6]=1;b[5]=0;b[4]=0;b[3]=1;b[2]=1;b[1]=1;b[0]=0;
- }
- else if(a==0)
- {
- b[7]=0;b[6]=1;b[5]=1;b[4]=1;b[3]=1;b[2]=0;b[1]=1;b[0]=0;
- }
- Zero();
- P1_0=0;
- for(k=0;k<8;k++)
- {
- KBScan();
- P1_1=b[k];
- dl_ms();
- P1_0=1;
- dl_ms();
- P1_0=0;
- }
- P1_0=0;
- for(k=0;k<8;k++)
- {
- KBScan();
- P1_1=TAB[n-1][k];
- dl_ms();
- P1_0=1;
- dl_ms();
- P1_0=0;
- }
- }
-
- //閃爍顯示到達樓層
- void Flash(unsigned int Time)
- {
- unsigned char i;
- for(i=0;i<Time;i++)
- {
- Zero();
- Delay_ms(1000);
- KBScan();
- Display(lift,status);
- Delay_ms(1000);
- KBScan();
- }
- Zero();
- Delay_ms(1000);
- KBScan();
- }
-
- //查詢式鍵盤掃描
- void KBScan()
- {
- if(P2!=0xff)
- {
- dl_ms();
- if(P2!=0xff)
- {
- switch(P2)
- {
- case 0xfe: {P0_0=1;request[0]=1;break;} /*電梯內請求1樓*/
- case 0xfd: {P0_1=1;request[1]=1;break;} /*電梯內請求2樓*/
- case 0xfb: {P0_2=1;request[2]=1;break;} /*電梯內請求3樓*/
- case 0xf7: {P0_3=1;request[0]=1;break;} /*電梯外1樓請求向上*/
- case 0xef: {P0_4=1;request[1]=1;break;} /*電梯外2樓請求向上*/
- case 0xdf: {P0_5=1;request[1]=1;break;} /*電梯外2樓請求向下*/
- case 0xbf: {P0_6=1;request[2]=1;break;} /*電梯內3樓請求向下*/
- default: {break;} /*錯誤請求*/
- }
- }
- }
- }
- //消抖延時
- void dl_ms()
- {
- unsigned char i;
- for(i=0;i<30;++i);
- }
-
- //獲取目的樓層
- void Destination()
- {
- unsigned char j; //j循環控制變量
- KBScan(); //有鍵按下
- if(status==1) //若電梯向上走則從高樓層到低樓層掃描
- { //以此達到判斷優先級的目的
- for(j=3;j>=1;--j)
- {
- if(request[j-1]==1)
- {
- dst=j; //則將目的樓層設為該樓
- break; //并將其對應的request置1,然后跳出
- }
- }
- }
- else if(status==0) //若電梯向下走則從低樓層到高樓層掃描
- { //以此達到判斷優先級的目的
- for(j=1;j<=3;++j)
- {
- if(request[j-1]==1)
- {
- dst=j;
- break;
- }
- }
- }
- }
-
- //電梯向上走
- void Up()
- {
- status=1; //置1表示電梯向上走
- for(;lift<=dst;lift++) //電梯到達目的樓層之前往上走
- {
- Display(lift,1); //每到達一樓就顯示該樓層數
- KBScan();
- Destination(); //讀取點陣鍵盤
- if(request[lift-1]==1) //若請求到達的樓層在所在樓層和目的樓層之間則停下閃爍顯示并將其對應的request清零
- {
- Delay_ms(3000);
- if(P0_5==1&&lift==2);
- else
- {
- request[lift-1]=0;
- }
- switch(lift)
- {
- case 1:{P0_0=0;P0_3=0;break;}
- case 2:{P0_1=0;P0_4=0;break;}
- case 3:{P0_2=0;P0_6=0;break;}
- default:{break;}
- }
- Flash(3);
- Delay_ms(800);
- }
- else
- {
- Delay_ms(3000);
- }
- }
- lift--;
- }
-
- //電梯向下走
- void Down()
- {
- status=0; //置1表示電梯向上走
- for(;lift>=dst;lift--) //電梯到達目的樓層之前往上走
- {
- Display(lift,0); //每到達一樓就顯示該樓層數
- KBScan();
- Destination(); //讀取點陣鍵盤
- if(request[lift-1]==1) //若請求到達的樓層在所在樓層和目的樓層之間則停下閃爍顯示并將其對應的request清零
- {
- Delay_ms(3000);
- if(P0_4==1&&lift==2);
- else
- {
- request[lift-1]=0;
- }
- switch(lift)
- {
- case 1:{P0_0=0;P0_3=0;break;}
- case 2:{P0_1=0;P0_5=0;break;}
- case 3:{P0_2=0;P0_6=0;break;}
- default:{break;}
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
基于c51單片機的三層電梯控制.doc
(50.13 KB, 下載次數: 89)
2018-12-5 22:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|