久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 45751|回復: 5
打印 上一主題 下一主題
收起左側

單片機電梯控制系統設計論文下載

  [復制鏈接]
跳轉到指定樓層
樓主

題目

基于單片機的電梯控制系統


圖26 電梯模型外觀圖
1.
(設計)應完成的主要內容
基于單片機的電梯系統主要有信號檢測、聲光運動控制部分構成,電梯可以實時進行電梯位置檢測,控制信號檢測,并有相應的聲光信號顯示,驅動電機拖動電梯模型進行相應的運動。電梯系統可以具有應急保護功能,獨立供電模塊。

2(設計)的目標及具體要求

   基本功能:
(1)顯示:本設計要求實現5層控制, 電梯運行時應有相應指示燈亮,以示電梯正在上行或下行,實時顯示電梯所在樓層位置。
(2)升降控制:當某層有呼叫有相應呼叫信號顯示。電梯模型作相應的運動,并準確平層,當有多人同時進行電梯請求時,需要對請求信號排序。
(3)平層時呼叫信號消失,并進行開門、關門操作,平層結束時給出提示信號。要求平均每層運行時間不超過5秒。
(4)具備不可逆響應的功能:電梯上升途中只響應上升呼叫,下降途中只響應下降呼叫,任何反方向呼叫均無效。電梯門不關上,啟動電梯運行無效。

擴展功能:
(1)可采用遙控控制或感應操作功能。
(2)出現意外情況時,要求電梯隨時能夠緊急停車、待命,并發出相應的聲音通知外界。情況正常后重新恢復受控狀態。
(3)電梯系統能顯示當前時間,同時可以通過鍵盤對系統時間進行設定
(4)電梯采用獨立電源模塊


研究目的和意義

電梯是標志現代物質文明的垂直運輸工具、是機電一體化的復雜運輸設備。它涉及電子技術、機械工程、電力電子技術、微電腦技術、電力拖動系統和土建工程等多個科學領域。盡管電梯的品種繁多,但目前使用的電梯絕大多數為電力拖動、鋼絲繩曳引式結構。從電梯各構件部分的功能上看,可分為八個部分:曳引系統、導向系統、轎廂、門系統、重量平衡系統、電力拖動系統、電氣控制系統和安全保護系統。
作為高層建筑物上下交通運輸的重要設備,越來越多的機電專業將參與電梯技術方面的工作,為了掌握電梯的結構和控制技術就有必要把這龐大的集機械、電氣、傳感器于一體的產品模擬化,用PLC、單片機、微機、變頻器等控制手段去開發多功能應用軟件,對提高學生的綜合應用程序設計能力也將是非常有益和非常有效的。因此設計了一套完整的電梯控制系統,該系統可以和任何自動控制單元相連接作為下位機,也可以單獨使用作為一般主控系統,驗證各種電梯調度算法。



三、 國內外現狀和發展趨勢與研究的主攻方向

目前,我國國產電梯大部分為繼電器、PLC控制方式以及單片機控制方式。
繼電-接觸系統:它的優點是線路直觀,大部分電器均為常用電器,更換方便,價格較便宜。但是他觸點繁多,線路復雜,電器的電磁機構及觸點動作較慢,能耗高,機械動作噪音大,而且可靠性差。繼電器控制系統性能不穩定、故障率高,大大降低了電梯的舒適性、可靠性和安全性,經常造成停梯,給乘用人員的生活和工作帶來了很多不便,因而傳統的電梯控制系統的更新勢在必行。
PLC(可編程控制器)在電梯控制中得到了廣泛的應目前。PLC在設計和制造上采取了許多抗干擾措施,使用方便,擴展容易。它使用了梯形圖和可編程指令,易于掌握。電梯控制器通常由PLC實現基本能力,但是如果要實現電梯智能化,則PLC稍嫌不足。
單片機以其卓越的性能,得到了廣泛的應用,已深入到各個領域。單片機應用在檢測、控制領域中,具有如下特點。
一、成本低。本電梯控制由于采用單片機代替了PLC作為主控芯片, 同時用PWM 驅動直流電機代替了變頻調速驅動,從而導致整套系統成本很低。
二、高精度的重量檢測及顯示。基于PLC的電梯模型雖然有重量檢測,但檢測精度較低。本電梯模型采用高精度的重量傳感器和測量電路, 配合設計優良的數字處理軟件,從而能進行高精度的重量檢測和顯示.
三、 可靠性好,適應溫度范圍寬。單片機芯片本身是按工業測控環境要求設計的,能適應各種惡劣的環境,這是其它機種無法比擬的。
四、 易擴展,很容易構成各種規模的應用系統,控制功能強。單片機的邏輯控制功能很強,指令系統有各種控制功能用指令。
五、 可以很方便的實現多機和分布式控制。
六、 單片機可以構成形式多樣的控制系統、數據采集系統。




四、 主要研究內容需重點研究的關鍵問題及解決思路

電梯工業是極為重要的基礎產業,其控制部分在工業發達國家已實現了高度智能化,由于單片機具有體積小、線路簡單、無噪音、可靠性高、維護方便,同時能方便實現多臺電梯的群控, 并通過通訊接口與樓宇自動化系統聯接, 實施對電梯的監控,因此利用單片機來對電梯進行控制的開發顯得至關重要。本次設計了一種實用的模擬電梯控制器,配合相應的軟件實現了對模擬電梯的實時控制。
該設計采用單片機AT89S52實現基本的簡易電梯模型,由于其功能的實現主要通過軟件編程來完成,那么就降低了硬件電路的復雜性,而且更能體現智能思維,AT89S52是低功耗、高性能的CMOS型8位單片機。片內帶有8KB的Flash存儲器,且允許在系統內改寫或用編程器編程。另外,AT89S52的指令系統和引腳與8051完全兼容,片內有128B 的RAM、32條I/O口線、2個16位定時計數器、5個中斷源、一個全雙工串行口等,完全滿足該課題的需要。
作為小型化的電梯模擬裝置,其控制器的設計應遵循簡單可靠以及成本低、維護方便等原則。控制器的處理器采用了8位單片機,外圍擴展鍵盤采用矩陣鍵盤輸入、位置檢測采用反射式紅外光電傳感器,并配以LED顯示當前運行信息。電梯模擬器的機械部分采用了絲杠傳動加直流電機配以減速齒輪驅動,距離移動十分精確,無運行積累誤差。
總體設計框圖如下圖1:


本系統采用自帶2 路電源+5V、+12V分別對各部分電路供電:
電梯位置檢測采用反射式紅外線發射-接收器如下圖:

     

電機控制采用調節方波的占空比大小來控制直流電機的轉速,控制轎廂移動高度。整個電機的運行過程大致如圖所示:
數碼管顯示,設計中在轎廂和每個樓層中都設置了一個數碼顯示管,用來顯示當前電梯所在的層數。由4511來驅動8位數碼管顯示電梯所到達的樓層數和電梯的運行狀況。接線圖如下:
轎廂內設緊急報警按鈕,當電梯突然發生故障使轎箱內的人被困時,可以通過按下緊急報警按鈕,使緊急報警燈亮同時發出音響信號,控制過程如下:
采用555做成的多諧振蕩器產生的方波信號來控制小功率的蜂鳴器工作,將555定時器的Vi1和Vi2接在一起可以接成施密特觸發器。我們把施密特觸發器的反相輸出端經RC積分電路接回到它的輸入端,就構成了多諧振蕩器。
基于單片機電梯控制系統


【摘要】本文介紹了以 80C51單片機為核心控制器件的電梯自動控制系統,包括課題概述、方案論證、硬件設計、軟件設計、系統調試等幾個部分。該系統采用單片機作為控制核心,通過掃描內外按鍵按下與否引起的電平的改變,作為用戶請求信息發送到單片機,控制電動機轉動,單片機根據樓層檢測結果控制電機停在目標樓層。硬件部分主要由單片機最小系統模塊、樓層檢測模塊、層位數碼管顯示、電動機驅動模塊、按鍵掃描模塊、報警模塊、上下行呼叫指示電路等部分組成。樓層檢測使用光電傳感器,電梯運行到相應樓層時,光電傳感器產生電平變化,送到單片機來確定樓層數,電動機控制部分采用直流電機及H橋驅動電路。軟件部分介紹了系統程序設計思路、程序功能分析,著重介紹了主程序的邏輯結構,還分別介紹了報警、演示功能、按鍵掃描、層位讀取、顯示、電梯控制邏輯等子程序的結構和功能。軟件部分使用C語言,利用中斷方式來檢測樓層的檢測信息,并送到數碼管進行顯示。硬件設計簡單可靠,結合軟件,基本實現了五層電梯運行的模擬。

【關鍵詞】AT89C51;直流電機;紅外傳感器;電梯控制;
1


前言


基于單片機的電梯控制系統
1 前言
隨著人們生活水平的不斷提高和國內經濟的迅速發展。各大城市建筑物在不斷向高層化發展。因此電梯在我們的生活中起著舉足輕重的作用。電梯已不僅是一種生產環節中的重要設備,更是一種人們頻繁乘用的交通運輸設備。
2008年奧運會和2010年世博會在中國的舉辦,將有力的帶動電梯革命的節能環保化發展,電梯產業的前景和走勢也隨著社會的需求悄然發生著改變。市場對新一代的綠色電梯、節能電梯和智能電梯的需求越來越旺盛。國內外電梯企業順應市場需要,加大研發投入,都準備在未來新概念電梯產業發展中占得先機。

1.1  課題的提出及研究意義
電梯是集機械原理應用、電氣控制技術、微處理技術、系統工程學等多科學和技術分支于一體的機電設備,它是建筑中永久垂直交通工具。電梯作為生產生活的典型運載工具使用已十分普及,其控制信號類型多,關系復雜,要求的控制性能特別高。隨著經濟的發展高層建筑越來越多對電梯的運行速度和控制性能也提出了更高的要求。而在我國于八十年代初至九十年代初投入使用的電梯,其中絕大部分采用繼電器—繼電器陣列結構該結構體積大、接線復雜、噪音大、觸點易磨損、故障率高、維護工作量大,已無法滿足現代社會的需要。
自上世紀80年代以來,微機控制系統得到了極大的發展,現已深人到我國工農業生產的各個方方面面,隨著電力電子技術和微電子技術的發展,使得以微機為核心的控制系統得到廣泛應用。尤其是單片機的開發與應用,其深度和廣度越來越大。微機應用于電梯控制系統,與傳統的采用繼電接觸邏輯控制系統相比,具有很大優越性,一方面,它使整個系統的體積減小,可靠性提高,使用壽命延長;另一方面,它還簡化了安裝調試和維護維修的工作量,使整個電梯的運行成本降低。更突出的優點是微機具有靈活的算術和邏輯運算功能,具有很強的通信和可擴展功能,實現更完善的自動控制。
常用的微機控制主要的有兩種技術:基于PLC控制和基于單片機控制兩大技術。可編程控制器,是微機技術與繼電器常規控制技術相結合的產物,是在順序控制器和微機控制器的基礎上發展起來的新型控制器,是一種以微處理器為核心用作數字控制的專用計算機,它有良好的抗干擾性能,適應很多工業控制現場的惡劣環境,所以現在的電梯控制系統主要還是由可編程控制器控制。但是由于PLC的針對性較強,每一臺PLC都是根據一個設備而設計的,所以價格較昂貴。而單片機價格相當便宜,也不像PLC那么有針對性,可以隨著設備的更新而不斷修改完善,更完美的實現設備的升級。基于單片機控制的電梯可以大大的降低成本而且運行也較可靠,采用單片機來實現老式電梯控制系統的改造無疑是最佳方案。由于單片機具有體積小、線路簡單、無噪音、可靠性高、維護方便,是一種少投入、高回報的方案。同時能方便實現多臺電梯的群控,并通過通訊接口與樓宇自動化系統聯接,實施對電梯的監控。
1.2  國內外電梯系統技術的發展現狀
在現代社會和經濟活動中,電梯已經成為城市物質文明的一種標志。特別是在高層建筑中,電梯是不可缺少的垂直運輸工具。
電梯作為垂直運輸的升降設備,其特點是在高層建筑物中所占的面積很小,同時通過電氣或其它的控制方式可以將乘客或貨物安全、合理、有效地送到不同的樓層。基于這些優點,在建筑業特別是高層建筑飛速發展的今天,電梯行業也隨之進入了新的發展時期。
電梯的存在,使得每幢大型高樓都可以成為一座垂直的城市。在紐約的前世界貿易中心大樓里,除每天有5萬人上班外,還有8萬人次的來訪和旅游,因此250臺電梯和75臺自動扶梯的設置和正常運行,才使得合理調運人員、充分發揮大樓的功能成為現實。中國第一高樓、坐落在上海浦東的金茂大廈,高度420.5m,主樓地上88層,建筑面積220000㎡,集金融、商業、辦公和旅游為一體,其中60臺電梯、18臺扶梯的作用是顯而易見的。
20世紀初,美國出現了曳引式電梯,其結構見圖1。從圖中可見,鋼絲繩懸掛在曳引輪上,一端與轎廂連接,而另一端與對重連接,隨曳引輪的轉動,靠鋼絲繩與曳引輪槽之間的摩擦力,使轎廂與對重作一生一降的相反運動。顯然,鋼絲繩不用纏繞,因此鋼絲繩的長度和股數均不受控制,當然轎廂的載重量以及提升的高度就得到了提高,從而滿足了人們對電梯的使用需求。因此,近一百年來,曳引電梯一直受到重視,并發展沿用至今。
     圖1 曳引式電梯示意圖
1—轎廂  2—曳引輪  3—對重
在后來的幾十年里,電梯的自動平層控制系統已經通過變換電動機級數的調速方法來調整電梯運行速度的技術相繼研制成功,1933年,世界上第一臺運行速度為6 m/s 的電梯被安裝在美國紐約的帝國大廈。
第二次世界大戰后,建筑業的發展促使電梯進入了高峰發展時期,代表新技術的電子技術被廣泛應用于電梯領域的同時,陸續出現了群控電梯、超高速電梯。
隨著電力電子技術的發展,晶閘管變流裝置越來越多地用于電梯系統,使電梯的拖動系統簡化,性能提高。同時交流調壓調速系統的研制和開發,使交流電梯的調速性能有了明顯的改善。進入20世紀80年代,通過控制電動機定子供電電壓與頻率調整電梯運行速度的調壓調頻技術研制成功,出現了交流變壓變頻(VVVF)調速電梯,開拓了電梯拖動的新領域。1993年,日本生產了12.5m/s的世界最高速交流變壓變頻調速電梯,結束了支流電梯獨占高速電梯領域的歷史。
電梯發展到今天,在使用需求和新技術應用方面都到了全面發展的時期。隨著智能化、信息化建筑的興起與完善,要求電梯不只是完成垂直運輸的基本功能,還應以人為本,提高舒適度,特別從電梯運行的控制智能化角度考慮,電梯的優質服務不再是單一的“時間最短”問題,而是采用模糊理論、神經網絡、專家系統等方法,以期實現單梯與群控管理的最佳模式、合理的配置與使用、遠程監控與故障診斷、節能以及減少環境污染等。
1.3  課題研究的內容
隨著科技的發展,微型計算機領域的不斷進步,將使得將來電梯的體積大大減小,功能不斷完善,過程的控制更平穩、可靠、抗干擾性能增強、機械與電氣部件被機結合在一個設備內,把儀表、電子和計算機的功能綜合在一起。因此微型計算機控制技術將會成為電梯運行中的關鍵技術。
本次設計的主要內容是以單片機為主控制器的電梯控制系統。本來電梯系統是一個相對復雜的系統,由于能力和經驗有限,所以只能實現基本的功能如:層站呼叫、自動停層、轎廂命令響應等。通過單片機輸出電壓通過驅動電路然后控制電梯拖動。在此,本文以五層電梯為研究對象,選用51單機(該機芯片選為AT89S52)作為其控制器,研究微機控制梯系統的設計方法。根據問題的提出、意義和文獻綜述,本課題研究的具體內容包括以下四個方面:

(1)對電梯系統常用的控制方法的研究
(2)電梯控制系統硬件組成及其原理
(3)電梯的單片機系統軟件設計
(4)電梯在信號傳輸中遇到的問題
1


方案論證
2  方案論證
2.1 主控芯片選擇                          
方案一:多片單片機控制方案。這種方案是使用多片單片機,其中一片是作為主控制器,另外設置了轎廂控制系統,每層的控制系統分別由一個單片機控制,然后通過主控制器和副控制器之間的通訊,實現電梯系統的控制。這種方案的控制系統的結構簡單明了,各個系統之間相互獨立便于維護和修檢。所以根據功能要求需要選用5片AT89C2051單片機就可以實現該電梯的功能。不過單片機之間的通訊較多,在目前通訊是個難點,可能導致電梯運行過程不夠穩定。
方案二 :采用CPLD 器件作為控制中心,對整個系統的運作進行統一管理,但這種方案要求平時有很多的知識積累和較強的專業水平,實現起來比較困難且器件較貴,不符合經濟要求,而且升降電機的控制,運行時間的測量、顯示等還需要單片機的配合。
方案三:一片單片機為主控制器的方案。MCU采用一個單片機控制所有的按鍵、數碼管顯示、電動機的轉動、傳感器的輸出信號等,并對以上所有信號進行處理。這種方案的控制系統相對復雜,只適用于較簡單的電梯控制系統,因為這次的設計的內容是5層電梯控制系統,所以選用這種方案。單片機技術目前較為成熟,自身資源豐富,硬件設計簡單,成本低,可靠性高,結合軟件完全可以實現電梯運行狀況的簡單模擬。
權衡以上方案的分析,采用方案三。
2.2  定位平層模塊
方案一:采用金屬接近開關檢測電梯層數。在轎廂安裝金屬片,并在豎井各個樓層設置金屬接近開關,當轎廂運動到特定位置,豎井上的金屬接近開關探測到金屬片,其輸出發生變化。單片機通過金屬接近開關輸出的變化知道電梯轎廂的位置。該方案安裝的金屬片會加重轎廂重量,并且金屬接近開關體積較大、安裝不便、成本較高。
方案二:采用紅外發射對管檢測電梯層數。在豎井各個樓層設置紅外發射對管。當接通電源時,紅外線發射管不斷發射紅外線,當轎廂運動到特定位置(即樓層位置),紅外線接收頭接收到紅外線輸出發生變化,單片機通過紅外線接收頭輸出的變化知道電梯轎廂的位置。該傳感器的響應時間為2.5ms,且體積小、功耗低、容易安裝。
基于上述方案的分析,選擇方案二。
2.3  樓層顯示模塊
方案一:采用點陣式液晶顯示器(LCD)顯示各種相關數據以及信息。點陣式液晶顯示器屬于低功耗器件,但其價格較貴。
方案二:采用傳統的7段數碼管(LED)顯示電梯實時所到的樓層。雖功耗大,但其軟件驅動簡單,硬件電路調試方便,價格便宜,亮度大,能滿足本設計的要求。
以上兩種方案中,選擇方案二。
2.4  聲音提示模塊
方案一:采用美國ISD公司的2590語音芯片,該語音芯片錄放時間為90 秒。ISD2500 系列具有抗斷電、音質好,使用方便等優點。它的最大特點在于片內E2PROM容量為480K,所以錄放時間長;有10個地址輸入端,尋址能力可達1024 位;最多能分600 段;設有OVF(溢出)端,便于多個器件級聯。
方案二:采用蜂鳴提示音提示當轎箱到達所需的樓層時,蜂鳴器響,提示乘客到達了所需的樓層,另外可以作為緊急停止時的報警提示信號,其軟件驅動、硬件電路調試非常簡潔方便,而且價格便宜,能滿足本設計的要求。
以上兩種方案中,選擇方案二。
2.5  電動機模塊
方案一:采用步進電機作為本設計的執行元件,步進電機在定位性能方面十分優越。步進電機和普通電機的區別主要就在于其脈沖驅動的形式,步進電機不需要A/D 轉換,能夠直接將數字脈沖信號轉化成為角位移。常用的步進電機每轉一步,角度轉1.8°,在應用中,步進電機可以同時完成兩個工作,其一是傳遞轉矩,其二是傳遞信息,升降精度很高。

方案二:采用直流電機作為本設計的執行元件,直流電機工作是讓線圈始終交替地處于穩定狀態和非穩定平衡狀態,通過兩個半圓環形電樞將線圈的穩定平衡狀態消除掉。這樣,載流線圈在磁場中就會一直地轉動下去。直流電機在高起動轉矩、大轉矩、低慣量的系統中經常使用到。
此題目中電機要帶動的負載較大,對升降精度要求不是很,所以采用方案二。
2.6 電動機驅動模塊
我們使用的是直流電機,比較以下兩種方案實現對直流電機的驅動。
方案一:  小功率驅動電路可以采用如圖2所示的H橋開關電路。UA和UB是互補的雙極性或單極性驅動信號,TTL電平。開關晶體管的耐壓應大于1.5倍Us以上。當四個功率開關全用NPN晶體管時,需要解決兩個上橋臂晶體管(BG1和BG3)的基極電平偏移問題。圖3中H橋開關電路利用兩個晶體管實現了上橋臂晶體管的電平偏移。但電阻R上的損耗較大,所以也只能在小功率電機驅動中使用。
        圖2 H橋開關電路(Ⅰ)                        圖3 H橋開關電路(Ⅱ)                           
方案二:采用集成電機驅動控制芯片L298,該芯片內部包含有兩個集成H橋,能同時驅動兩路5到24 伏范圍電源的直流電機。                          
由于本系統只有一路直流電機,且功率較小,所以采用方案一中圖2方案。
1


硬件設計

3 硬件設計
3.1 總體方案設計
本次設計的基本思想是采用AT89S52單片機作為核心,利用其豐富的I/O接口與外圍電路配合進行控制。采用8位LED靜態顯示來實時顯示電梯所在樓層,并用4511來驅動LED顯示。采用行列式鍵盤矩陣作為外呼內選電路,由于是5層樓,故選用4×4矩陣鍵盤,鍵盤矩陣共16個按鍵,其中8個按鍵是各層樓外呼按鍵,5個表示電梯內部的選擇鍵,另外設有緊急停止按鍵,啟動按鍵和電梯演示按鍵。電梯狀態是通過兩個發光二極管顯示的,左邊燈亮表示電梯在向上運行,右邊燈亮表示電梯在向下運行,另設有一燈燈亮表示開門狀態,燈熄表示關門狀態。
電梯的系統PCB圖見附錄二圖22、圖23。
電梯模型效果圖如圖4所示:

          圖4 電梯模型效果圖
總體方框圖如圖5所示:






圖5 總體方框圖
3.2 單片機最小系統
單片機采用ATMEL公司的AT89S52,最小系統包括復位電路和時鐘電路兩部分,其中復位電路采用按鍵手動復位和上電自動復位組合,電路如圖6(左)所示:其中9 腳為單片機的復位端,電容C5按鍵RESET構成上電復位和手動復位電路。時鐘電路如圖3(右)所示:晶振采用的是12MHZ的,C1、C2為30p瓷片電容,XATL2和XATL1分別為單片機的18和19腳。







圖6 最小系統電路















3.3各模塊設計3.3.1  按鍵電路
由于本電路所需按鍵較多,為了節省單片機的I/O口,故選用行列式鍵盤矩陣。本電路采用的是4×4鍵盤矩陣。電路如圖7 所示,P3.0-P3.7是接單片機的P3 端口,單片機采用行和列掃描法來判別這16個按鍵中哪個鍵按下,然后可根據每個按鍵的功能來通過單片機控制電梯的運行。   鍵盤電路如圖7 所示:
              圖7鍵盤矩陣電路
各按鈕開關說明:
按鈕開關1:轎廂內一樓呼叫開關;按鈕開關2:轎廂內二樓呼叫開關;
按鈕開關3:轎廂內三樓呼叫開關;按鈕開關4:轎廂內四樓呼叫開關;
按鈕開關5:轎廂外二樓上呼叫開關;按鈕開關6:轎廂外三樓上呼叫開關;
按鈕開關7:轎廂外四樓上呼叫開關;按鈕開關8:轎廂內五樓呼叫開關;
按鈕開關9:轎廂外二樓下呼叫開關;按鈕開關10:轎廂外三樓下呼叫開關;
按鈕開關11:轎廂外四樓下呼叫開關 按鈕開關12:轎廂外五樓上呼叫開關;
按鈕開關13:轎廂內一樓呼叫開關;
按鈕開關14:演示功能按鍵;
按鈕開關15:緊急停止按鍵;
按鈕開關16:電梯啟動按鍵。
3.3.2 顯示電路
數碼管顯示,電梯的基本功能具備顯示電梯當前的樓層,所以設計中在轎廂和每個樓層中都設置了一個數碼顯示管,用來顯示當前電梯所在的層數,由4511來驅動8位數碼管顯示電梯所到達的樓層數。接線圖如圖8所示,圖中共有六個數碼管并聯,通過對四根數據線進行寫操作進行樓層顯示。
圖8  顯示部分接線圖
3.3.3 電機正反轉指示
在本次設計中電機正反轉用兩個發光管來表示,如圖9所示:用單片機的P1口做輸出口來驅動發光管,其中L1亮表示電機正轉、L2亮表示電機反轉、L3亮表示電機停轉,同時電梯開門。L3滅表示電梯關門,L3亮表示電梯開門,電梯運行時L1和L2必須有一個亮,來表示電梯的上行和下行。
圖9電機狀態指示
3.3.4  電源模塊
本系統采用L7805穩壓電路提供電壓+5V,對各部分電路供電,電源可以采用USB接口的方式輸入,也可以采用標準的電源輸入頭輸入,另外電源可以直接通過P13口對電機進行供電。






圖10  電源模塊
在降壓電路中應注意以下事項:
1、輸入輸出壓差不能太大,太大則轉換效率急速降低,而且容易擊穿損壞;
2、輸出電流不能太大,1.5A 是其極限值。大電流的輸出,散熱片的尺寸要足夠大,否則會導致高溫保護或熱擊穿;
3、輸入輸出壓差也不能太小,太小效率很差。
3.3.5  紅外發射接收電路               
在豎井各個樓層設置紅外發射接收管,在轎廂上下運動的過程當中紅外線發射管不斷發射紅外線,當轎廂運動到特定位置,豎井上的紅外線接收頭收到紅外線,其輸出發生變化。單片機通過紅外線接收頭輸出的變化知道電梯轎廂的位置。
      
圖11  紅外發射對管              圖12 紅外對管電路圖

圖11所示為反射式紅外線發射-接收器的示例。調整發射管的限流電阻(200 Ω),可以調整靈敏度,但是注意不能讓電流超過50mA,以免燒毀發射管。輸出側的10k電阻是提供“0”電平時的接地電阻,如果電路里已經有信號輸入的接地電阻,則可以省略本處的10kΩ電阻。此電阻阻值不能太小,否則高電平輸出會達不到3.5V以上。只要在紅外線發射-接收管前插入一件對紅外光有反射作用的物質,圖示的輸出端口“OUT”的電平立即從低變成高。只要在紅外線發射-接收管前插入一件對紅外光有無反射作用的物質,圖示的輸出端口“OUT”的電平立即從高變成低。如果該反射或無反射物質是循環連續動作的話,就是一種非常好的無觸點信號源位置檢測。
3.3.6  電機驅動電路
電機驅動部分采用常用的H橋電路,如下圖所示。在P2.4口輸入PWM信號對整個電路進行選通,通過調節PWM的占空比,實現電機運動過程的加速和減速的過程,從而完成電機的停止、平層操作。P2.5口為電機的正反轉控制,當P2.5為高電平時,Q3、Q2管導通,并通過電機構成回路,實現電梯的反轉,當其為低電平時,Q1、Q4管導通,通過電機構成了H橋的另一邊反向回路,實現了電梯的正轉,從而完成電機的正反轉控制。驅動電路PCB圖見附件二圖24、圖25。
仿真圖如圖13所示:
圖13  H橋電路仿真圖

3.3.7 按鍵指示
由于此部分只要求每層顯示上下標志,所以我們采用一般的發光二級管。此外,由于一樓和五樓只能分別上和下,故我們在一樓和五樓都只安裝一個發光二級管。由于單片機IO口資源有限,我們通過74HC573鎖存器實現電梯外部的八個發光二極管與矩陣鍵盤的P3口復用,通過P0.6選通,當需要對八個發光二極管進行操作時,需要先將P0.6置1進行選通,改變P3口數值,再置0對P3進行鎖存。其電路如圖14:
圖14 電梯外部按鍵指示復用電路
3.3.8  緊急報警
轎廂內設緊急報警按鈕,當電梯突然發生故障使轎箱內的人被困時,可以通過按下緊急停止按鈕,清除所有呼叫信號,并將電梯直接運行至一樓,并發出報警信號。由于這個部分要求電梯的任何運行狀況下都要有效,為保險起見,我們將此作為一個獨立的模塊。
      
圖15  蜂鳴器報警原理圖
1


軟件設計

4 軟件設計
本設計由于采用鍵盤矩陣來代替外呼內選按鈕,而電梯的運行方向是根據這些呼叫按鍵和選擇按鍵來決定的,所以單片機要不斷的掃描鍵盤來獲取各層呼叫狀態,從而控制電梯的運行。故鍵盤矩陣掃描是本系統軟件設計的重要一部分,另外要把鍵盤掃描到的各層的按鍵信息存儲起來,然后和電梯的運行狀態比較,判斷是否響應各層呼叫,當電梯到達目的樓層時電機停止,此時即可進、出乘客,乘客進入電梯之后可選擇去哪一層,然后電梯根據乘客的選擇判斷去哪一層,繼續運行。通過單片機控制電梯在上升過程中只響應上升呼叫,下降過程中只響應下降呼叫。
由于本設計采用單片機實現控制,其中主程序部分主要完成系統的初始化,如中斷方式的設置,開中斷等。在中斷子程序中完成樓層檢測等,其它的如數碼管的顯示,鍵盤的響應,轉動電機的控制,延時等均由相應的子程序來完成。
軟件設計思想:采用模塊化的分層次設計方法,將軟件系統功能由多個實現單一功能的子程序實現。通過調用不同的子程序,實現了復雜功能控制。這樣便于調試、修改。軟件編程是實現多功能、智能化、操作方便的關鍵。在本設計中,可以把程序的各部分相互結合起來,達到完成各項設計的功能。
4.1 電梯主程序
根據系統要求,電梯的程序應滿足以下要求:
(1)初始化程序使數碼管顯示“1”表示電梯處在一樓,等待人進入電梯;
(2)主程序主要包括:
①判斷乘客進入電梯后選擇去哪一層,根據判斷情況來控制電梯運行,到達目標樓層后相應的呼叫指示燈熄滅;
②電梯在運行過程中要不斷的掃描鍵盤,從而來判斷各樓層有無呼叫請求,并點亮相應的呼叫指示燈;
③設置演示功能按鍵、緊急停止按鍵、啟動按鍵;
④實時顯示電梯所在位置及運行狀態(上行/下行);
⑤開關門有一定的延時來保證乘客走出/進入電梯;
主程序流程圖如圖16所示。

圖16 主程序流程圖
電梯的整個軟件設計包括一下幾部分:電梯邏輯控制模塊、電梯運行模塊、鍵盤掃描模塊、樓層顯示模塊、指示燈關閉模塊、樓層檢測模塊、電梯功能演示模塊、電梯緊急停止模塊。






4.2 電梯邏輯控制
電梯控制中,單片機掃描樓層外呼內選信號,將樓層呼叫信號與當前樓層運行狀
態進行比較,確定電梯響應上升、下降隊列,然后電梯按照運行隊列進行電機控制。而將呼叫信號轉化為響應隊列的程序模塊是電梯控制的核心部分,其算法的嚴謹性,決定了電梯的控制性能。其程序源代碼見附錄一1.1,邏輯框圖如圖17所示:
圖17中斷邏輯圖
4.3 電梯運行控制
電梯響應上升下降隊列時,要對相應的指示燈、上下行狀態,以及響應隊列做相應的改變,而實現這一功能模塊的就是電梯運行函數。其程序源代碼見附錄一1.2,邏輯框圖如圖18所示:
圖18電梯運行邏輯圖
4.3  鍵盤掃描、樓層檢測
鍵盤掃描采用行掃描法,行掃描法又稱為逐行掃描查詢法,是一種最常用的按鍵識別方法。首先判斷鍵盤中有無鍵按下,將全部行線Y0-Y3置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。
然后判斷閉合鍵所在的位置,在確認有鍵按下后,即可進入確定具體閉合鍵的過程。依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。在確定各閉合按鍵后,對于每一個按鍵返回一個固定鍵值。當鍵盤返回鍵值后,對不同的鍵值進行鍵碼處理,產生相應的呼叫信號,并使相應的呼叫樓層指示燈燈點亮。程序源代碼見附錄一1.6。
樓層檢測采用中斷掃描的方式,在中斷子程序里對P0.0-P0.4進行掃描,當某一管腳為高電平時表示電梯運行至該樓層。
4.4  緊急停止、演示功能
為了提高電梯安全性能,設置緊急停止功能,當緊急停止鍵按下,所有呼叫信號清空,呼叫指示信號燈熄滅,同時電梯向一樓方向運行,蜂鳴器報警,當電梯運行到一樓,停止報警,等待電梯重新啟動信號。程序源代碼見附錄一1.3。
作為電梯模型,為了更方便的展示電梯所具有的功能,在系統中設計了一個演示功能按鍵,當電梯啟動后,第一次按下演示按鍵時,系統自動生成二樓、三樓、四樓的向上呼叫信號,以及五樓的向下呼叫信號,相應的指示燈點亮,系統按照此呼叫隊列運行;第二次按下演示按鍵時,系統自動生成四樓、三樓、二樓向下呼叫信號,以及一樓的向上呼叫信號,同時相應的指示燈點亮,系統按照此隊列運行。程序源代碼見附錄一1.4。
4.5  程序中位操作問題分析
由于系統顯示、控制信號較多,管腳多處復用,在程序里幾處需要對單片機的某一個端口進行位操作,并且不能改變其他管腳的值,下面進行分別分析。
樓層顯示部分:樓層顯示數碼管采用4511驅動,所連接的單片機的管腳為P2.0-P2.3,P2口剩下四個管腳連接電機,所以需要對P2口前四位進行操作顯示樓層信息,程序采用switch語句,判斷所需要顯示樓層數,然后對P2.0-P2.3進行相應的位操作,從而顯示樓層信息。程序源代碼見附錄一1.5。
按鍵指示燈部分:電梯外部按鍵指示燈是利用74HC573鎖存后與矩陣鍵盤共同連接至單片機P3口,在掃描鍵盤時需要用74HC573對八個指示燈進行鎖存,而對按鍵指示燈進行操作時,要求對任意一個指示燈進行點亮、熄滅操作,而且不能改變其他位的狀態。這就需要對八個指示燈當前狀態進行儲存,并將位賦值轉化為端口賦值的方式。程序中定義變量trap用以保存當前P3口值,當指示燈的某一位需要熄滅時,將此位與trap進行“或”操作形成新的trap賦給P3口,當指示燈某一位需要點亮時,將除了此位其他位的高與trap進行“與”操作形成新的trap值賦給P3口,從而完成位操作。
1


軟件設計

1


系統測試
5 系統測試
由于所設計的基于單片機的電梯控制系統包括軟件和硬件兩部份, 仿真時先對軟件進行編譯,然后再將已編譯無誤的軟件結合硬件在一起進行仿真,完成整個系統的仿真工作。
5.1 軟件編譯調試
在軟件調試中,采用keil仿真軟件進行程序調試。首先分別調試各個功能程序,再對整個程序進行調試,以便修改錯誤碼。具體的調試方法如下:
首先在keil軟件中選擇AT89C51作為CPU,將晶振頻率設置為12MHZ,然后新建一個.c文件,將各個功能程序錄入,先檢查程序有無明顯錯誤,保存過后編譯程序,當有錯誤時就根據提示加以修改,當各個功能程序編譯完成后,再對整個程序全速執行,查看程序有哪些地方出現錯誤,對應錯誤提示逐步調整程序,糾正錯誤直到程序正確無誤,調試結束后軟件調試界面如下:

圖19 軟件調試界面
5.2 硬件仿真
硬件仿真使用的是Proteus7.5.SP3,Proteus 是目前最好的模擬單片機外圍器件的工具,它可以仿真 51 系列、AVR,PIC 等常用的 MCU 及其外圍電路(如LCD,RAM,ROM,鍵盤,馬達,LED,AD/DA,部分SPI器件,部分IIC器件.)。
首先利用Proteus中的器件庫完成電路的連接,如下圖所示:

圖20 proteus仿真圖
然后右鍵AT89C51再左鍵,出現“Edit Componet”, 在 Program File 中單擊 出現文件瀏覽對話框,找到test.hex 文件,單擊確定.完成添加文件,單擊 OK 退出。單擊仿真按鈕,開始仿真,按下Start,系統開始工作,通過按F1—F5及各樓層按鍵,電梯都能完成請求,基本實現了電梯運行的模擬。




5.3 Delphi效果圖
圖21 Delphi效果圖
5.4 系統測試5.4.1方向優先測試
電梯按某方向運行時,優先響應該運行方向的按鈕;
測試初始時,轎箱位于一樓,按下二樓,三樓的上下按呼叫,和四樓的向下呼叫。按鍵順序可隨意。
測試結果:               
表1  方向優先測試           
停止樓層            電梯方向                  顯示
2                       上              2樓上呼叫注銷
3                       上              3樓上呼叫注銷
4                       上              4樓下呼叫注銷
3                       下              3樓下呼叫注銷
2                       下              2樓下呼叫注銷







結論:系統在向上運行時候,優先相應各樓層的向上呼叫信號,不響應向下的呼叫信號,向下運行時相反,符合設計要求。
5.4.2  距離優先測試
同一方向有多個按鈕呼叫時,優先響應最近的樓層。測試初始時,電梯位于任一層,如二樓。此時三樓和四樓分別向上呼叫。測試結果:先響應三樓呼叫,再響應四樓呼叫。
結論:電梯具有距離優先響應的功能,當多層同方向呼叫,首先響應距離當前樓層較近的呼叫,符合系統設計要求。
各按鈕呼叫時指示燈顯示正常,電梯響應該按鈕的呼叫后,其指示燈應自動熄滅。
5.4.3  綜合測試
測試條件:電梯位于1樓,進入三人,其中一人要到3樓,另兩人到4樓。電梯運行后,3樓和4樓有人向上呼叫,3樓有人向下呼叫到1樓。
測試結果:
表3  綜合測試           
停止樓層              電梯          方向顯示
3                      上    3樓內部和向上呼叫注銷,內部4樓呼叫
4                      上    4樓向上呼叫注銷
3                      下    3樓向下呼叫注銷,內部1樓呼叫
1                      下    內部1樓呼叫注銷

測試結論:系統具有方向優先、距離優先的功能,基本模擬了實際電梯運行,完成題目設計指標。







5.4.4  演示測試
測試條件:按下電梯啟動按鍵,然后按下演示按鍵,當電梯運行至五樓,第二次按下演示按鍵。
測試結果:
表4 演示測試           
停止樓層              電梯              方向顯示
2                      上             2樓向上注銷
3                      上             3樓向上注銷
4                      上             4樓向上注銷
5                      下             5樓向下注銷
4                      下             4樓向下注銷
3                      下             3樓向下注銷
2                      下             2樓向下注銷
1                      上             1樓向上注銷









1


小結與展望



測試結論:該測試比較完整的演示了電梯具有的性能,實現了多層呼叫請求的排序,對電梯進行運動控制,同時測試了樓層以及運行信息顯示,指示燈狀態信息的變化,經測試,電梯實現了系統要求。

6 小結與展望
經過認真的選擇和設計,最終完成了一個可以實現大部分功能的電梯控制系統。電梯系統為模擬實用客運電梯系統的模擬實驗裝置。它能實現實際客運電梯系統的絕大部分功能,包括:門廳呼叫功能,轎廂內選層功能,樓層實時顯示,電梯自動開關門功能,智能初始化功能,緊急停車功能,系統演示功能。
通過這次課程設計,受益匪淺,對單片機在實物中應用的能力得到很大的提高,首先是對整個電梯系統硬件的設計,在有限的IO口基礎上實現了諸多功能,對IO口管腳復用有了更深入的了解,對于電機學的知識也有了進一步的鞏固和加深。單片機構成一個控制系統后它的外圍電路、擴展電路以及一些通訊都是至關重要的,只有完善單片機的外部電路才能保證單片機能正常有效的工作。其次完成了對單片機的軟件設計,對矩陣鍵盤、數碼管顯示、電機控制、電梯邏輯控制有了更深入的了解,也對調試代碼的方法積累了寶貴的經驗。再次,而且在畢業設計過程中,不僅在學習上有了很大的提高對于我的意志力也得到了很好的鍛煉。
雖然本電梯控制系統已能滿足基本的電梯運行要求,但仍有許多需要改進的地方:
(1)增加與微機通信的接口,實現聯網控制,多臺電梯綜合控制由微機完成。
(2)優化電梯選向功能,使之隨客流量的變化而改變,達到高效運送乘客的目的。
(3)需輸入密碼才能乘電梯到達特殊檔層功能,且響應改樓層呼叫時不響應其他樓層呼叫。
(4)完善電梯各個模塊功能,如門控電機模塊,重力檢測模塊,電機調速驅動等系統,使電梯模型安全性更高,運行更加穩定。
我們相信,隨著科技的發展和更新,各種設備的控制器也在迅猛發展,以前的很多由PLC控制的工控設備已經逐漸被單片機控制的工控設備代替,單片機將能夠更好的發揮其體積小,功能全、便于修改更新的優點,成為將來電子控制器領域的魁首,而作為微處理器的重要領域,電梯控制系統將會像價格便宜、控制方便的單片機方向發展。
1



參考文獻
[1]  謝自美主編 《電子線路設計.實驗.測試(第二版)》 華中科技大學出版社 2002年
[2]  李建忠編著 《單片機原理及運用》  西安電子科技大學出版社  2001年
[3]  馮建華 趙亮編著 《單片機應用系統設計與產品開發》 人民郵電出版社  2004年
[4] 吳金戌 沈慶陽 郭庭吉《8051單片機實踐與應用》清華大學出版社,2002
[5] 張齊 杜群貴著,《單片機應用系統設計技術》,電力工業出版社,2007.7
[6] 童詩白 華成英主編,《模擬電子技術基礎 第三版》,高等教育出版社,2006.12
[7] 閻石主編,《數字電子技術基礎》,高等教育出版社,2007.11
[8] 譚浩強著,《C程序設計 第三版》,清華大學出版社,2006.6
[9] 李華主編,《MCS-5系列單片機實用接口技術》,北京航天航空出版社,2003.6
[10] 李惠昇,《電梯控制技術》,北京:機械工業出版社,2003
(1)徐愛鈞.智能化測量控制儀表原理與設計[M].(第2版).北京航空航天大學出版社.2004.9
(2)余發山,王福忠.《單片機原理及應用技術》.北京:中國礦業大學,2003
(3)何斌.電梯群控系統設計與應用[ D ].南京理工大學,2006 .
(4)王君明.電梯模型控制系統設計[J ]。湖北水利水電職業技術學院學報,2006.
(5)余兆棠,葉遠呈,蕭仁理.電梯控制系統改良與實現[J].電子測試,2006.
(6)金建峰,動態測量建立曳引電梯的能耗仿真模型[J ].機械設計與研究,2009.
(7)張漢杰,王錫仲,朱學莉.現代電梯控制技術[M].哈爾濱工業大學出版社,2001.
(8)架延東.電梯控制技術[M].北京:中國建筑工業出版社.1997.

附錄二
器件清單 管腳說明
1


主要器件清單
(1)有機玻璃板一張(1.85m*1.25m)
(2)直射式紅外對管5個
(3)直流電機一個
(4)萬能板5*7cm 6塊 9*15cm 1塊
(5)電壓穩壓器7805一片
(6)AT89S52
(7)12M晶振
(8)排阻4.7K,300Ω各一片
(9)按鍵開關 17個
(10)發光二極管30個
(11)8段數碼管6個。
(12)CD4511六片
(13)蜂鳴器一個。
(14)9012一個。
(15)TIP41、TIP42各兩個
(16)LM339二片
(17)74HC573一片
(18)電阻,電容若干
(19)排線若干
(20)杜邦頭、鐵芯若干
(21)其它(502、透明膠帶、熱融膠等)若干

管腳說明
(1)P0_0—P0_4 樓層檢測狀態
(2)P0_6    P3口復用功能選擇位
(74HC573片選位)
(3)P0_7                 蜂鳴器報警

(4)P1_0—P1_4 橋廂內部按鍵指示燈5個
(5)P1_5—P1_6 電梯行駛方向標志燈
(6)P1_7       橋廂開關門狀態燈

(7)P2_0—P2_3 樓層顯示數碼管
(8)P2_4—P2_7 步進電機

(9)P3_0—P3_7 矩陣鍵盤(5個橋廂內部按鍵,8個橋廂外部按鍵,啟動、停止、演示各一個)
(10)P3(74HC573復用功能)橋廂外部按鍵指示燈8個






1








附錄:系統PCB圖
圖22系統PCB圖
圖23 系統原理圖
2.2電機驅動電路板:
圖24電機驅動電路原理圖
圖25驅動電路PCB圖
附錄四:電梯模型實物圖

圖27 電梯主系統板(正面)
圖28 電梯主系統板(反面)

圖29 樓層呼叫顯示電路板
圖30電機驅動電路



附錄一:部分程序代碼
1.1 中斷邏輯子程序
  1. void interrupt_logic(void)
  2. {
  3.               if((0==down_list_flag)&&(0==up_list_flag))              /*判斷電梯是否在運行中 */
  4.               {
  5.                             if(0!=inside_request)//內部按鍵控制
  6.                             {
  7.                                             if(storey<inside_request)
  8.                                             {
  9.                                                             current_direction=up;
  10.                                                             input_up_list(inside_request);
  11.                                             }
  12.                                             else if(storey>inside_request)
  13.                                             {
  14.                                                             current_direction=down;
  15.                                                             input_down_list(inside_request);   
  16.                                             }
  17.                                             inside_request=0;
  18.                               }
  19.                             else if(0!=outside_request)//外部按鍵控制
  20.                             {
  21.                                           if(storey<(outside_request&0x0f))
  22.                                           {
  23.                                                         if(0x10<outside_request) 此時為下降請求時
  24.                                                         {
  25.                                                                       highest_floor_flag=1;//此時表明最高上升請求為一下降請求
  26.                                                                       outside_request&=0x0f;
  27.                                                         }
  28.                                                         input_up_list(outside_request);            
  29.                                                         current_direction=up;
  30.                                           }
  31.                                           else if(storey>(outside_request&0x0f))
  32.                                           {
  33.                                                         if(0x10>outside_request)//此時為上升請求時
  34.                                                                       lowest_floor_flag=1;//此時表明最低下降請求為一上升請求
  35.                                                         else
  36.                                                                       outside_request&=0x0f;
  37.                                                         input_down_list(outside_request);
  38.                                                         current_direction=down;
  39.                                           }  
  40.                                           outside_request=0;
  41.                             }
  42.               }
  43.               else                            /*若電梯正在運行*/
  44.               {
  45.                             if(0!=inside_request)//如果是內部按鈕控制
  46.                             {
  47.                                           if(up==current_direction)
  48.                                           {
  49.                                                         if(storey<inside_request) 表明此時請求樓層在當前樓層上面
  50.                                                         {
  51.                                                                       if(inside_request<=up_list[0])
  52. //此請求小于等于最高請求樓層則插入上升隊列
  53.                                                                                     input_up_list(inside_request);
  54.                                                                       else if(1==highest_floor_flag)
  55. //此請求大于最高請求樓層需判斷最高請求上下                                                                      {
  56.                                                                                     input_down_list(up_list[0]);//則將最大請求樓層插入向下隊列
  57.                                                                                     up_list[0]=inside_request;//將最大請求樓層變為此次請求的樓層
  58.                                                                                     highest_floor_flag=0;//表示最高請求樓層是上升請求
  59.                                                                       }
  60.                                                                       else//若為最高請求樓層向上請求則直接插入向上請求隊列
  61.                                                                                     input_up_list(inside_request);
  62.                                                         }
  63.                                                         else//表明此請求樓層在當前樓層下面,
  64.                                                         {
  65.                                                                       input_down_list(inside_request);//當次上升請求小于當前樓層則直接插入                                                        }
  66.                                           }
  67.                                           else                                          //電梯處于下降狀態
  68.                                           {
  69.                                                         if(storey>inside_request)//表明此時請求樓層在當前樓層下面
  70.                                                         {
  71.                                                         if(inside_request>=down_list[0])
  72. //此請求大于等于最低請求樓層則插入下降隊列
  73.                                                                       input_down_list(inside_request);
  74.                                                         else if(1==lowest_floor_flag)
  75. //若此請求小于最低請求樓曾則需判斷最低請求樓層為向上還是向下請求
  76.                                                                       {
  77.                                                                                     input_up_list(down_list[0]);//則將最小請求樓層插入向上隊列
  78.                                                                                     down_list[0]=inside_request;//將最小請求樓層變為此次請求的樓層
  79.                                                                                     lowest_floor_flag=0;//表示最小請求樓層是下降請求
  80.                                                                       }
  81.                                                                       else//若為最低請求樓層向下請求則直接插入向下請求隊列
  82.                                                                                     input_down_list(inside_request);
  83.                                                         }
  84.                                                         else//表明此請求樓層在當前樓層上面
  85.                                                         {
  86.                                                         input_up_list(inside_request);
  87. //當次下降請求大于當前樓層時則直接插入向上隊列
  88.                                                         }   
  89.                                }
  90.                                inside_request=0;
  91.                             }
  92.                             else if(0!=outside_request)//如果是外部按鈕控制
  93.                             {
  94.                                           if(up==current_direction)//若電梯正在往上運行則響應向上的請求
  95.                                           {
  96.                                                         if(0x10>outside_request)//表明請求為上升請求時
  97.                                                         {
  98.                                                                       if(storey<outside_request) 表明此時請求樓層在當前樓層上面
  99.                                                                       {
  100.                                                                                     if(outside_request<=up_list[0])
  101. //如果此上升請求小于等于最高請求樓層則直接插入上升隊列
  102.                                                                                                   input_up_list(outside_request);
  103.                                                                                     else if(1==highest_floor_flag)
  104. //若此上升請求大于最高請求樓曾則需判斷最高請求樓層為向上還是向下請求
  105.                                                                                     {
  106.                                                                                                   input_down_list(up_list[0]);//則將最大請求樓層插入向下隊列
  107.                                                                                                   up_list[0]=outside_request;//將最大請求樓層變為此次請求的樓層
  108.                                                                                                   highest_floor_flag=0;//表示最高請求樓層是上升請求
  109.                                                                                     }
  110.                                                                                     else//若為最高請求樓層向上請求則直接插入向上請求隊列
  111.                                                                                                   input_up_list(outside_request);
  112.                                                                       }
  113.                                                                       else//表明此請求樓層在當前樓層下面
  114.                                                                       {
  115.                                                                                     input_down_list(outside_request);
  116. //當次上升請求小于當前樓層時則直接插入向下隊列
  117.                                                                       }
  118.                                                         }
  119.                                                         else//表明請求若為下降請求時
  120.                                                         {
  121.                                                                       outside_request&=0x0f;
  122.                                                                       if(outside_request<=up_list[0])
  123. //若此下降請求小于等于最高請求樓層時直接插入下降隊列
  124.                                                                       {
  125.                                                                                     input_down_list(outside_request);
  126.                                                                       }
  127.                                                                       Else
  128. //若此下降請求大于最高請求樓層時則插入上升隊列并表明最高請求樓層的方向
  129.                                                                       {
  130.                                                                                     input_up_list(outside_request);
  131.                                                                                     highest_floor_flag=1;       //表示最高請求樓層是下降請求
  132.                                                                       }
  133.                                                         }
  134.                                           }
  135.                             else                    //若電梯正在往下運行則相應向下的請求
  136.                             {
  137.                                           if(0x10<outside_request) 表明請求為下降請求時
  138.                                           {
  139.                                                         outside_request&=0x0f;
  140.                                                         if(storey>outside_request)//表明此時請求樓層在當前樓層下面
  141.                                                         {
  142.                                                                       if(outside_request>=down_list[0])
  143. //如果此下降請求大于等于最低請求樓層則直接插入下降隊列
  144.                                                                                     input_down_list(outside_request);
  145.                                                                       else if(1==lowest_floor_flag)
  146. //若此下降請求小于最低請求樓曾則需判斷最低請求樓層為向上還是向下請求
  147.                                                                       {
  148.                                                                                     input_up_list(down_list[0]);//則將最小請求樓層插入向上隊列
  149.                                                                                     down_list[0]=outside_request;//將最小請求樓層變為此次請求的樓層
  150.                                                                                     lowest_floor_flag=0;//表示最小請求樓層是下降請求
  151.                                                                       }
  152.                                                                       else//若為最低請求樓層向下請求則直接插入向下請求隊列
  153.                                                                                     input_down_list(outside_request);
  154.                                                         }
  155.                                                         else//表明此請求樓層在當前樓層上面
  156.                                                         {
  157.                                                                       input_up_list(outside_request);
  158. //當次下降請求大于當前樓層時則直接插入向上隊列
  159.                                                         }
  160.                                           }
  161.                                           else//表明請求若為上升請求時
  162.                                          
  163. {
  164.                                                         if(outside_request>=down_list[0])
  165. //若此上升請求大于等于最低請求樓層時直接插入上升隊列
  166.                                                         {
  167.                                                                       input_up_list(outside_request);
  168.                                                         }
  169.                                                         else
  170. //若此上升請求小于最低請求樓層時則插入下降隊列并表明最低請求樓層的方向
  171.                                                         {
  172.                                                                       input_down_list(outside_request);
  173.                                                                       lowest_floor_flag=1;       //表示最高請求樓層是下降請求
  174.                                                         }
  175.                                           }
  176.                             }
  177.                             outside_request=0;
  178.                             }
  179.               }
  180. }

  181. 1.2 電梯運行子程序

  182. void lift_run(void)
  183. {
  184.               uchar i;
  185.               if((0==down_list_flag)&&(0==up_list_flag))
  186.               {
  187.                             motor_direction=0;

  188.                             up_dir=1;                                                      
  189.                             down_dir=1;                                          
  190.               }
  191.               else if(up==current_direction)
  192.               {
  193.                             if(0!=up_list_flag)
  194.                             {
  195.                                           motor_direction=up;
  196.                                           if(storey==up_list[0]) //到達樓層后電梯停轉
  197.                                           {
  198.                                                         motor_direction=0;//電梯停轉
  199.                                                         for(i=0;i<4;i++)
  200.                                                         {
  201.                                                                       up_list[i]=up_list[i+1];//在隊列中去除應最先響應的樓層
  202.                                                         }
  203.                                                         up_list[4]=0;
  204.                                                         turn_off_lights(storey);
  205.                                                         up_list_flag--;
  206.                                                       
  207.                                                         up_dir=1;                                                        //  電梯停止運行
  208.                                                         down_dir=1;
  209.                                          
  210.                                                         door_sta=0;                                                                      //顯示開門信號
  211.                                                         delay_s(3);                                                                      //開門延時3S
  212.                                          
  213.                                                         door_sta=1;                                                                      //顯示關門信號
  214.                                           }
  215.                                           else//若沒有到達樓層,則判斷是否電梯停轉,若停轉則啟動,沒有停轉就跳過
  216.                                           {
  217.                                                         if(motor_direction==0)
  218.                                                         {
  219.                                                                       motor_direction=up;
  220.                                                                       direction_display();
  221.                                                         }
  222.                                           }
  223.                             }
  224.                             else if((0==up_list_flag)&&(0!=down_list_flag))
  225. //若上升隊列為空而下降隊列不為空,則判斷下降隊列,
  226.                             {
  227.                                           current_direction=down;
  228.                             }
  229.               }
  230.               else if(down==current_direction)
  231.               {
  232.                             if(0!=down_list_flag)
  233.                             {
  234.                                           motor_direction=down;
  235.                                           if(storey==down_list[0])
  236.                                           {
  237.                                                         motor_direction=0;
  238.                                                         for(i=0;i<4;i++)
  239.                                                         {
  240.                                                                       down_list[i]=down_list[i+1];
  241.                                                         }
  242.                                                         down_list[4]=0;
  243.                                                         turn_off_lights(storey);
  244.                                                         down_list_flag--;
  245.                                          
  246.                                                         up_dir=1;                                             // 電梯停止運行
  247.                                                         down_dir=1;
  248.                                                       
  249.                                                         door_sta=0;                                            //顯示開門信號
  250.                                                         delay_s(3);
  251.                                                       
  252.                                                         door_sta=1;    //顯示關門信號
  253.                                           }
  254.                                           else
  255.                                           {
  256.                                                         if(motor_direction==0)
  257.                                                         {
  258.                                                                       motor_direction=down;
  259.                                                                       direction_display();
  260.                                                         }   
  261.                                           }
  262.                             }
  263.                             else if((0==down_list_flag)&&(0!=up_list_flag))
  264.                             {
  265.                                           current_direction=up;
  266.                             }
  267.               }
  268. }




  269. 1.3緊急停止子程序
  270. void elevator_stop (void)
  271. {
  272.               uchar bug;
  273.               if(stop_flag==1)
  274.                             {
  275.                                           for(bug=0;bug<5;bug++)
  276.                                           {
  277.                                                         up_list[bug]=0;
  278.                                                         down_list[bug]=0;
  279.                                           }
  280.                                           up_list_flag=0;
  281.                                           down_list_flag=0;
  282.                                           inside_request=0;
  283.                                           outside_request=0;
  284.                                          
  285.                                           trap=0xff;
  286.                                           outled_com=1;
  287.                                           P3=0xff;
  288.                                           Key_Delay();
  289.                                           outled_com=0;

  290.                                           P1=0xff;
  291.                                           do
  292.                                           {
  293.                                                         step=motor_run(2);
  294.                                                         storey=storey_test(step);
  295.                                                         storey_show(storey);
  296.                                                         buzzer=0;
  297.                                           }while(storey!=1);
  298.                                           stop_flag=0;
  299.                                           start_flag=0;
  300.                                           buzzer=1;
  301.                             }
  302. }            



  303. 1.4 演示功能子程序
  304. void elevator_show(void)
  305. {
  306.               static uchar show_dir=1;
  307.               if((show_flag==1)&&(show_dir==1))              //演示向上方向
  308.               {
  309.                             keyboard_detact(0x21); interrupt_logic();Key_Delay();
  310.                             keyboard_detact(0x22); interrupt_logic();Key_Delay();
  311.                             keyboard_detact(0x23); interrupt_logic();Key_Delay();
  312.                             keyboard_detact(0x34); interrupt_logic();Key_Delay();
  313.                             show_flag=0;show_dir=2;
  314.               }
  315.               else if((show_flag==1)&&(show_dir==2))              //演示向下方向
  316.               {            
  317.                             keyboard_detact(0x33); interrupt_logic();Key_Delay();
  318.                             keyboard_detact(0x32); interrupt_logic();Key_Delay();
  319.                             keyboard_detact(0x31); interrupt_logic();Key_Delay();
  320.                             keyboard_detact(0x41); interrupt_logic();Key_Delay();
  321.                             show_flag=0;show_dir=1;
  322.               }
  323. }
  324. 1.5 樓層顯示函數
  325. /*單片機P2口通過4511與數碼管相連接,顯示采用位操作進行數碼管顯示操作*/
  326. extern               void storey_show(uchar storey)
  327. {
  328.               switch (storey)
  329.               {
  330.                                case 1: led_3=0;led_2=0;led_1=0;led_0=1; break;              //“1”
  331.                             case 2: led_3=0;led_2=0;led_1=1;led_0=0; break;              //“2”            
  332.                             case 3: led_3=0;led_2=0;led_1=1;led_0=1; break;              //“3”
  333.                             case 4: led_3=0;led_2=1;led_1=0;led_0=0; break;              //“4”
  334.                             case 5: led_3=0;led_2=1;led_1=0;led_0=1; break;              //“5”

  335.                             default:break;
  336.               }
  337. }


  338. 1.6 鍵盤掃描函數
  339. uchar Keyscan(void)
  340.               {
  341.                 unsigned char key;
  342.                  P3=0xef;//掃描第一列
  343.       if ((P3 & 0x0f)!=0x0f)//判斷是該列是否有鍵按下
  344.         {
  345.              Key_Delay();//去抖動
  346.           if ((P3 & 0x0f)!=0x0f)//再判斷該列是否有鍵按下
  347.             {
  348.               switch(P3 & 0x0f)//讀取行的代碼,分析是哪一行有鍵按下
  349.                 {
  350.                   case 0x0e:key=0x11; break;



  351. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整的設計資料打包下載 word格式 可編輯:
基于單片機的電梯控制系統實施.zip (1.83 MB, 下載次數: 210)


評分

參與人數 1黑幣 +5 收起 理由
1372696012 + 5 絕世好帖!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:298539 發表于 2018-3-28 20:22 | 只看該作者
留個聯系方式,滴  工程師  本人 急需這些我的qq960236377電話15831128979
回復

使用道具 舉報

板凳
ID:307192 發表于 2018-4-13 20:28 來自觸屏版 | 只看該作者
大佬能給出具體的源代碼程序嗎小白已經深陷水火之中了
回復

使用道具 舉報

地板
ID:393602 發表于 2018-9-4 20:00 | 只看該作者
大佬能分享一下全部程序嗎?
回復

使用道具 舉報

5#
ID:554582 發表于 2019-6-4 13:00 來自觸屏版 | 只看該作者
大佬能分享一下全部程序嗎
回復

使用道具 舉報

6#
ID:655793 發表于 2019-12-18 17:21 | 只看該作者
你好,朋友。
很幸運能夠看到你這篇論文。現在我也正在做一個電梯的畢業設計。設計的是4層雙排并行的電梯,聯動控制。所以想問你一些相關的知識,希望你們能夠給予解答。
還有可以分享一下你的仿真原理圖、全部源程序文件嗎?
在線等?謝謝!
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区在线观看视频 | 一区二区三区欧美 | 最新中文字幕第一页视频 | 中文精品视频 | 国产1区| 国产成人在线播放 | 亚洲精品国产综合区久久久久久久 | 国产精品日产欧美久久久久 | 精品亚洲永久免费精品 | 久久精品一区二区三区四区 | 一区二区三区在线播放 | 亚洲欧美一区二区在线观看 | 中文字幕亚洲一区二区三区 | 国内精品在线视频 | 亚洲国产精品99久久久久久久久 | 亚洲综合久久精品 | 亚洲国产高清高潮精品美女 | 夜夜草| 欧美在线网站 | 亚洲日本视频 | 久久久久久一区 | 亚洲精久久久 | 天天射美女 | 日本精品999 | 成人毛片一区二区三区 | 一区二区三区国产好的精 | 亚洲精品一二三区 | 精品在线一区 | 中文字幕男人的天堂 | 91麻豆精品国产91久久久更新资源速度超快 | 毛片1| 国产乱码精品一区二区三区av | 久久久久久综合 | 久草精品视频 | 免费黄色a视频 | 91日b| 亚洲第一av | 亚洲精品久久久一区二区三区 | 亚洲免费在线 | 国产精品久久久久久久7电影 | 黄色片视频免费 |