4層電梯單片機(jī)控制設(shè)計(jì) 在1901年的上海,美國(guó)奧的斯公司安裝了中國(guó)最早的一座電梯,而今,我國(guó)電梯業(yè)已進(jìn)入了高速發(fā)展的時(shí)期,商場(chǎng)、醫(yī)院、賓館、倉(cāng)庫(kù)、住宅大樓等地方的電梯都被廣泛應(yīng)用著,直接與人們的生活息息相關(guān),給人們的生活帶來(lái)了極大的便利,是一種必不可少的垂直運(yùn)輸交通工具。 拋開(kāi)一些復(fù)雜的概念,單片機(jī)在我們的生活中觸手可及,尤其是在智能儀表,實(shí)時(shí)控制,機(jī)電一體化,辦公機(jī)械,家用電器等方面擁有廣泛的應(yīng)用領(lǐng)域。這次課設(shè)注重對(duì)單片機(jī)的理解應(yīng)用,明白單片機(jī)的工作原理,掌握單片機(jī)的接口技術(shù),中斷技術(shù),存儲(chǔ)技術(shù),時(shí)鐘方式和控制方式,這樣才能更好地利用單片機(jī)來(lái)做有效的設(shè)計(jì),提高自己的綜合能力。 1. 設(shè)計(jì)任務(wù) 結(jié)合實(shí)際情況,基于AT89C52單片機(jī)設(shè)計(jì)一個(gè)四層電梯單片機(jī)控制系統(tǒng)。該系統(tǒng)應(yīng)滿足的功能要求為: 4層電梯運(yùn)行控制,轎內(nèi)外呼叫,運(yùn)行狀態(tài)顯示。獨(dú)立鍵盤、LED顯示樓層、指示燈。 (1) 電梯運(yùn)行控制系統(tǒng)為四層控制系統(tǒng)。 (2) 電梯能夠轎內(nèi)外呼叫,并顯示運(yùn)行的狀態(tài)。 (3) 設(shè)計(jì)系統(tǒng)具有獨(dú)立鍵盤控制,并有LED顯示樓層與指示燈。 主要硬件設(shè)備:AT89C52單片機(jī): AT89C52是一個(gè)低電壓,高性能CMOS 8位單片機(jī),片內(nèi)含8k bytes的可反復(fù)擦寫的Flash只讀程序存儲(chǔ)器和256 bytes的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM),器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲(chǔ)單元,AT89C52單片機(jī)在電子行業(yè)中有著廣泛的應(yīng)用。 AT89C52有40個(gè)引腳,32個(gè)外部雙向輸入/輸出(I/O)端口,同時(shí)內(nèi)含2個(gè)外中斷口,3個(gè)16位可編程定時(shí)計(jì)數(shù)器,2個(gè)全雙工串行通信口,2 個(gè)讀寫口線,AT89C52可以按照常規(guī)方法進(jìn)行編程,也可以在線編程。其將通用的微處理器和Flash存儲(chǔ)器結(jié)合在一起,特別是可反復(fù)擦寫的Flash存儲(chǔ)器可有效地降低開(kāi)發(fā)成本。 AT89C52有PDIP、PQFP/TQFP及PLCC等三種封裝形式,以適應(yīng)不同產(chǎn)品的需求。 2. 整體方案設(shè)計(jì) 本設(shè)計(jì)采用AT89C52單片機(jī)作為核心,配以適當(dāng)接口作為輸入輸出通道。采用三行按鍵矩陣開(kāi)關(guān)電路作為外呼內(nèi)選呼叫控制。實(shí)際電梯控制系統(tǒng)每層裝有一個(gè)傳感器,從而判斷車廂所在位置,本模型由10個(gè)獨(dú)立按鍵作為樓層到達(dá)信號(hào)傳輸給單片機(jī),而后通過(guò)內(nèi)部電路從串口驅(qū)動(dòng)數(shù)碼管顯示樓層數(shù)。當(dāng)電梯到達(dá)所選層,電梯開(kāi)門延時(shí)等待進(jìn)人并選層,然后延時(shí)關(guān)門執(zhí)行請(qǐng)求,若無(wú)請(qǐng)求則停在本層等待請(qǐng)求。軟件部分使用C語(yǔ)言,利用查詢方式來(lái)檢測(cè)用戶請(qǐng)求的按鍵信息。 圖2-1 基于單片機(jī)的四層電梯控制總原理圖 本系統(tǒng)硬件主要由復(fù)位模塊、顯示系統(tǒng)、擴(kuò)展部分、矩陣控制模塊幾部分組成。各模塊的主要功能如下: (1) 復(fù)位的功能其一用于程序初始化,其二也用于擺脫互鎖和跑飛。 (2) 顯示系統(tǒng)的功能分為顯示led燈顯示觸發(fā)樓層數(shù)和數(shù)碼管顯示當(dāng)前樓層數(shù)的兩個(gè)部分,用于顯示電梯系統(tǒng)此時(shí)正在運(yùn)行的狀態(tài)。 (3) 擴(kuò)展部分:因?yàn)閱纹瑱C(jī)芯片的接口有限,故使用8155擴(kuò)展串行口用以連接更多功能。 (4) 矩陣控制模塊:即內(nèi)呼外叫控制程序,用于控制電梯內(nèi)外電路。 系統(tǒng)的整體設(shè)計(jì)方案設(shè)計(jì)圖如圖2-2所示。 圖2-2 系統(tǒng)的整體方案設(shè)計(jì)圖 3. 系統(tǒng)硬件電路設(shè)計(jì) 3.1 單片機(jī)最小系統(tǒng)電路 圖3-1 單片機(jī)最小系統(tǒng)電路圖 單片機(jī)最小系統(tǒng)包括復(fù)位電路和時(shí)鐘電路。具體電路如圖3-1所示。 復(fù)位電路雖然簡(jiǎn)單,但其作用非常重要。一個(gè)單片機(jī)系統(tǒng)能否正常運(yùn)行,首先要檢查是否能復(fù)位成功。初步檢查可用于示波器探頭監(jiān)視RST引腳,按下復(fù)位鍵,觀察是否有足夠幅度的波形輸出(瞬時(shí)的),還可以通過(guò)改變復(fù)位電路阻容值進(jìn)行試驗(yàn)。本復(fù)位電路采用上電自動(dòng)復(fù)位和手動(dòng)復(fù)位組合。上電自動(dòng)復(fù)位是在加電瞬間電容通過(guò)充電來(lái)實(shí)現(xiàn)的,在通電瞬間,電容C3通過(guò)R1K電阻充電,RST端出現(xiàn)正脈沖,用以復(fù)位。只要電源Vcc的上升時(shí)間不超過(guò)1ms,就可以實(shí)現(xiàn)自動(dòng)上電復(fù)位,即接通電源就完成了系統(tǒng)的復(fù)位初始化。手動(dòng)復(fù)位是通過(guò)按下S111后,通過(guò)電阻RR直接給服務(wù)端一個(gè)高電平使之復(fù)位。編程初始化設(shè)置數(shù)碼管顯示為1,并且等待樓層模擬傳感器讀取數(shù)據(jù)。 單片機(jī)最小系統(tǒng)包括復(fù)位電路。具體電路如圖3所示。 復(fù)位電路雖然簡(jiǎn)單,但其作用非常重要。一個(gè)單片機(jī)系統(tǒng)能否正常運(yùn)行,首先要檢查是否能復(fù)位成功。初步檢查可用于示波器探頭監(jiān)視RST引腳,按下復(fù)位鍵,觀察是否有足夠幅度的波形輸出(瞬時(shí)的),還可以通過(guò)改變復(fù)位電路阻容值進(jìn)行試驗(yàn)。本復(fù)位電路采用上電自動(dòng)復(fù)位和手動(dòng)復(fù)位組合。上電自動(dòng)復(fù)位是在加電瞬間電容通過(guò)充電來(lái)實(shí)現(xiàn)的,在通電瞬間,電容C3通過(guò)R1K電阻充電,RST端出現(xiàn)正脈沖,用以復(fù)位。只要電源Vcc的上升時(shí)間不超過(guò)1ms,就可以實(shí)現(xiàn)自動(dòng)上電復(fù)位,即接通電源就完成了系統(tǒng)的復(fù)位初始化。手動(dòng)復(fù)位是通過(guò)按下S111后,通過(guò)電阻RR直接給服務(wù)端一個(gè)高電平使之復(fù)位。編程初始化設(shè)置數(shù)碼管顯示為1,并且等待樓層模擬傳感器讀取數(shù)據(jù)。 3.2 開(kāi)關(guān)控制電路 圖3-2 開(kāi)關(guān)控制電路設(shè)計(jì)圖實(shí)際上即為一個(gè)內(nèi)呼外叫系統(tǒng),現(xiàn)以呼叫信號(hào)的輸入為例,來(lái)說(shuō)明信號(hào)輸入及單片機(jī)識(shí)別原理。如圖3所示,采 用P0口外接上拉電阻的并行輸入形式,來(lái)輸入外呼叫信號(hào),本電路采用4×4中的10個(gè)矩陣鍵盤,行掃描法識(shí)別鍵值的原理,具體原理如下: a) 判斷鍵盤中有無(wú)鍵按下 將全部行線PC.0-PC.3置低電平,然后檢測(cè)列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個(gè)按鍵之中。若所有列線均為高電平,則鍵盤中無(wú)鍵按下。 b) 判斷閉合鍵所在的位置 在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過(guò)程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測(cè)各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。 由于沒(méi)有電梯控制硬件模型,只能用按鍵來(lái)模擬電梯到達(dá)位置的觸發(fā)信號(hào)。本電路采用獨(dú)立式按鍵非編碼鍵盤接口查詢方式。當(dāng)任何一個(gè)鍵按下時(shí),與之相連的輸入數(shù)據(jù)線即被清0(低電平),而平時(shí)該線為1(高電平)。要判斷是否有鍵按下,用單片機(jī)的位處理指令十分方便。這種鍵盤結(jié)構(gòu)的優(yōu)點(diǎn)是電路簡(jiǎn)單;缺點(diǎn)是當(dāng)鍵數(shù)較多時(shí)要占用較多的I/O口。 查詢方式鍵盤的處理程序比較簡(jiǎn)單。本處理程序中沒(méi)有使用散轉(zhuǎn)指令,并且省略了軟件去抖動(dòng)措施,只包括鍵查詢、鍵功能程序轉(zhuǎn)移。 3.3 顯示電路 3.3.1 led樓層觸發(fā)顯示燈電路 
圖3-3-1 led樓層觸發(fā)顯示燈電路 本設(shè)計(jì)所用A/D轉(zhuǎn)換電路采用通用的ADC0809模數(shù)轉(zhuǎn)換芯片,它是一種8位數(shù)字輸出的逐次逼近式A/D轉(zhuǎn)換器件,轉(zhuǎn)換時(shí)間為100us! 其主要特性有…… ADC0809的工作原理為…… 使用ADC0809應(yīng)該注意…… 其與單片機(jī)的接口電路如圖3-1所示。 3.3.2 當(dāng)前樓層顯示電路 圖3-3-2 當(dāng)前樓層顯示電路 運(yùn)用7SEG-MPX-4CA來(lái)實(shí)現(xiàn)輸出樓層信息和當(dāng)前樓層上下信息,7seg-mpx8-ca是共陽(yáng)極數(shù)碼管顯示器,它左下側(cè)的abcdefg dp是LED數(shù)碼管顯示器的I/O口,是段選信號(hào),右下側(cè)的12345678是它的位選信號(hào),就是從左到右分別是第一位到第八位,段選信號(hào)與位選信號(hào)分別接到單片機(jī)的不同輸出口,例如段選信號(hào)可以接到P0口,位選信號(hào)可以接到P2口,共陽(yáng)極的字形顯示代碼為: Uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}.位選信號(hào)代碼為:uchar Digits[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};當(dāng)選中第一位時(shí),段選信號(hào)就執(zhí)行從0到九的顯示。 3.4 8155串行口擴(kuò)展電路 圖3-4 串行口擴(kuò)展電路圖本次實(shí)驗(yàn)所用的試驗(yàn)箱內(nèi)部已經(jīng)接好8155的擴(kuò)展電路,8155是一個(gè)有40引腳的塑封芯片,功能較強(qiáng),廣泛的應(yīng)用在計(jì)算機(jī)電路中。它有兩個(gè)8位口A、B和一個(gè)6位口C,總共可以擴(kuò)展出22條接線。它含一個(gè)可預(yù)置的計(jì)數(shù)器,計(jì)數(shù)范圍從2到16383,可用于延時(shí)、計(jì)數(shù)或分頻。它內(nèi)部還有256字節(jié)的RAM,可以補(bǔ)充CPU內(nèi)存的不足。為了能夠設(shè)置芯片的工作方式和了解芯片的狀態(tài),內(nèi)部還有命令寄存器和狀態(tài)寄存器。圖1為8155的引腳圖。其中,與 CPU相連的引腳有:CE是片選信號(hào),當(dāng)CE=0時(shí),芯片才與CPU交換信息。CE接到地址譯碼器上,由整個(gè)系統(tǒng)分配給高位地址,以保證任何時(shí)刻只有一個(gè)芯片可與CPU交換信息,不發(fā)生地址沖突;IO/M是接口或內(nèi)部RAM寄存器的選擇線。當(dāng)IO/M=1時(shí),CPU是對(duì)I/O接口操作,當(dāng)IO/M=0時(shí),CPU 是對(duì)RAM進(jìn)行操作,它一般接到CPU的地址線A8上;AD0~AD7為地址數(shù)據(jù)總線;ALE 是地址鎖存信號(hào)輸入線;RD、WR分別是讀、寫控制線;RESET是復(fù)位線。當(dāng)RESET=1時(shí),8155被復(fù)位。與外部設(shè)備連接的引腳有:TMRIN(timerin)是計(jì)數(shù)輸入線;接到待測(cè)的脈沖源;TMROUT(timerout)是計(jì)數(shù)輸出線;PA0~PA7為A口的8位輸入/輸出線;PB0~PB7為B口的8位輸入/輸出線;PC0~PC5為C口的6位輸入/輸出線。各接口的工作方式由控制命令決定。 8155各引腳功能說(shuō)明如下:RST:復(fù)位信號(hào)輸入端,高電平有效。復(fù)位后,3個(gè)I/O口均為輸入方式。AD0~AD7:三態(tài)的地址/數(shù)據(jù)總線。與單片機(jī)的低8位地址/數(shù)據(jù)總線(P0口)相連。單片機(jī)與8155之間的地址、數(shù)據(jù)、命令與狀態(tài)信息都是通過(guò)這個(gè)總線口傳送的。RD:讀選通信號(hào),控制對(duì)8155的讀操作,低電平有效。WR:寫選通信號(hào),控制對(duì)8155的寫操作,低電平有效。CE:片選信號(hào)線,低電平有效。IO/M :8155的RAM存儲(chǔ)器或I/O口選擇線。當(dāng)IO/M =0時(shí),則選擇8155的片內(nèi)RAM,AD0~AD7上地址為8155中RAM單元的地址(00H~FFH);當(dāng)IO/M =1時(shí),選擇 8155的I/O口,AD0~AD7上的地址為8155 I/O口的地址。ALE:地址鎖存信號(hào)。8155內(nèi)部設(shè)有地址鎖存器,在ALE的下降沿將單片機(jī)P0口輸出的低8位地址信息及 ,IO/ 的狀態(tài)都鎖存到8155內(nèi)部鎖存器。因此,P0口輸出的低8位地址信號(hào)不需外接鎖存器。PA0~PA7:8位通用I/O口,其輸入、輸出的流向可由程序控制。PB0~PB7:8位通用I/O口,功能同A口。PC0~PC5:有兩個(gè)作用,既可作為通用的I/O口,也可作為PA口和PB口的控制信號(hào)線,這些可通過(guò)程序控制。TIMER IN:定時(shí)/計(jì)數(shù)器脈沖輸入端。TIMER OUT:定時(shí)/計(jì)數(shù)器輸出端。VCC:+5V電源。(1) 壓力傳感器的選定 3.5 總設(shè)計(jì)圖 圖3-5 總設(shè)計(jì)圖4. 系統(tǒng)程序設(shè)計(jì) 4.1 主程序流程圖 
圖4-1 主程序流程圖 系統(tǒng)工作流程:(1)用菊陽(yáng)仿真器使程序處于連續(xù)運(yùn)行狀態(tài) (2)顯示模塊顯示當(dāng)前樓層,主程序不斷地執(zhí)行鍵盤掃描程序,當(dāng)有鍵盤輸入時(shí),主程序調(diào)用定時(shí)器中斷程序,并通過(guò)行列掃描方式讀取到是哪個(gè)鍵盤輸入。 (3)讀取到鍵盤之后,主程序調(diào)用顯示子程序,通過(guò)顯示上下和當(dāng)前樓層信息和LED輸出當(dāng)前按下鍵的信息以及開(kāi)關(guān)門的信息向操作人員傳遞信息。 系統(tǒng)主程序流程圖如圖4-1所示。 4.2 定時(shí)器子程序流程圖 圖4-1 定時(shí)器程序流程圖 定時(shí)器子程序主要任務(wù)是完成3秒的定時(shí),使顯示模塊能保持一段時(shí)間,使人能夠觀察到具體信息。如果沒(méi)有這一模塊,靠系統(tǒng)時(shí)鐘來(lái)控制,一些中間過(guò)程根本看不出來(lái),也給軟件仿真和硬件仿真帶來(lái)不小的困難。 4.3 掃描子程序流程圖 掃描子程序主要任務(wù)是通過(guò)行列掃描方式確定具體鍵盤的輸入,先讓PA口輸出低電平,逐行掃描,直到能確定哪行有輸入,然后讀取PC口的信息,再與設(shè)定值進(jìn)行比較,最后通過(guò)選擇環(huán)節(jié),確定最終的鍵盤號(hào),如proteus圖中所示,PC0-PC3作為行線,PA0-PA2作為列線,相互配合完成掃描確認(rèn)工作,最終轉(zhuǎn)到輸出子程序并將所輸入的信息轉(zhuǎn)化為具體的上下和數(shù)字輸出,完成鍵盤掃描子程序的基本任務(wù)。 
圖4-2 鍵盤掃描流程圖 控制子程序流程圖如圖4-2所示。 4.4 顯示子程序流程圖 
圖4-4 顯示子程序流程圖 4.5 延時(shí)流程圖 圖4-5 延時(shí)程序流程圖 5. 系統(tǒng)調(diào)試 5.1 Proteus軟件仿真調(diào)試 系統(tǒng)初始狀態(tài)在意、1樓等候,以下為遇到的情況: (1)當(dāng)按下2樓上,顯示欄會(huì)顯示上和上到2樓的信息,同時(shí)到2樓之后,開(kāi)門LED會(huì)同時(shí)點(diǎn)亮。上樓按法和顯示同上。 (2)當(dāng)樓層上升到4樓,按下下樓按鍵,顯示欄會(huì)顯示經(jīng)過(guò)的樓層以及到達(dá)樓層,同時(shí)LED在開(kāi)門時(shí)會(huì)點(diǎn)亮,下樓按法和顯示同上。 (3)當(dāng)在電梯外部按完,開(kāi)門LED點(diǎn)亮之后,接下來(lái)按你所要去的樓層,到達(dá)目標(biāo)樓層之后,開(kāi)門LED會(huì)點(diǎn)亮,同時(shí)顯示上下和樓層信息。 調(diào)試中所遇到的問(wèn)題: ( 1 )鍵盤不能被鍵盤掃描程序讀取,最終發(fā)現(xiàn)是沒(méi)有接上拉電阻,接上上拉電阻模塊之后,鍵盤可以可靠地被掃描 (2)8155不能正常擴(kuò)展電路,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é)
通過(guò)此次電梯控制系統(tǒng)的設(shè)計(jì),我收獲頗豐。設(shè)計(jì)的核心內(nèi)容就是利用單片機(jī)C51的編程來(lái)實(shí)現(xiàn)控制外圍各電路的運(yùn)行。通過(guò)本次設(shè)計(jì),我熟練掌握了程控系統(tǒng)設(shè)計(jì)的一般步驟,熟悉了編程軟件的用法,并對(duì)編程能力起到了一定的提高作用。
感謝學(xué)校給我們這次機(jī)會(huì),鍛煉了我們的動(dòng)手能力及運(yùn)用專業(yè)軟件的能力。通過(guò)這次課設(shè)讓我明白了理論和實(shí)際操作之間差距,而且也讓我很明確得意識(shí)到自己在數(shù)電上有很多的知識(shí)漏洞,以后應(yīng)該多鉆研一下。這次課程設(shè)計(jì)我主要負(fù)責(zé)文論撰寫,在寫論文過(guò)程中積極和同組同學(xué)探討電梯的基本原理,每個(gè)模塊的功能及如何實(shí)現(xiàn)。對(duì)Office套件的使用更熟悉,為以后畢業(yè)論文的撰寫奠定了一定基礎(chǔ)。最后再次感謝這次課程設(shè)計(jì)。
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; //定時(shí)時(shí)間到標(biāo)志
- uchar counter; //計(jì)數(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) //簡(jiǎn)單延時(shí)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; //開(kāi)定時(shí)器
- TR0=1; //啟動(dòng)定時(shí)器T0
- }
- void run(){
- iniclock(); //開(kāi)定時(shí)
- while(~flag1){ //時(shí)間未到掃描鍵盤
- keyscan();
- display();
- }
- flag1=0; //時(shí)間到了,清標(biāo)志位,關(guān)定時(shí)器
- TR0=0;
- ET0=0;
- }
- void main()
- {
- state=1;
- statepre=1;
- flag=1;
- flag1=0;
- COM=0x43; //intialize 8155
- TMOD=0x01; //定義定時(shí)器0/1為定時(shí)器模式
- //TH0=(65536-50000)/256;//50ms初值
- //TL0=(65536-50000)%256;
- //ET0=1; //開(kāi)定時(shí)器
- //TR0=1; //啟動(dòng)定時(shí)器T0
- EA=1; //開(kāi)中斷
-
-
- while(1){
- switch(state){ //掃描電梯所在位置
- case(1):{
- //up1=0; //一樓的按鍵燈都熄滅
- //in1=0;
- //lup1=1;
- //lin1=1;
- //keyscan;
- //display();
- if(state!=statepre){ //上次的狀態(tài)和本次不一樣說(shuō)明電梯 需要開(kāi)門
- lopen=0;
- run(); //按鍵掃描三秒鐘
- lopen=1;
- in1=0; //如果in1和up1被按下則無(wú)效
-
- 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; //說(shuō)明上行
- run(); //按鍵掃描三秒鐘
- state=2; //更新?tīng)顟B(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)不一樣則可能需要開(kā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被按下則無(wú)效
-
- if(flag==1){ //如果上行,電梯外上行指示燈按下無(wú)效
- up2=0;
- lup2=1;
- }
- else{ //如果下行,電梯外下行指示燈按下無(wú)效
- 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)不一樣則可能需要開(kā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被按下則無(wú)效
-
- if(flag==1){ //如果上行,電梯外上行指示燈按下無(wú)效
- up3=0;
- lup3=1;
- }
- else{ //如果下行,電梯外下行指示燈按下無(wú)效
- 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){
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址(內(nèi)附仿真圖與源程序+word格式的完整報(bào)告文檔):
四層電梯最終版11.zip
(1.07 MB, 下載次數(shù): 856)
2018-7-12 21:25 上傳
點(diǎn)擊文件名下載附件
|