0.png (56.27 KB, 下載次數(shù): 156)
下載附件
2018-7-13 02:41 上傳
0.png (12.79 KB, 下載次數(shù): 110)
下載附件
2018-7-13 02:34 上傳
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. 程序清單 - #include "reg52.h"
- #include "absacc.h"
- #define uint unsigned int
- #define uchar unsigned char
- #define COM XBYTE[0xFF20] //定義8155地址
- #define PA XBYTE[0xFF21]
- #define PB XBYTE[0xFF22]
- #define PC XBYTE[0xFF23]
-
- sbit lup1=P1^0; //L1 //定義led控制端口
- sbit lup2=P1^1; //L2
- sbit ldown2=P1^2; //L3
- sbit lup3=P1^3; //L4
- sbit ldown3=P1^4; //L5
- sbit ldown4=P1^5; //L6
- sbit lopen=P1^7; //L8
-
-
- uchar state; //當(dāng)前電梯狀態(tài)
- uchar statepre; //之前電梯狀態(tài)
- uchar flag; //電梯上下標(biāo)志,0下,1上
- bit flag1; //定時時間到標(biāo)志
- uchar counter; //計數(shù)器
- bit in1=0, in2=0, in3=0, in4=0, up1=0, up2=0, up3=0, down2=0, down3=0, down4=0; //KEY
- uchar code table[]={0xf9, 0xa4,0xb0,0x99, 0xa1, 0xc1, 0xff}; //樓層顯示碼表,一共是四層
-
- void delay(uint xms) //簡單延時0.1ms
- {
- uint o,j;
- for(o=xms;o>0;o--)
- for(j=11;j>0;j--);
- }
- /***********************************************************/
- void display(){
- PB=0xff;
- PA=0xfe;
- PB=table[state-1];
- delay(2);
-
- PB=0xff;
- PA=0xfd;
- PB=table[flag+4];
- delay(2);
- }
- void keyscan(){ //掃描鍵盤
- uchar pctemp;
- PB=0xff;
- PA=~0x01; //PA0口輸出低電平
- pctemp=PC;
- switch(pctemp&0x0f){ //PC高位置0
- case(0x0e):{
- in1=1; //被按下后標(biāo)記,亮燈,下同
-
-
- break;
- }
- case(0x0d):{
- in2=1;
-
-
- break;
- }
- case(0x0b):{
- in3=1;
-
-
- break;
- }
- case(0x07):{
- in4=1;
-
-
- break;
- }
- default: break;
- }
- PA=~0x02; //PA1口低電平掃描第二行
- delay(1);
- pctemp=PC;
- switch(pctemp&0x0f){
- case(0x0e):{
- up1=1;
- lup1=0;
-
- break;
- }
- case(0x0d):{
- up2=1;
- lup2=0;
-
- break;
- }
- case(0x0b):{
- up3=1;
- lup3=0;
-
- break;
- }
-
- default: break;
- }
- PA=~0x04;
- delay(1); //PA2口低電平掃描第三行
- pctemp=PC;
- switch(pctemp&0x0f){
-
- case(0x0d):{
- down2=1;
- ldown2=0;
-
- break;
- }
- case(0x0b):{
- down3=1;
- ldown3=0;
-
- break;
- }
- case(0x07):{
- down4=1;
- ldown4=0;
-
- break;
- }
- default: break;
- }
- }
-
-
- void iniclock() //start clock
- {
- TH0=60; //TH0=(65536-50000)/256 TL0=(65536-50000)%256 50ms初值
- TL0=176;
- ET0=1; //開定時器
- TR0=1; //啟動定時器T0
- }
- void run(){
- iniclock(); //開定時
- while(~flag1){ //時間未到掃描鍵盤
- keyscan();
- display();
- }
- flag1=0; //時間到了,清標(biāo)志位,關(guān)定時器
- TR0=0;
- ET0=0;
- }
- void main()
- {
- state=1;
- statepre=1;
- flag=1;
- flag1=0;
- COM=0x43; //intialize 8155
- TMOD=0x01; //定義定時器0/1為定時器模式
- //TH0=(65536-50000)/256;//50ms初值
- //TL0=(65536-50000)%256;
- //ET0=1; //開定時器
- //TR0=1; //啟動定時器T0
- EA=1; //開中斷
-
-
- while(1){
- switch(state){ //掃描電梯所在位置
- case(1):{
- //up1=0; //一樓的按鍵燈都熄滅
- //in1=0;
- //lup1=1;
- //lin1=1;
- //keyscan;
- //display();
- if(state!=statepre){ //上次的狀態(tài)和本次不一樣說明電梯 需要開門
- lopen=0;
- run(); //按鍵掃描三秒鐘
- lopen=1;
- in1=0; //如果in1和up1被按下則無效
-
- up1=0;
- lup1=1;
- }
- else{
- if(up1){
- up1=0;
- lup1=1;
- lopen=0;
- run();
- lopen=1;
- }
- }
- in1=0;
-
- if(up2|down2|up3|down3|down4|in2|in3|in4){
- flag=1; //說明上行
- run(); //按鍵掃描三秒鐘
- state=2; //更新狀態(tài)
- statepre=1;
- }
- else{
- statepre=state;
- flag=2;
- keyscan();
- display();
- }
- break;
- }
- case(2):{ //電梯到2樓
- //in2=0; //電梯內(nèi)部2樓指示燈滅
- //lin2=1;
- //if(flag==1){ //如果上行,電梯外上行指示燈滅
- //up2=0;
- //lup2=1;
- //}
- //else{ //如果下行,電梯外下行指示燈滅
- //down2=0;
- // ldown2=1;
- //}
- //keyscan;
- //display();
- if(state!=statepre)
- { //如果前后兩次狀態(tài)不一樣則可能需要開門
- if(!(
- ((flag==1)&&(in3|up3|down3)&&(~up2)&&(~in2)) //去三樓
- ||((flag==1)&&(in4|down4)&&(~up2)&&(~in2)) //去四樓
- ||((flag==0)&&(in1||up1)&&(~down2)&&(~in2)) //去一樓
- )
- )
- {
- lopen=0;
- run(); //按鍵掃描三秒鐘
- lopen=1;
- in2=0; //如果in2被按下則無效
-
- if(flag==1){ //如果上行,電梯外上行指示燈按下無效
- up2=0;
- lup2=1;
- }
- else{ //如果下行,電梯外下行指示燈按下無效
- down2=0;
- ldown2=1;
- }
- }
- }
- else{ //在二樓停
- if(down2|up2){
- down2=0;
- up2=0;
- lopen=0;
- run();
- lopen=1;
- ldown2=1;
- lup2=1;
- }
- }
- in2=0;
-
- if(flag)
- up2=0;
- else
- down2=0;
- if(flag==1){
- if(down3|in3|up3|down4|in4){
- flag=1;
- run();
- state=3;
- statepre=2;
- }
- else if(in1|up1){
- flag=0;
- run();
- state=1;
- statepre=2;
- }
- else{
- statepre=state;
- flag=2;
- keyscan();
- display();
- }
- }
- else {
- if(up1|in1){
- flag=0;
- run();
- state=1;
- statepre=2;
- }
- else if(in3|down3|up3|in4|down4){
- flag=1;
- run();
- state=3;
- statepre=2;
- }
- else{
-
- statepre=state;
- flag=2;
- keyscan();
- display();
- }
- }
- break;
- }
- case(3):{ //電梯到3樓
- //in3=0; //電梯內(nèi)部3樓指示燈滅
- //lin2=1;
- //if(flag==1){ //如果上行,電梯外上行指示燈滅
- //up3=0;
- //lup3=1;
- //}
- //else{ //如果下行,電梯外下行指示燈滅
- //down3=0;
- // ldown2=1;
- //}
- //keyscan;
- //display();
- if(state!=statepre)
- { //如果前后兩次狀態(tài)不一樣則可能需要開門
- if(!(
- ((flag==0)&&(in2|up2|down2)&&(~up3)&&(~in3)) //去二樓
- ||((flag==1)&&(in4|down4)&&(~up3)&&(~in3)) //去四樓
- ||((flag==0)&&(in1||up1)&&(~down3)&&(~in2)) //去一樓
- )
- )
- {
- lopen=0;
- run(); //按鍵掃描三秒鐘
- lopen=1;
- in3=0; //如果in3被按下則無效
-
- if(flag==1){ //如果上行,電梯外上行指示燈按下無效
- up3=0;
- lup3=1;
- }
- else{ //如果下行,電梯外下行指示燈按下無效
- down3=0;
- ldown2=1;
- }
- }
- }
- else{ //在三樓停
- if(down3|up3){
- down3=0;
- up3=0;
- lopen=0;
- run();
- lopen=1;
- ldown3=1;
- lup3=1;
- }
- }
- in3=0;
-
- if(flag)
- up3=0;
- else
- down3=0;
- if(flag==1){
- if(down4|in4){
- flag=1;
- run();
- state=4;
- statepre=3;
- }
- else if(in1|up1|in2|up2|down2){
- flag=0;
- run();
- state=2;
- statepre=3;
- }
- else{
- statepre=state;
- flag=2;
- keyscan();
- display();
- }
- }
- else {
- if(up1|in1|up2|in2|down2){
- flag=0;
- run();
- state=2;
- statepre=3;
- }
- else if(in4|down4){
- flag=1;
- run();
- state=4;
- statepre=3;
- }
- else{
-
- statepre=state;
- flag=2;
- keyscan();
- display();
- }
- }
- break;
- }
- case(4):{ //case4和case1類似
- //down4=0;
- //in4=0;
- //ldown4=1;
- //lin4=1;
- keyscan();
- display();
- if(state!=statepre){
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
0.png (44.04 KB, 下載次數(shù): 134)
下載附件
2018-7-13 02:43 上傳
全部資料51hei下載地址(內(nèi)附仿真圖與源程序+word格式的完整報告文檔):
四層電梯最終版11.zip
(1.07 MB, 下載次數(shù): 856)
2018-7-12 21:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|