找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 37366|回復(fù): 46
打印 上一主題 下一主題
收起左側(cè)

單片機四層電梯控制系統(tǒng)設(shè)計最終版(含仿真+報告+程序源碼)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:370503 發(fā)表于 2018-7-12 21:26 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式




4層電梯單片機控制設(shè)計

在1901年的上海,美國奧的斯公司安裝了中國最早的一座電梯,而今,我國電梯業(yè)已進入了高速發(fā)展的時期,商場、醫(yī)院、賓館、倉庫、住宅大樓等地方的電梯都被廣泛應(yīng)用著,直接與人們的生活息息相關(guān),給人們的生活帶來了極大的便利,是一種必不可少的垂直運輸交通工具。

拋開一些復(fù)雜的概念,單片機在我們的生活中觸手可及,尤其是在智能儀表,實時控制,機電一體化,辦公機械,家用電器等方面擁有廣泛的應(yīng)用領(lǐng)域。這次課設(shè)注重對單片機的理解應(yīng)用,明白單片機的工作原理,掌握單片機的接口技術(shù),中斷技術(shù),存儲技術(shù),時鐘方式和控制方式,這樣才能更好地利用單片機來做有效的設(shè)計,提高自己的綜合能力。

1. 設(shè)計任務(wù)

結(jié)合實際情況,基于AT89C52單片機設(shè)計一個四層電梯單片機控制系統(tǒng)。該系統(tǒng)應(yīng)滿足的功能要求為:

4層電梯運行控制,轎內(nèi)外呼叫,運行狀態(tài)顯示。獨立鍵盤、LED顯示樓層、指示燈。

(1) 電梯運行控制系統(tǒng)為四層控制系統(tǒng)。

(2) 電梯能夠轎內(nèi)外呼叫,并顯示運行的狀態(tài)。

(3) 設(shè)計系統(tǒng)具有獨立鍵盤控制,并有LED顯示樓層與指示燈。

主要硬件設(shè)備:AT89C52單片機: AT89C52是一個低電壓,高性能CMOS 8位單片機,片內(nèi)含8k bytes的可反復(fù)擦寫的Flash只讀程序存儲器和256 bytes的隨機存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲單元,AT89C52單片機在電子行業(yè)中有著廣泛的應(yīng)用。

AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中斷口,3個16位可編程定時計數(shù)器,2個全雙工串行通信口,2 個讀寫口線,AT89C52可以按照常規(guī)方法進行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結(jié)合在一起,特別是可反復(fù)擦寫的Flash存儲器可有效地降低開發(fā)成本。

AT89C52有PDIP、PQFP/TQFP及PLCC等三種封裝形式,以適應(yīng)不同產(chǎn)品的需求。

2. 整體方案設(shè)計

本設(shè)計采用AT89C52單片機作為核心,配以適當(dāng)接口作為輸入輸出通道。采用三行按鍵矩陣開關(guān)電路作為外呼內(nèi)選呼叫控制。實際電梯控制系統(tǒng)每層裝有一個傳感器,從而判斷車廂所在位置,本模型由10個獨立按鍵作為樓層到達信號傳輸給單片機,而后通過內(nèi)部電路從串口驅(qū)動數(shù)碼管顯示樓層數(shù)。當(dāng)電梯到達所選層,電梯開門延時等待進人并選層,然后延時關(guān)門執(zhí)行請求,若無請求則停在本層等待請求。軟件部分使用C語言,利用查詢方式來檢測用戶請求的按鍵信息。

圖2-1 基于單片機的四層電梯控制總原理圖

本系統(tǒng)硬件主要由復(fù)位模塊、顯示系統(tǒng)、擴展部分、矩陣控制模塊幾部分組成。各模塊的主要功能如下:

(1) 復(fù)位的功能其一用于程序初始化,其二也用于擺脫互鎖和跑飛。

(2) 顯示系統(tǒng)的功能分為顯示led燈顯示觸發(fā)樓層數(shù)和數(shù)碼管顯示當(dāng)前樓層數(shù)的兩個部分,用于顯示電梯系統(tǒng)此時正在運行的狀態(tài)。

(3) 擴展部分:因為單片機芯片的接口有限,故使用8155擴展串行口用以連接更多功能。

(4) 矩陣控制模塊:即內(nèi)呼外叫控制程序,用于控制電梯內(nèi)外電路。

系統(tǒng)的整體設(shè)計方案設(shè)計圖如圖2-2所示。

圖2-2 系統(tǒng)的整體方案設(shè)計圖
3. 系統(tǒng)硬件電路設(shè)計
3.1 單片機最小系統(tǒng)電路
               
圖3-1 單片機最小系統(tǒng)電路圖

單片機最小系統(tǒng)包括復(fù)位電路和時鐘電路。具體電路如圖3-1所示。

復(fù)位電路雖然簡單,但其作用非常重要。一個單片機系統(tǒng)能否正常運行,首先要檢查是否能復(fù)位成功。初步檢查可用于示波器探頭監(jiān)視RST引腳,按下復(fù)位鍵,觀察是否有足夠幅度的波形輸出(瞬時的),還可以通過改變復(fù)位電路阻容值進行試驗。本復(fù)位電路采用上電自動復(fù)位和手動復(fù)位組合。上電自動復(fù)位是在加電瞬間電容通過充電來實現(xiàn)的,在通電瞬間,電容C3通過R1K電阻充電,RST端出現(xiàn)正脈沖,用以復(fù)位。只要電源Vcc的上升時間不超過1ms,就可以實現(xiàn)自動上電復(fù)位,即接通電源就完成了系統(tǒng)的復(fù)位初始化。手動復(fù)位是通過按下S111后,通過電阻RR直接給服務(wù)端一個高電平使之復(fù)位。編程初始化設(shè)置數(shù)碼管顯示為1,并且等待樓層模擬傳感器讀取數(shù)據(jù)。

單片機最小系統(tǒng)包括復(fù)位電路。具體電路如圖3所示。

復(fù)位電路雖然簡單,但其作用非常重要。一個單片機系統(tǒng)能否正常運行,首先要檢查是否能復(fù)位成功。初步檢查可用于示波器探頭監(jiān)視RST引腳,按下復(fù)位鍵,觀察是否有足夠幅度的波形輸出(瞬時的),還可以通過改變復(fù)位電路阻容值進行試驗。本復(fù)位電路采用上電自動復(fù)位和手動復(fù)位組合。上電自動復(fù)位是在加電瞬間電容通過充電來實現(xiàn)的,在通電瞬間,電容C3通過R1K電阻充電,RST端出現(xiàn)正脈沖,用以復(fù)位。只要電源Vcc的上升時間不超過1ms,就可以實現(xiàn)自動上電復(fù)位,即接通電源就完成了系統(tǒng)的復(fù)位初始化。手動復(fù)位是通過按下S111后,通過電阻RR直接給服務(wù)端一個高電平使之復(fù)位。編程初始化設(shè)置數(shù)碼管顯示為1,并且等待樓層模擬傳感器讀取數(shù)據(jù)。

3.2 開關(guān)控制電路
圖3-2 開關(guān)控制電路設(shè)計圖

實際上即為一個內(nèi)呼外叫系統(tǒng),現(xiàn)以呼叫信號的輸入為例,來說明信號輸入及單片機識別原理。如圖3所示,采

用P0口外接上拉電阻的并行輸入形式,來輸入外呼叫信號,本電路采用4×4中的10個矩陣鍵盤,行掃描法識別鍵值的原理,具體原理如下:

a) 判斷鍵盤中有無鍵按下 將全部行線PC.0-PC.3置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。  

b) 判斷閉合鍵所在的位置 在確認(rèn)有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

由于沒有電梯控制硬件模型,只能用按鍵來模擬電梯到達位置的觸發(fā)信號。本電路采用獨立式按鍵非編碼鍵盤接口查詢方式。當(dāng)任何一個鍵按下時,與之相連的輸入數(shù)據(jù)線即被清0(低電平),而平時該線為1(高電平)。要判斷是否有鍵按下,用單片機的位處理指令十分方便。這種鍵盤結(jié)構(gòu)的優(yōu)點是電路簡單;缺點是當(dāng)鍵數(shù)較多時要占用較多的I/O口。

查詢方式鍵盤的處理程序比較簡單。本處理程序中沒有使用散轉(zhuǎn)指令,并且省略了軟件去抖動措施,只包括鍵查詢、鍵功能程序轉(zhuǎn)移。

3.3 顯示電路

3.3.1 led樓層觸發(fā)顯示燈電路

圖3-3-1 led樓層觸發(fā)顯示燈電路

本設(shè)計所用A/D轉(zhuǎn)換電路采用通用的ADC0809模數(shù)轉(zhuǎn)換芯片,它是一種8位數(shù)字輸出的逐次逼近式A/D轉(zhuǎn)換器件,轉(zhuǎn)換時間為100us! 其主要特性有……

ADC0809的工作原理為……

使用ADC0809應(yīng)該注意……

其與單片機的接口電路如圖3-1所示。

3.3.2 當(dāng)前樓層顯示電路     
圖3-3-2 當(dāng)前樓層顯示電路

運用7SEG-MPX-4CA來實現(xiàn)輸出樓層信息和當(dāng)前樓層上下信息,7seg-mpx8-ca是共陽極數(shù)碼管顯示器,它左下側(cè)的abcdefg dp是LED數(shù)碼管顯示器的I/O口,是段選信號,右下側(cè)的12345678是它的位選信號,就是從左到右分別是第一位到第八位,段選信號與位選信號分別接到單片機的不同輸出口,例如段選信號可以接到P0口,位選信號可以接到P2口,共陽極的字形顯示代碼為:

Uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}.位選信號代碼為:uchar Digits[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};當(dāng)選中第一位時,段選信號就執(zhí)行從0到九的顯示。                                       

3.4 8155串行口擴展電路
圖3-4 串行口擴展電路圖

本次實驗所用的試驗箱內(nèi)部已經(jīng)接好8155的擴展電路,8155是一個有40引腳的塑封芯片,功能較強,廣泛的應(yīng)用在計算機電路中。它有兩個8位口A、B和一個6位口C,總共可以擴展出22條接線。它含一個可預(yù)置的計數(shù)器,計數(shù)范圍從2到16383,可用于延時、計數(shù)或分頻。它內(nèi)部還有256字節(jié)的RAM,可以補充CPU內(nèi)存的不足。為了能夠設(shè)置芯片的工作方式和了解芯片的狀態(tài),內(nèi)部還有命令寄存器和狀態(tài)寄存器。圖1為8155的引腳圖。其中,與 CPU相連的引腳有:CE是片選信號,當(dāng)CE=0時,芯片才與CPU交換信息。CE接到地址譯碼器上,由整個系統(tǒng)分配給高位地址,以保證任何時刻只有一個芯片可與CPU交換信息,不發(fā)生地址沖突;IO/M是接口或內(nèi)部RAM寄存器的選擇線。當(dāng)IO/M=1時,CPU是對I/O接口操作,當(dāng)IO/M=0時,CPU 是對RAM進行操作,它一般接到CPU的地址線A8上;AD0~AD7為地址數(shù)據(jù)總線;ALE 是地址鎖存信號輸入線;RD、WR分別是讀、寫控制線;RESET是復(fù)位線。當(dāng)RESET=1時,8155被復(fù)位。與外部設(shè)備連接的引腳有:TMRIN(timerin)是計數(shù)輸入線;接到待測的脈沖源;TMROUT(timerout)是計數(shù)輸出線;PA0~PA7為A口的8位輸入/輸出線;PB0~PB7為B口的8位輸入/輸出線;PC0~PC5為C口的6位輸入/輸出線。各接口的工作方式由控制命令決定。

8155各引腳功能說明如下:RST:復(fù)位信號輸入端,高電平有效。復(fù)位后,3個I/O口均為輸入方式。AD0~AD7:三態(tài)的地址/數(shù)據(jù)總線。與單片機的低8位地址/數(shù)據(jù)總線(P0口)相連。單片機與8155之間的地址、數(shù)據(jù)、命令與狀態(tài)信息都是通過這個總線口傳送的。RD:讀選通信號,控制對8155的讀操作,低電平有效。WR:寫選通信號,控制對8155的寫操作,低電平有效。CE:片選信號線,低電平有效。IO/M :8155的RAM存儲器或I/O口選擇線。當(dāng)IO/M =0時,則選擇8155的片內(nèi)RAM,AD0~AD7上地址為8155中RAM單元的地址(00H~FFH);當(dāng)IO/M =1時,選擇 8155的I/O口,AD0~AD7上的地址為8155 I/O口的地址。ALE:地址鎖存信號。8155內(nèi)部設(shè)有地址鎖存器,在ALE的下降沿將單片機P0口輸出的低8位地址信息及 ,IO/ 的狀態(tài)都鎖存到8155內(nèi)部鎖存器。因此,P0口輸出的低8位地址信號不需外接鎖存器。PA0~PA7:8位通用I/O口,其輸入、輸出的流向可由程序控制。PB0~PB7:8位通用I/O口,功能同A口。PC0~PC5:有兩個作用,既可作為通用的I/O口,也可作為PA口和PB口的控制信號線,這些可通過程序控制。TIMER IN:定時/計數(shù)器脈沖輸入端。TIMER OUT:定時/計數(shù)器輸出端。VCC:+5V電源。(1) 壓力傳感器的選定

3.5 總設(shè)計圖
圖3-5 總設(shè)計圖
4. 系統(tǒng)程序設(shè)計
4.1 主程序流程圖

圖4-1 主程序流程圖

系統(tǒng)工作流程:(1)用菊陽仿真器使程序處于連續(xù)運行狀態(tài)

             (2)顯示模塊顯示當(dāng)前樓層,主程序不斷地執(zhí)行鍵盤掃描程序,當(dāng)有鍵盤輸入時,主程序調(diào)用定時器中斷程序,并通過行列掃描方式讀取到是哪個鍵盤輸入。

              (3)讀取到鍵盤之后,主程序調(diào)用顯示子程序,通過顯示上下和當(dāng)前樓層信息和LED輸出當(dāng)前按下鍵的信息以及開關(guān)門的信息向操作人員傳遞信息。

系統(tǒng)主程序流程圖如圖4-1所示。

4.2 定時器子程序流程圖
圖4-1 定時器程序流程圖
定時器子程序主要任務(wù)是完成3秒的定時,使顯示模塊能保持一段時間,使人能夠觀察到具體信息。如果沒有這一模塊,靠系統(tǒng)時鐘來控制,一些中間過程根本看不出來,也給軟件仿真和硬件仿真帶來不小的困難。
4.3 掃描子程序流程圖

掃描子程序主要任務(wù)是通過行列掃描方式確定具體鍵盤的輸入,先讓PA口輸出低電平,逐行掃描,直到能確定哪行有輸入,然后讀取PC口的信息,再與設(shè)定值進行比較,最后通過選擇環(huán)節(jié),確定最終的鍵盤號,如proteus圖中所示,PC0-PC3作為行線,PA0-PA2作為列線,相互配合完成掃描確認(rèn)工作,最終轉(zhuǎn)到輸出子程序并將所輸入的信息轉(zhuǎn)化為具體的上下和數(shù)字輸出,完成鍵盤掃描子程序的基本任務(wù)。

圖4-2 鍵盤掃描流程圖

控制子程序流程圖如圖4-2所示。

4.4 顯示子程序流程圖

圖4-4 顯示子程序流程圖

4.5 延時流程圖
圖4-5 延時程序流程圖
5. 系統(tǒng)調(diào)試
5.1 Proteus軟件仿真調(diào)試

系統(tǒng)初始狀態(tài)在意、1樓等候,以下為遇到的情況:

(1)當(dāng)按下2樓上,顯示欄會顯示上和上到2樓的信息,同時到2樓之后,開門LED會同時點亮。上樓按法和顯示同上。

(2)當(dāng)樓層上升到4樓,按下下樓按鍵,顯示欄會顯示經(jīng)過的樓層以及到達樓層,同時LED在開門時會點亮,下樓按法和顯示同上。

(3)當(dāng)在電梯外部按完,開門LED點亮之后,接下來按你所要去的樓層,到達目標(biāo)樓層之后,開門LED會點亮,同時顯示上下和樓層信息。

調(diào)試中所遇到的問題:

( 1 )鍵盤不能被鍵盤掃描程序讀取,最終發(fā)現(xiàn)是沒有接上拉電阻,接上上拉電阻模塊之后,鍵盤可以可靠地被掃描

(2)8155不能正常擴展電路,8155片選端要接低電平才能有效片選。

5.2 硬件調(diào)試

內(nèi)1(7鍵)內(nèi)2(1鍵)內(nèi)3(TV鍵)內(nèi)4(F1鍵)

1上(4鍵)2上(0鍵)3上(RG鍵)

2下(2鍵)3下(EX鍵)4下(SETP鍵)按下相應(yīng)鍵盤顯示上下及樓層信息。



7.小結(jié)

通過此次電梯控制系統(tǒng)的設(shè)計,我收獲頗豐。設(shè)計的核心內(nèi)容就是利用單片機C51的編程來實現(xiàn)控制外圍各電路的運行。通過本次設(shè)計,我熟練掌握了程控系統(tǒng)設(shè)計的一般步驟,熟悉了編程軟件的用法,并對編程能力起到了一定的提高作用。
感謝學(xué)校給我們這次機會,鍛煉了我們的動手能力及運用專業(yè)軟件的能力。通過這次課設(shè)讓我明白了理論和實際操作之間差距,而且也讓我很明確得意識到自己在數(shù)電上有很多的知識漏洞,以后應(yīng)該多鉆研一下。這次課程設(shè)計我主要負(fù)責(zé)文論撰寫,在寫論文過程中積極和同組同學(xué)探討電梯的基本原理,每個模塊的功能及如何實現(xiàn)。對Office套件的使用更熟悉,為以后畢業(yè)論文的撰寫奠定了一定基礎(chǔ)。最后再次感謝這次課程設(shè)計。

6. 程序清單
  1. #include "reg52.h"
  2. #include "absacc.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define COM XBYTE[0xFF20]                                                                      //定義8155地址
  6. #define PA XBYTE[0xFF21]
  7. #define PB XBYTE[0xFF22]
  8. #define PC XBYTE[0xFF23]

  9. sbit lup1=P1^0;                    //L1              //定義led控制端口
  10. sbit lup2=P1^1;       //L2
  11. sbit ldown2=P1^2;       //L3
  12. sbit lup3=P1^3;       //L4
  13. sbit ldown3=P1^4;       //L5
  14. sbit ldown4=P1^5;     //L6
  15. sbit lopen=P1^7;      //L8


  16. uchar state;                            //當(dāng)前電梯狀態(tài)
  17. uchar statepre;                            //之前電梯狀態(tài)
  18. uchar flag;                            //電梯上下標(biāo)志,0下,1上
  19. bit flag1;                            //定時時間到標(biāo)志
  20. uchar counter;                            //計數(shù)器
  21. bit in1=0, in2=0, in3=0, in4=0, up1=0, up2=0, up3=0, down2=0, down3=0, down4=0;              //KEY
  22. uchar code table[]={0xf9, 0xa4,0xb0,0x99,  0xa1, 0xc1, 0xff};        //樓層顯示碼表,一共是四層

  23. void delay(uint xms)                 //簡單延時0.1ms
  24. {
  25.               uint o,j;
  26.               for(o=xms;o>0;o--)
  27.                             for(j=11;j>0;j--);
  28. }
  29. /***********************************************************/
  30. void display(){
  31.                             PB=0xff;
  32.                             PA=0xfe;
  33.                             PB=table[state-1];
  34.                 delay(2);

  35.                 PB=0xff;
  36.                 PA=0xfd;
  37.                 PB=table[flag+4];
  38.                 delay(2);
  39. }
  40. void keyscan(){                                                                      //掃描鍵盤
  41.                             uchar pctemp;
  42.                             PB=0xff;
  43.                             PA=~0x01;                                                        //PA0口輸出低電平
  44.                             pctemp=PC;
  45.                             switch(pctemp&0x0f){              //PC高位置0
  46.                                           case(0x0e):{
  47.                                                         in1=1;                                          //被按下后標(biāo)記,亮燈,下同
  48.                                                       

  49.                                                         break;
  50.                                           }
  51.                                           case(0x0d):{
  52.                                                         in2=1;
  53.                                                       

  54.                                                         break;
  55.                                           }
  56.                                           case(0x0b):{
  57.                                                         in3=1;
  58.                                                       

  59.                                                         break;
  60.                                           }
  61.                                           case(0x07):{
  62.                                                         in4=1;
  63.                                                       

  64.                                                         break;
  65.                                           }
  66.                                           default: break;
  67.                             }
  68.                             PA=~0x02;                                                        //PA1口低電平掃描第二行
  69.                             delay(1);
  70.                             pctemp=PC;
  71.                             switch(pctemp&0x0f){
  72.                                           case(0x0e):{
  73.                                                         up1=1;
  74.                                                         lup1=0;

  75.                                                         break;
  76.                                           }
  77.                                           case(0x0d):{
  78.                                                         up2=1;
  79.                                                         lup2=0;

  80.                                                         break;
  81.                                           }
  82.                                           case(0x0b):{
  83.                                                         up3=1;
  84.                                                         lup3=0;

  85.                                                         break;
  86.                                           }

  87.                                           default: break;
  88.                             }
  89.                             PA=~0x04;
  90.                             delay(1);                                                        //PA2口低電平掃描第三行
  91.                             pctemp=PC;
  92.                             switch(pctemp&0x0f){                                         

  93.                                           case(0x0d):{
  94.                                                         down2=1;
  95.                                                         ldown2=0;

  96.                                                         break;
  97.                                           }
  98.                                           case(0x0b):{
  99.                                                         down3=1;
  100.                                                         ldown3=0;

  101.                                                         break;
  102.                                           }
  103.                                           case(0x07):{
  104.                                                         down4=1;
  105.                                                         ldown4=0;

  106.                                                         break;
  107.                                           }
  108.                                           default: break;
  109.                             }
  110. }


  111. void iniclock()      //start clock
  112. {
  113.                             TH0=60;                            //TH0=(65536-50000)/256 TL0=(65536-50000)%256   50ms初值
  114.                             TL0=176;
  115.                             ET0=1;                 //開定時器
  116.                             TR0=1;                //啟動定時器T0
  117. }
  118. void run(){
  119.                             iniclock();                                          //開定時
  120.                             while(~flag1){                            //時間未到掃描鍵盤
  121.                                           keyscan();
  122.                                           display();
  123.                             }
  124.                             flag1=0;                                          //時間到了,清標(biāo)志位,關(guān)定時器
  125.                             TR0=0;
  126.                             ET0=0;
  127. }
  128. void main()
  129. {
  130.                             state=1;
  131.                             statepre=1;
  132.                             flag=1;
  133.                             flag1=0;
  134.                             COM=0x43;                                          //intialize 8155
  135.                             TMOD=0x01;                               //定義定時器0/1為定時器模式
  136.                             //TH0=(65536-50000)/256;//50ms初值
  137.                             //TL0=(65536-50000)%256;
  138.                             //ET0=1;                                                          //開定時器
  139.                             //TR0=1;                                                          //啟動定時器T0
  140.                             EA=1;                                                          //開中斷


  141.                       while(1){
  142.                                           switch(state){                                                        //掃描電梯所在位置
  143.                                                         case(1):{
  144.                                                                       //up1=0;                                          //一樓的按鍵燈都熄滅
  145.                                                                       //in1=0;
  146.                                                                       //lup1=1;
  147.                                                                       //lin1=1;
  148.                                                                       //keyscan;
  149.                                                                       //display();
  150.                                                                       if(state!=statepre){              //上次的狀態(tài)和本次不一樣說明電梯 需要開門
  151.                                                                                     lopen=0;
  152.                                                                                     run();                                          //按鍵掃描三秒鐘
  153.                                                                                     lopen=1;
  154.                                                                                     in1=0;                            //如果in1和up1被按下則無效
  155.                                                                      
  156.                                                                                     up1=0;
  157.                                                                                     lup1=1;
  158.                                                                       }
  159.                     else{
  160.                         if(up1){
  161.                                 up1=0;
  162.                                 lup1=1;
  163.                                 lopen=0;
  164.                                 run();
  165.                                 lopen=1;
  166.                                 }
  167.                          }
  168.                       in1=0;

  169.                                                                       if(up2|down2|up3|down3|down4|in2|in3|in4){
  170.                                                                                     flag=1;                                          //說明上行
  171.                                                                                     run();                                                        //按鍵掃描三秒鐘
  172.                                                                                     state=2;                                          //更新狀態(tài)
  173.                                                                                     statepre=1;
  174.                                                                       }
  175.                                                                       else{
  176.                                                                                     statepre=state;
  177.                         flag=2;
  178.                                                                                     keyscan();
  179.                                                                                     display();
  180.                                                                       }
  181.                                                                       break;
  182.                                                         }
  183.                                                         case(2):{                                                                        //電梯到2樓
  184.                                                                       //in2=0;                                                        //電梯內(nèi)部2樓指示燈滅
  185.                                                                       //lin2=1;
  186.                                                                       //if(flag==1){                                                        //如果上行,電梯外上行指示燈滅
  187.                                                                                     //up2=0;
  188.                                                                                     //lup2=1;
  189.                                                                       //}
  190.                                                                       //else{                                                                      //如果下行,電梯外下行指示燈滅
  191.                                                                                     //down2=0;
  192.                                                                              //              ldown2=1;
  193.                                                                       //}
  194.                                                                       //keyscan;
  195.                                                                       //display();
  196.                                                                       if(state!=statepre)
  197.                     {                          //如果前后兩次狀態(tài)不一樣則可能需要開門
  198.                                    if(!(
  199.                                                                                                   ((flag==1)&&(in3|up3|down3)&&(~up2)&&(~in2))                               //去三樓
  200.                                                                                                   ||((flag==1)&&(in4|down4)&&(~up2)&&(~in2))                               //去四樓
  201.                             ||((flag==0)&&(in1||up1)&&(~down2)&&(~in2))                               //去一樓
  202.                             )
  203.                           )
  204.                            {                                         
  205.                                                                                                                 lopen=0;
  206.                                                                                                                 run();                                                        //按鍵掃描三秒鐘
  207.                                                                                                                 lopen=1;
  208.                                                                                                                 in2=0;                                                        //如果in2被按下則無效
  209.                                                                                    
  210.                                                                                                                 if(flag==1){                                          //如果上行,電梯外上行指示燈按下無效
  211.                                                                                                                 up2=0;
  212.                                                                                                                 lup2=1;
  213.                                                                                                                 }
  214.                                                                                                                 else{                                                        //如果下行,電梯外下行指示燈按下無效
  215.                                                                                                                 down2=0;
  216.                                                                                                                 ldown2=1;
  217.                                                                                                                 }
  218.                                        }
  219.                                                                       }
  220.                                         else{                                                                                                                              //在二樓停
  221.                                                       if(down2|up2){
  222.                                                               down2=0;
  223.                                                         up2=0;
  224.                                                         lopen=0;
  225.                                                         run();
  226.                                                         lopen=1;
  227.                                                         ldown2=1;
  228.                                                         lup2=1;
  229.                                                               }
  230.                                                       }
  231.                                         in2=0;

  232.                                         if(flag)
  233.                                                       up2=0;
  234.                                         else
  235.                                                       down2=0;
  236.                                                                       if(flag==1){
  237.                                                                                     if(down3|in3|up3|down4|in4){
  238.                                                                                                   flag=1;
  239.                                                                                                   run();
  240.                                                                                                   state=3;
  241.                                                                                                   statepre=2;
  242.                                                                                     }
  243.                                                                                     else if(in1|up1){
  244.                                                                                                   flag=0;
  245.                                                                                                   run();
  246.                                                                                                   state=1;
  247.                                                                                                   statepre=2;
  248.                                                                                     }
  249.                                                                                     else{
  250.                                                                                                   statepre=state;
  251.                                                         flag=2;
  252.                                                                                                   keyscan();
  253.                                                                                                   display();
  254.                                                                                     }
  255.                                                                       }
  256.                                                                       else {
  257.                                                                                     if(up1|in1){
  258.                                                                                                   flag=0;
  259.                                                                                                   run();
  260.                                                                                                   state=1;
  261.                                                                                                   statepre=2;
  262.                                                                                     }
  263.                                                                                     else if(in3|down3|up3|in4|down4){
  264.                                                                                                   flag=1;
  265.                                                                                                   run();
  266.                                                                                                   state=3;
  267.                                                                                                   statepre=2;
  268.                                                                                     }
  269.                                                                                     else{

  270.                                                                                                   statepre=state;
  271.                                                         flag=2;
  272.                                                                                                   keyscan();
  273.                                                                                                   display();
  274.                                                                                     }
  275.                                                                       }
  276.                                                                       break;
  277.                                                         }
  278.                                                         case(3):{                                                        //電梯到3樓
  279.                                                                       //in3=0;                                                        //電梯內(nèi)部3樓指示燈滅
  280.                                                                       //lin2=1;
  281.                                                                       //if(flag==1){                                                        //如果上行,電梯外上行指示燈滅
  282.                                                                                     //up3=0;
  283.                                                                                     //lup3=1;
  284.                                                                       //}
  285.                                                                       //else{                                                                      //如果下行,電梯外下行指示燈滅
  286.                                                                                     //down3=0;
  287.                                                                              //              ldown2=1;
  288.                                                                       //}
  289.                                                                       //keyscan;
  290.                                                                       //display();
  291.                                                                       if(state!=statepre)
  292.                     {                          //如果前后兩次狀態(tài)不一樣則可能需要開門
  293.                                    if(!(
  294.                                                                                                   ((flag==0)&&(in2|up2|down2)&&(~up3)&&(~in3))                               //去二樓
  295.                                                                                                   ||((flag==1)&&(in4|down4)&&(~up3)&&(~in3))                               //去四樓
  296.                             ||((flag==0)&&(in1||up1)&&(~down3)&&(~in2))                               //去一樓
  297.                             )
  298.                           )
  299.                            {                                         
  300.                                                                                                                 lopen=0;
  301.                                                                                                                 run();                                                        //按鍵掃描三秒鐘
  302.                                                                                                                 lopen=1;
  303.                                                                                                                 in3=0;                                                        //如果in3被按下則無效
  304.                                                                                    
  305.                                                                                                                 if(flag==1){                                          //如果上行,電梯外上行指示燈按下無效
  306.                                                                                                                 up3=0;
  307.                                                                                                                 lup3=1;
  308.                                                                                                                 }
  309.                                                                                                                 else{                                                        //如果下行,電梯外下行指示燈按下無效
  310.                                                                                                                 down3=0;
  311.                                                                                                                 ldown2=1;
  312.                                                                                                                 }
  313.                                        }
  314.                                                                       }
  315.                                         else{                                                                                                                              //在三樓停
  316.                                                       if(down3|up3){
  317.                                                               down3=0;
  318.                                                         up3=0;
  319.                                                         lopen=0;
  320.                                                         run();
  321.                                                         lopen=1;
  322.                                                         ldown3=1;
  323.                                                         lup3=1;
  324.                                                               }
  325.                                                       }
  326.                                         in3=0;

  327.                                         if(flag)
  328.                                                       up3=0;
  329.                                         else
  330.                                                       down3=0;
  331.                                                                       if(flag==1){
  332.                                                                                     if(down4|in4){
  333.                                                                                                   flag=1;
  334.                                                                                                   run();
  335.                                                                                                   state=4;
  336.                                                                                                   statepre=3;
  337.                                                                                     }
  338.                                                                                     else if(in1|up1|in2|up2|down2){
  339.                                                                                                   flag=0;
  340.                                                                                                   run();
  341.                                                                                                   state=2;
  342.                                                                                                   statepre=3;
  343.                                                                                     }
  344.                                                                                     else{
  345.                                                                                                   statepre=state;
  346.                                                         flag=2;
  347.                                                                                                   keyscan();
  348.                                                                                                   display();
  349.                                                                                     }
  350.                                                                       }
  351.                                                                       else {
  352.                                                                                     if(up1|in1|up2|in2|down2){
  353.                                                                                                   flag=0;
  354.                                                                                                   run();
  355.                                                                                                   state=2;
  356.                                                                                                   statepre=3;
  357.                                                                                     }
  358.                                                                                     else if(in4|down4){
  359.                                                                                                   flag=1;
  360.                                                                                                   run();
  361.                                                                                                   state=4;
  362.                                                                                                   statepre=3;
  363.                                                                                     }
  364.                                                                                     else{

  365.                                                                                                   statepre=state;
  366.                                                         flag=2;
  367.                                                                                                   keyscan();
  368.                                                                                                   display();
  369.                                                                                     }
  370.                                                                       }
  371.                                                                       break;
  372.                                                         }
  373.                                                         case(4):{                                                                      //case4和case1類似
  374.                                                                       //down4=0;
  375.                                                                       //in4=0;
  376.                                                                       //ldown4=1;
  377.                                                                       //lin4=1;
  378.                                                                       keyscan();
  379.                                                                       display();
  380.                                                                       if(state!=statepre){
  381. ……………………

  382. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼


全部資料51hei下載地址(內(nèi)附仿真圖與源程序+word格式的完整報告文檔
):
四層電梯最終版11.zip (1.07 MB, 下載次數(shù): 856)


評分

參與人數(shù) 1黑幣 +1 收起 理由
ptlantu + 1 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏21 分享淘帖 頂13 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:73182 發(fā)表于 2018-7-13 11:03 | 只看該作者
非常感謝。。
回復(fù)

使用道具 舉報

板凳
ID:313328 發(fā)表于 2018-10-31 21:23 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報

地板
ID:437523 發(fā)表于 2018-12-14 20:52 | 只看該作者
挺詳細的
回復(fù)

使用道具 舉報

5#
ID:442022 發(fā)表于 2018-12-22 12:51 | 只看該作者
哇~我想要一個
回復(fù)

使用道具 舉報

6#
ID:247419 發(fā)表于 2019-1-7 20:47 | 只看該作者
太棒了 感謝樓主分享
回復(fù)

使用道具 舉報

7#
ID:467353 發(fā)表于 2019-1-22 12:16 | 只看該作者
正在學(xué)習(xí)
回復(fù)

使用道具 舉報

8#
ID:142059 發(fā)表于 2019-1-23 04:25 來自手機 | 只看該作者
mynetroom 發(fā)表于 2019-1-22 12:16
正在學(xué)習(xí)

我也寫了一個,需要可以去看看
回復(fù)

使用道具 舉報

9#
ID:473444 發(fā)表于 2019-1-27 20:53 | 只看該作者
謝謝樓主賞賜
回復(fù)

使用道具 舉報

10#
ID:480100 發(fā)表于 2019-2-24 20:37 | 只看該作者
不錯下載學(xué)習(xí)一下
回復(fù)

使用道具 舉報

11#
ID:328160 發(fā)表于 2019-2-26 20:28 | 只看該作者
非常感謝。!
回復(fù)

使用道具 舉報

12#
ID:72479 發(fā)表于 2019-3-15 19:40 | 只看該作者
我分不夠了,下不了了。
回復(fù)

使用道具 舉報

13#
ID:452012 發(fā)表于 2019-3-15 20:01 | 只看該作者
很實用的東西。
回復(fù)

使用道具 舉報

14#
ID:32348 發(fā)表于 2019-3-22 11:44 | 只看該作者
非常感謝!!非常感謝!。》浅8兄x。!
回復(fù)

使用道具 舉報

15#
ID:523864 發(fā)表于 2019-4-28 20:51 | 只看該作者
#在這里快速回復(fù)# 非常感謝!。
回復(fù)

使用道具 舉報

16#
ID:552517 發(fā)表于 2019-6-1 15:48 | 只看該作者
萬分感謝
回復(fù)

使用道具 舉報

17#
ID:552517 發(fā)表于 2019-6-3 15:23 | 只看該作者
非常感謝。!非常感謝!。》浅8兄x!
回復(fù)

使用道具 舉報

18#
ID:563578 發(fā)表于 2019-6-16 14:15 | 只看該作者

我也想要
回復(fù)

使用道具 舉報

19#
ID:562011 發(fā)表于 2019-6-16 17:33 | 只看該作者
想要程序
回復(fù)

使用道具 舉報

20#
ID:325103 發(fā)表于 2019-6-17 16:14 | 只看該作者
支持一下大神~!~
回復(fù)

使用道具 舉報

21#
ID:564483 發(fā)表于 2019-6-17 16:57 | 只看該作者
太棒了 感謝樓主分享
回復(fù)

使用道具 舉報

22#
ID:563578 發(fā)表于 2019-6-18 10:58 | 只看該作者
電梯復(fù)位鍵沒用
回復(fù)

使用道具 舉報

23#
ID:571485 發(fā)表于 2019-6-25 10:11 | 只看該作者
感謝大佬
回復(fù)

使用道具 舉報

24#
ID:576169 發(fā)表于 2019-7-2 10:07 | 只看該作者
感謝大佬分享
回復(fù)

使用道具 舉報

25#
ID:599126 發(fā)表于 2019-8-11 15:18 | 只看該作者
好,有實際驗證過嗎
回復(fù)

使用道具 舉報

26#
ID:572103 發(fā)表于 2019-8-11 19:46 | 只看該作者
這個資料真不錯,學(xué)習(xí)了
回復(fù)

使用道具 舉報

27#
ID:604192 發(fā)表于 2019-8-28 11:46 | 只看該作者
寫的非常詳細,程序可讀性比較高
回復(fù)

使用道具 舉報

28#
ID:604192 發(fā)表于 2019-8-28 11:47 | 只看該作者
寫的非常信息,程序可讀性高
回復(fù)

使用道具 舉報

29#
ID:645058 發(fā)表于 2019-11-19 15:42 | 只看該作者
感謝!!!!!!!!!!!
回復(fù)

使用道具 舉報

30#
ID:655793 發(fā)表于 2019-12-5 09:00 | 只看該作者
怎么做一個雙排電梯
回復(fù)

使用道具 舉報

31#
ID:219115 發(fā)表于 2019-12-5 10:49 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報

32#
ID:219115 發(fā)表于 2019-12-5 11:07 | 只看該作者
樓主的分享很有意義,正好最近在看這個。所以可以參考一下
回復(fù)

使用道具 舉報

33#
ID:659876 發(fā)表于 2019-12-11 17:47 | 只看該作者
請問如何加入報警器和開關(guān)門呢
回復(fù)

使用道具 舉報

34#
ID:612599 發(fā)表于 2019-12-13 09:04 | 只看該作者
為什么一運行仿真就會卡死??(出現(xiàn)SIMULATE:運行PROSPICE .DLL [C:\temp\LISA5928 SDF]),求大神回復(fù)。。
回復(fù)

使用道具 舉報

35#
ID:473004 發(fā)表于 2019-12-16 21:56 | 只看該作者
剛好需要,感謝分享
回復(fù)

使用道具 舉報

36#
ID:686025 發(fā)表于 2020-2-9 09:43 來自手機 | 只看該作者
很完整的資料,很給力,下載來看下
回復(fù)

使用道具 舉報

37#
ID:736847 發(fā)表于 2020-4-24 11:39 | 只看該作者
非常感謝
回復(fù)

使用道具 舉報

38#
ID:736847 發(fā)表于 2020-4-24 11:39 | 只看該作者
非常感謝
回復(fù)

使用道具 舉報

39#
ID:748284 發(fā)表于 2020-5-10 13:28 | 只看該作者
非常感謝
回復(fù)

使用道具 舉報

40#
ID:423814 發(fā)表于 2020-5-12 13:34 | 只看該作者
求解P2口無法正常使用
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表