目錄
摘要.............................................................................................................................................. I
Abstract........................................................................................................................................ II
1 緒論........................................................................................................................................ 1
1.1 課題背景....................................................................................................................... 1
1.2 電梯的發展趨勢............................................................................................................ 1
1.3 設計目的....................................................................................................................... 3
1.4 本設計完成的工作......................................................................................................... 3
2 總體方案設計.......................................................................................................................... 4
2.1 硬件設計....................................................................................................................... 4
2.2.1 引言................................................................................................................... 4
2.1.2 主控芯片選擇..................................................................................................... 4
2.1.3 電源選取............................................................................................................ 5
3 硬件實現及單元電路設計......................................................................................................... 5
3.1 主控制模塊................................................................................................................... 5
3.2 單片機的時鐘電路與復位電路設計................................................................................ 5
3.3 電源設計....................................................................................................................... 6
3.4 電梯呼叫按鍵電路......................................................................................................... 6
3.5 樓層顯示和樓層指示電路圖........................................................................................... 7
3.6 電梯上下指示電路......................................................................................................... 7
3.7 聲音提醒電路................................................................................................................ 8
4 系統軟件設計方案................................................................................................................... 8
4.1 主程序流程圖................................................................................................................ 8
4.2 電梯各情況下所對應的處理方法.................................................................................. 10
4.3 本章小結..................................................................................................................... 10
5 系統的安裝與調試.................................................................................................................. 11
5.1 安裝步驟....................................................................................................................... 11
結論............................................................................................................................................ 11
致謝............................................................................................................................................ 11
參考文獻..................................................................................................................................... 12
附錄1 整機電路原理圖............................................................................................................. 13
附錄2 部分源程序................................................................................................................... 14
摘要
本文介紹了一種采用STC89C52芯片進行的電梯模擬控制系統,介紹了如何使用單片機進行編程來實現電子控制的方法。單片機編程實現功能,簡潔多變,大大縮短了研發周期,同時能使電梯控制系統體積更小功能更強大。本設計模擬了電梯控制系統所需的一些基本功能,能通過能通過按鍵選擇樓層,數碼管顯示實時樓層數,LED燈組成的箭頭指示上下方向。本次設計更注重了把一些所學的知識加入到設計中。主要包括采用了STC89C52芯片,使用C語言進行編程,使其具有了更強的移植性,更加利于產品的開發。
1.2 電梯的發展趨勢
綠色化:綠色理念是電梯發展總趨勢。發展趨勢主要有如下:不斷改進產品的設計、生產環保型低能耗、低噪聲、無漏油、無漏水、無電磁干擾、無井道導軌油漬污染的電梯。電梯曳引采用尼龍合成纖維曳引繩、鋼皮帶等無潤滑油污染曳引方式。電梯裝璜將采用無(少)環境污染材料、電梯空載上升和滿載下行電機再生發電回收技術,安裝電梯將無需安裝腳手架,電梯零件在生產和使用過程中對環境沒有影響(如剎車皮一定不能使用石棉)并且材料是可以回收的。
降低能耗:減少電梯能耗的措施是多方面的。主要包括:選擇減小電梯機械系統的慣性和磨擦阻力;合理運用對重和平衡重。驅動系統使用永磁同步無齒輪曳引機從永磁同步電機工作原理可知其勵磁是由永磁鐵來實現的,不需要定子額外提供勵磁電流 因而電機的功率因數,可以達到很高(理論上可以達到1)。同時永磁同步電機的轉子無電流通過,不存在轉子耗損問題,一般比異步電機降低45%~60%耗損。由于沒有效率低,高能耗蝸輪蝸桿傳動副,能耗進一步降低。在停站較少的群梯布置中,一個主機驅動兩個轎廂分別上下運行是一種節能的方案。而減少能耗的另一途徑是電梯運行過程的能耗控制。利用電梯空載上行、滿載下行時電機處以發電狀態的特性,將再生能量反饋給電網,這種節能措施在高速梯上效果顯著。還有一種節能方案將在軟件控制中得以實現。如建立實時控制的交通模式,盡量以較少的運行次數來運載較多的乘客,使電梯的停站次數減至最少。電梯召喚與轎廂指令合一的樓層入口乘客登記方案是電梯控制方式的一項革命性技術,使原來層站上乘客未知的目的層變得一目了然,從而使控制系統的派梯效率達到最高。減少運行過程能耗的另一措施是將電梯運行中的加減速度模式設置成變參數,即電梯控制系統中運行的速度、加速度以及加速度變化率曲線既隨運行距離變化,也隨轎廂負載變化通過仿真軟件模擬,確定出不同樓層之間的最佳運行曲線。利用電梯機房在樓頂的優勢,充分利用太陽能作為電梯的補充能源也將是新的研究課題。
智能化:隨著計算機技術,通訊技術與控制技術的發展使大廈的智能化成為現實,而電梯是智能建筑中的重要交通工具,其技術發展及智能化程度也倍受世人關注。智能化的電梯首先要與智能大廈中所有自動化系統聯網,如與樓宇控制系統、消防系統、保安監控系統等交互聯系,使電梯成為高效優質、安全舒適的服務工具。
從電梯運行的控制智能化角度講,要求電梯有優質的服務質量,控制程序中應采用先進的調度規則,使群控管理有最佳的派梯模式。現在的群控算法中已不是單一地依賴“乘客等候時間最短”為目標,而是采用模糊理論、神經網絡、專家系統的方法,將要綜合考慮的因素(即專家知識)吸收到群控系統中去,在這些因素中既有影響乘客心理的因素,也有對即將要發生的情況作評價決策,是專家系統和電梯當前運行狀態組合在一起的多元目標控制。利用遺傳算法對客流交通模式及派梯規則進行優化、自學習,實現電梯調度規則的進化,以適應環境的變化。“以人為本”設計的電梯控制系統,將會使電梯的服務質量越來越好。
1.3 設計目的
目前電梯控制系統大多采用繼電器或者可編程控制器(PLC)的控制方式,存在著成本高,需要三相供電等缺點,本設計給出了一種基于單片機的電梯模型控制系統設計。以單片機為核心,再輔以適當的硬件電路和控制程序來檢測和控制整個電梯的信號,具有成本低、通用性強、靈活性大、擴展容易及易于實現復雜控制等優點。本設計注重基本理論知識與實際情況的緊密結合,同時對學生獨立創新和分析問題的能力進行培養,加深對知識的理解,為以后的工作和學習打下堅實的基礎
1.4 本設計完成的工作
1、設計電路模擬8層電梯運行
2、設置電梯的每一層按鍵,每按下一個按鍵有相應的二極管指示。
3、電梯具有向上還是向下指示,同時能顯示到了哪一層
4、電梯無人時,應默認停在第一層
5、自行構建基于單片機的最小系統,完成相關硬件電路的設計實現;
2 總體方案設計
系統采用STC89C52單片機作為核心控制單元用于智能車系統的控制,小車車頭裝有5個ST178紅外光電傳感器,檢測地面黑線。ST178光電傳感器將地面黑線轉化成電信號,用于判斷是否需要轉彎和小車是否偏離跑道。系統總體的設計方框圖如圖1所示。
圖1 系統總體方框圖
2.1 硬件設計
2.2.1 引言
由于電梯要運送客人到不同樓層,所以每一層都要有按鍵才可以滿足不同樓層顧客的需求。而且,電梯還要有人性化的顯示,如哪個按鈕按下了,就把它對應樓層按鈕的二極管點亮,還要有一個數碼管實時顯示電梯所在層數,用發光二極管組成的上下箭頭來表示電梯當前的運行方向等等。而這些零碎的原件,又需要高效的芯片來控制,它們相互之間的物理連接問題這些就是本章所要敘述的硬件設計部分。
2.1.2 主控芯片選擇
考慮到現在市場上能夠買到的芯片以及系統要求實現的功能來看,采用STC89C52單片機。STC89C52單片機是CMOS工藝的8位單片機,片內含有8KB可反復擦寫的只讀程序存儲器和256字節的隨機存取存儲器,片內置通用8位中央處理器(CPU)和Flash 存儲單元,使得STC89C52為眾多嵌入式控制應用系統提供高靈活、超有效的解決方案。STC89C52具有以下標準功能:8k字節Flash,256字節RAM,32位I/O口線,2個數據指針,看門狗定時器,三個16位定時器/計數器,一個6向量2級中斷結構,全雙工串行口,片內晶振及時鐘電路。另外,STC89C52可降至0Hz靜態邏輯操作,支持2種軟件可選擇節電模式。空閑模式下,CPU停止工作,允許RAM、定時器/計數器、串口、中斷繼續工作。掉電保護方式下,RAM內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。這一模塊以單片機為中心把程序代碼燒進去然后外圍接上復位電路、振蕩電路、鍵盤控制、LED顯示電路、報警電路等子模塊。
2.1.3 電源選取
由于本系統是模擬電梯系統,我們采用9V直流電源為系統供電。經過7805穩壓后為單片機,指示燈,數碼管供電。經過實驗驗證系統工作時,數碼管、單片機、指示燈工作穩定能夠滿足系統的要求。
3 硬件實現及單元電路設計3.1 主控制模塊
主控制最小系統電路如圖2所示。
圖2 單片主控電路
3.2 單片機的時鐘電路與復位電路設計
本系統采用STC89C52單片機,要使單片機工作起來,就必須有電源,晶振,復位電路。本系統采用外部方式的時鐘電路和按鍵復位的復位電路,如下圖3圖4所示:
圖3 時鐘電路
圖4 復位電路
3.3 電源設計
供電電源電路如圖5,9V電源經78L05穩壓后輸出5V供系統供電。D25為電源指示燈。C4、C6、C7、C5為電源濾波電容。
圖5 電源電路
3.4 電梯呼叫按鍵電路
本系統模擬的是8層樓電梯,所以有8個按鍵,每一個按鍵對應一層樓。8個按鍵接在P2口。
圖6 電梯呼叫按鍵電路圖
3.5 樓層顯示和樓層指示電路圖
圖7 電路圖
本系統總共8層,如圖7樓層顯示采用一位共陰數碼管顯示,每個樓層按鍵按下指示燈為8個發光二極管。
3.6 電梯上下指示電路
電梯上下指示采用發光二級管組成一個箭頭,當電梯向上時,點亮向上的箭頭,向下時點亮向下的箭頭。電路圖如圖8所示
圖8 紅外光電傳感器安裝
3.7 聲音提醒電路
當電梯到達每一層時通過蜂鳴器聲音提醒,電路如圖9
圖9 聲提醒電路
4 系統軟件設計方案
4.1 主程序流程圖
電梯所處的狀態是整個程序成功運行的核心保證。在電梯每經過一個樓層時,就會自動調用該函數,它的作用是基于高效率、短時間、人性化的基礎上,合理智能的對電梯的運行進行調度,結合實際情況,最終得出電梯下一個目標停留樓層。其流程如圖10所示。
圖10 主程序流程圖
由圖可知,程序中將實際情況分為四種情況來判斷:電梯上行且是去送人(即電梯此時位于底層,而高層有人呼叫要上樓)、電梯上行且是去接人(即電梯此時位于底層,而高層有人呼叫要下樓)、電梯下行且是去送人(即電梯此時位于高層,而低層有人呼叫要下樓)、電梯下行且是去接人(即電梯此時位于高層,而低層有人呼叫要上樓)。
而這四種情況,也就包含了實際電梯中的絕大部分情況。情況不同,分析的方法也當然不一樣。而首先,我們要了解電梯是如何得知此時它是上面四種的哪一種情況的呢?
這可以分為兩個步驟:第一判斷電梯是上行還是下行;第二,判斷是去接人還是去送人。當然,第一個是最好判斷的,因為電梯在運行時,有兩個與樓層有關的變量,一個為當前所在樓層值,一個為目標樓層值,當電梯運行時,會讓這兩個值進行比較,若前者大于后者,就為下行,從而讓狀態變量清零(由于電路中上下行的箭頭使用了非門,故在程序中,兩表示上下行的狀態變量清零時表示有效);反之,當前者小于后者,即為上行,從而上行變量清零。
至于是接人還是送人,是判別的難點。在此,巧妙地利用了兩個狀態變量scanup和scandown,前者等于所有上行按鍵和去幾層按鍵狀態變量的或,后者等于所有上行按鍵和去幾層按鍵狀態變量的或。由此可知,當上行按鍵和去幾層按鍵均為0時,電梯仍為上行狀態,那么此時,電梯的狀態肯定處于上樓接人的狀態中(即在高層,有人按了下行鍵)。反之,若它們中有一個為1(且按鍵所處樓層高于當前電梯所在樓層,這個由其他函數來限定,防止電梯在上行過程中受已經過樓層按鍵按下時的干擾),則電梯此時處于上樓送人狀態,就會執行對應的子程序。其他的與此同理。
4.2 電梯各情況下所對應的處理方法
以電梯上行的兩種狀態為例。
在實際應用中,最簡單的情況莫過于電梯當前為閑置狀態,然后有一人按下按鍵呼叫,然后電梯便響應呼叫。但是,實際情況往往比這復雜的多,在第一個人按下按鍵電梯運行的過程中,還很有可能會有其他不同樓層的人按下不同的按鍵(上行或者下行)的情況發生。那么就必須得為電梯規定好一個特定的優先級規則,讓其依據這個規則來運行,以免亂作一團。那么這個規則就必須要高效且人性化,在此,我們規定,當電梯上行時,均不理會那些按下行按鍵的顧客。并且,若在上行過程中,也有人在某層按的是上行按鍵,但是電梯此時已經走過了該層,那么電梯也絕對不會再選擇先下行接他。當然,當將高層上行的顧客送完后(此時一般來說電梯已經處于高層了),電梯便會檢測下行按鍵,若更高層有人呼叫下行,則電梯會選擇先去響應他們,然后再下行的過程中依次響應按了下行處于等待中的顧客,最后這些顧客都送完后,再去相應那些電梯上行過程中,處于比電梯低的樓層卻按了上行鍵的顧客。
簡單地說,若電梯處于上行狀態,則在該過程中響應不同顧客的優先級(或者電梯響應的先后順序)為:高層呼叫上行顧客>高層呼叫下行顧客>底層呼叫下行顧客>底層呼叫上行顧客。那么,當電梯通過程序運行得知到相應狀態后,又是如何具體的判斷當天所鎖定的目標樓層是否要變更呢?現以上行為例,加以詳細說明:上行,且是送人,比如電梯當前在二層,五樓有人呼叫上樓,那么它就要響應這一呼叫,從而把自己的目標樓層鎖定為五樓并向上運行,而在五樓呼叫后不久,四樓也有人呼叫上樓(且電梯此刻還未運行到六樓),那么在電梯運行中,沒經過一個樓層,會做一次判決,因為四樓也有人呼叫,所以正常情況下,它應該在判決后將目標樓層定位四樓。而若四樓的顧客按下的是下行鍵,或者二樓的人按下呼叫鍵,電梯此時都會暫時不予理會。部分程序代碼見附錄。
4.3 本章小結
本章介紹的是整體流程圖以及工作原理。
5 系統的安裝與調試5.1 安裝步驟
1.檢查元件的好壞
按電路圖買好元件后首先檢查買回元件的好壞,按各元件的檢測方法分別進行檢測,一定要仔細認真。而且要認真核對原理圖是否一致,在檢查好后才可上件、焊件,防止出現錯誤焊件后不便改正。
2.放置、焊接各元件
按原理圖的位置放置各元件,在放置過程中要先放置、焊接較低的元件,后焊較高的和要求較高的元件。特別是容易損壞的元件要后焊,在焊集成芯片時連續焊接時間不要超過10s,注意芯片的安裝方向。
結論
經過幾十天的艱苦奮斗,我最終完成了畢業設計的基本要求。在大學的最后一個學期里,我學到了很多的知識和技能。通過本次畢業設計,我掌握了做科學研究的基本方法和思路,為今后的工作打下了堅實的基礎。
首先,我學會了對相關文獻的檢索。隨著計算機的普及以及網絡技術的發展,對文獻的檢索,收集資料的形式也變得越來越豐富。我們一方面可以利用學校圖書館資源,另一方面可以利用網絡來檢索資源,例如中國知網CNKI、IEEE、萬方數據庫、百度文庫、豆丁文庫等數據庫系統。
其次,通過這次畢業設計,培養了我的動手能力,使我進一步了解畢業設計的基本知識。鞏固了我的知識架構體系,強化了我對大學期間所學到的基礎課以及專業課的認識和理解,為今后的工作打下理論基礎。
最后,通過本次畢業設計,使我懂得在遇到困惑和不解時要及時與老師和其他同學溝通,這樣才能更迅速地解決設計中遇到的問題,提供工作效率。
總之,這次畢業設計不是一次簡簡單單地完成一個課題。它不僅讓我鍛煉了動手操作能力和分析解決問題的能力,鞏固了我的專業知識,還讓我學到了很多東西,為我今后的工作打下基礎。
致謝
大學四年即將畫上一個句號了,畢業設計是我在學校交的最后一份答卷。在論文完成之際,感受收獲喜悅的同時,心中充滿了更是感激之情。
首先感謝學校給我們提供的條件使我們有了一個可以對大學四年的知識進行溫習總結并付諸實踐的機會。在此次畢業設計過程中,特別要感謝我的畢業實際指導老師,感謝您在這段日子里對我親切的關懷和悉心的指導。老師在我遇到難題時,不但給予我技術上的幫助,更教會我諸多檢查及解決問題的方法。老師淵博的知識以及對待學生的耐心和責任感,不僅讓我對專業知識有了更深的理解,還教會了我們今后面對工作生活的態度。
借此機會,我也感謝大學四年期間所有指導過我的老師,感謝他們對我無私的教誨和幫助,感謝他們的諄諄教導。
在此同時,我也要感謝一直陪伴在我身邊給予我精神支持和行動支持的同學們,正是由于你們的幫助和支持,我才能克服一個又一個的困難,并且讓我從你們身上學到了很多知識。
參考文獻
[1]童詩白 華成英 編著《模擬電子技術基礎》 高等教育出版社 2011年5月
[2]李朝青 編著《單片機原理及接口技術》 北京航天航空大學出版社 2011年1月
[3]馬忠梅 編著 《單片機的C語言應用程序設計》 航空航天出版社 2003年7月
[4]佘新平 編著《數字電子技術》 華中科技大學出版社 2011年2月
[5]薛永毅 王淑英 何希才 編著《新型電源電路應用實例》 電子工業出版社 2001年10月
附錄1 整機電路原理圖
附錄2 部分源程序
#include <reg52.h> //調用單片機頭文件
#define uchar unsignedchar //無符號字符型 宏定義 變量范圍0~255
#define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
//數碼管段選定義 0 1 2 3 4 5 6 7 8 9
uchar codesmg_du[]={0xde,0x90,0xcd,0xd9,0x93,0x5b,0x5f,0xd0,0xdf,0xdb
// A B C D E F 不顯示
}; //斷碼
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
bit flag_100ms,flag_1s;
bit flag_stop = 1; //用做到了相應的樓停下
sbit beep = P2^6;
sbit xia = P2^0;
sbit zhong = P2^1;
sbit shang = P2^2;
uchar value2;
sbit led1 = P1^0; //8個發光二極管定義
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit led5 = P1^4;
sbit led6 = P1^5;
sbit led7 = P1^6;
sbit led8 = P1^7;
uchar dt_1; //1樓電梯標志位
uchar dt_2; //2樓電梯標志位
uchar dt_3; //3樓電梯標志位
uchar dt_4; //4樓電梯標志位
uchar dt_5; //5樓電梯標志位
uchar dt_6; //6樓電梯標志位
uchar dt_7; //7樓電梯標志位
uchar dt_8; //8樓電梯標志位
uchar dt_value = 1; //電梯到哪一層的變量
uchar dt_s_x ; //電梯上下的標志位
/***********************1ms延時函數*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/********************獨立按鍵程序*****************/
uchar key_can; //按鍵值
void key() //獨立按鍵程序
{
static uchar key_new;
key_can = 20; //按鍵值還原
P3 |= 0xff;
if((P3 & 0xff) != 0xff) //按鍵按下
{
delay_1ms(1); //按鍵消抖動
if(((P3 &0xff) != 0xff) && (key_new == 1))
{ //確認是按鍵按下
key_new = 0;
switch(P3)
{
case0xfe: key_can = 1; break; //得到按鍵值
case0xfd: key_can = 2; break; //得到按鍵值
case0xfb: key_can = 3; break; //得到按鍵值
case0xf7: key_can = 4; break; //得到按鍵值
case0xef: key_can = 5; break; //得到按鍵值
case0xdf: key_can = 6; break; //得到按鍵值
case0xbf: key_can = 7; break; //得到按鍵值
case0x7f: key_can = 8; break; //得到按鍵值
}
}
}
else
key_new = 1;
}
void key_with()
{
if(key_can == 1)
{
led1 = 1; //點亮發光二極管
dt_1 = 1; //
}
if(key_can == 2)
{
led2 = 1; //點亮發光二極管
dt_2 = 1;
}
if(key_can == 3)
{
led3 = 1; //點亮發光二極管
dt_3 = 1;
}
if(key_can == 4)
{
led4 = 1; //點亮發光二極管
dt_4 = 1;
}
if(key_can == 5)
{
led5 = 1; //點亮發光二極管
dt_5 = 1;
}
if(key_can == 6)
{
led6 = 1; //點亮發光二極管
dt_6 = 1;
}
if(key_can == 7)
{
led7 = 1;
dt_7 = 1;
}
if(key_can == 8)
{
led8 = 1;
dt_8 = 1;
}
}
/*********************當電梯不動時、判斷是向上、還是向下**********************/
void tiandi_shang_xia()
{
static uchar value;
if(dt_s_x == 0)
{
flag_stop = 1;
if(dt_value == 1) //電梯在第1層停下不走了
{
value = dt_2 + dt_3 + dt_4 + dt_5 + dt_6+ dt_7 + dt_8;
if(value != 0)
{
dt_s_x= 1; //電梯向上
shang= 0; //顯示上
zhong= 0;
xia= 1;
}
}
if(dt_value == 2) //電梯在第2層停下不走了
{
value = dt_3 + dt_4 + dt_5 + dt_6 + dt_7+ dt_8;
if(value != 0)
{
dt_s_x= 1; //電梯向上走
shang= 0; //顯示上
zhong= 0;
xia= 1;
}
value = dt_1;
if(value != 0)
{
dt_s_x= 2; //電梯向下走
xia= 0; //顯示下
zhong= 0;
shang= 1;
}
}
if(dt_value == 3) //電梯在第3層停下不走了
{
value = dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
if(value != 0)
{
dt_s_x= 1; //電梯向上走
shang= 0; //顯示上
zhong= 0;
xia= 1;
}
value = dt_1 + dt_2;
if(value != 0)
{
dt_s_x= 2; //電梯向下走
xia= 0; //顯示下
zhong= 0;
shang= 1;
}
}
if(dt_value == 4) //電梯在第4層停下不走了
{
value = + dt_5 + dt_6 + dt_7 + dt_8;
if(value != 0)
{
dt_s_x= 1; //電梯向上走
shang= 0; //顯示上
zhong= 0;
xia= 1;
}
value = dt_1 + dt_2 + dt_3;
if(value != 0)
{
dt_s_x= 2; //電梯向下走
xia= 0; //顯示下
zhong= 0;
shang= 1;
}
}
if(dt_value == 5) //電梯在第5層停下不走了
{
value = dt_6 + dt_7 + dt_8;
if(value != 0)
{
dt_s_x= 1; //電梯向上走
shang= 0; //顯示上
zhong= 0;
xia= 1;
}
value = dt_1 + dt_2 + dt_3 + dt_4;
if(value != 0)
{
dt_s_x= 2; //電梯向下走
xia= 0; //顯示下
zhong= 0;
shang= 1;
}
}
if(dt_value == 6) //電梯在第5層停下不走了
{
value = dt_7 + dt_8;
if(value != 0)
{
dt_s_x= 1; //電梯向上走
shang= 0; //顯示上
zhong= 0;
xia= 1;
}
value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5;
if(value != 0)
{
dt_s_x= 2; //電梯向下走
xia= 0; //顯示下
zhong= 0;
shang= 1;
}
}
if(dt_value == 7) //電梯在第5層停下不走了
{
value = dt_8;
if(value != 0)
{
dt_s_x= 1; //電梯向上走
shang= 0; //顯示上
zhong= 0;
xia= 1;
}
value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5+ dt_6;
if(value != 0)
{
dt_s_x= 2; //電梯向下走
xia= 0; //顯示下
zhong= 0;
shang= 1;
}
}
if(dt_value == 8) //電梯在第5層停下不走了
{
value = dt_8;
if(value != 0)
{
dt_s_x= 1; //電梯向上走
shang= 0; //顯示上
zhong= 0;
xia= 1;
}
value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5+ dt_6;
if(value != 0)
{
dt_s_x= 2; //電梯向下走
xia= 0; //顯示下
zhong= 0;
shang= 1;
}
}
}
}
/****************電梯向上、做最后的判斷是否還要繼續向上****************/
void dt_shang_guan()
{
uchar value;
if(dt_s_x == 1) //電梯向上 做最后的判斷是否還要繼續向上
{
if(dt_value == 1) //在第1層
{
value = dt_2 + dt_3 + dt_4 + dt_5 + dt_6+ dt_7 + dt_8;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
shang= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 2) //在第2層
{
value = dt_3 + dt_4 + dt_5 + dt_6 + dt_7+ dt_8;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
shang= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 3) //在第3層
{
value = + dt_6 + dt_7 + dt_8;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
shang= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 4) //在第4層
{
value = dt_5 + dt_6 + dt_7 + dt_8;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
shang= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 5) //在第5層
{
value = dt_6 + dt_7 + dt_8;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
shang= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 6) //在第6層
{
value = dt_7 + dt_8;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
shang= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 7) //在第7層
{
value = dt_8;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
shang= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 8) //在第8層
{
dt_s_x = 0; //電梯停下不動了
shang = 1; //關閉上字
zhong = 1;
}
}
}
/****************電梯向下、做最后的判斷是否還要繼續向下****************/
void dt_xia_guan()
{
uchar value;
if(dt_s_x == 2) //電梯向下 做最后的判斷是否還要繼續向下
{
if(dt_value == 1) //在第1層
{
dt_s_x = 0; //電梯停下不動了
xia = 1; //關閉上字
zhong = 1;
flag_stop = 1;
}
else if(dt_value== 2) //在第2層
{
value = dt_1;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
xia= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 3) //在第3層
{
value = dt_1 + dt_2;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
xia= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 4) //在第4層
{
value = dt_2 + dt_3;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
xia= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 5) //在第5層
{
value = dt_1 + dt_2 + dt_4;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
xia= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 6) //在第6層
{
value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
xia= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 7) //在第7層
{
value = dt_1 + dt_2 + dt_4 + dt_5+ dt_6;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
xia= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
else if(dt_value== 8) //在第8層
{
value = dt_3 + dt_4 + dt_5 + dt_6 + dt_7;
if(value == 0) //說明上面沒有人按下
{
dt_s_x= 0; //電梯停下不動了
xia= 1; //關閉上字
zhong= 1;
}else
flag_stop= 1;
}
}
}
/***********************電梯處理函數************************/
void td_dis()
{
uchar value,value1;
value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
if(value != 0)
{ //100ms
if(flag_stop == 1) //到相應的樓了 要停下
{
/***************************向上走電梯***********************************/
if(dt_s_x != 0) //向上走電梯
{
value1++;
if(value1>= 10) //1s
{
value1 = 0;
if(dt_s_x == 1) //向上走電梯
{
dt_value++;
shang= 0; //顯示上字
zhong= 0;
}
if(dt_s_x == 2) //向下走電梯
{
dt_value--;
xia= 0; //顯示下字
zhong= 0;
}
if(dt_value == 1) //當到了第一層的時候
{
if(dt_1== 1)
{
led1 = 0; //關閉第一層發光二極管
dt_1 = 0; //清零電機在的標志
flag_stop = 0; //到停下
beep = 0; //打開蜂鳴器
}
}
else if(dt_value == 2) //當到了第二層的時候
{
if(dt_2== 1)
{
led2 = 0; //關閉第二層發光二極管
dt_2 = 0; //清零電機在的標志
flag_stop = 0; //到停下
beep = 0; //打開蜂鳴器
}
}
else if(dt_value == 3) //當到了第3層的時候
{
if(dt_3== 1)
{
led3 = 0; //關閉第3層發光二極管
dt_3 = 0; //清零電機在的標志
flag_stop = 0; //到停下
beep = 0; //打開蜂鳴器
}
}
else if(dt_value == 4) //當到了第4層的時候
{
if(dt_4== 1)
{
led4 = 0; //關閉第4層發光二極管
dt_4 = 0; //清零電機在的標志
flag_stop = 0; //到停下
beep = 0; //打開蜂鳴器
}
}
else if(dt_value == 5) //當到了第5層的時候
{
if(dt_5== 1)
{
led5 = 0; //關閉第5層發光二極管
dt_5 = 0; //清零電機在的標志
flag_stop = 0; //到停下
beep = 0; //打開蜂鳴器
}
}
else if(dt_value == 6) //當到了第6層的時候
{
if(dt_6== 1)
{
led6 = 0; //關閉第6層發光二極管
dt_6 = 0; //清零電機在的標志
flag_stop = 0; //到停下
beep = 0; //打開蜂鳴器
}
}
else if(dt_value == 7) //當到了第7層的時候
{
if(dt_7== 1)
{
led7 = 0; //關閉第7層發光二極管
dt_7 = 0; //清零電機在的標志
flag_stop = 0; //到停下
beep = 0; //打開蜂鳴器
}
}
else if(dt_value == 8) //當到了第8層的時候
{
if(dt_8== 1)
{
led8 = 0; //關閉第8層發光二極管
dt_8 = 0; //清零電機在的標志
flag_stop = 0; //到停下
beep = 0; //打開蜂鳴器
}
}
}
}
}
}
if(flag_stop == 0)
{
// flag_stop = 1;
// value1 = 0;
value2 ++;
if(value2 % 5 ==0)
{
if(dt_s_x == 1) //上
{
shang= ~shang;
zhong= ~zhong;
}
if(dt_s_x == 2) //下
{
zhong= ~zhong;
xia= ~xia;
}
}
if(value2 >=10) //1.0s
{
beep = 1; //關閉蜂鳴器
}
if(value2 >=20)
{
value2 = 0;
dt_shang_guan(); //電梯向上 做最后的判斷是否還要繼續向上
dt_xia_guan(); //電梯向下 做最后的判斷是否還要繼續向下
}
}
}
/*************定時器0初始化程序***************/
void time_init()
{
EA = 1; //開總中斷
TMOD = 0X01; //定時器0、工作方式1
ET0 = 1; //開定時器0中斷
TR0 = 1; //允許定時器0定時
}
/******************主程序**********************/
void main()
{
P3 = 0xff;
P2 = 0xff;
P1 = 0x00;
P0 = 0X00; //單片機IO口初始化
time_init(); //定時器初始化
while(1)
{
key(); //按鍵程序
if(key_can <20)
{
if(dt_s_x == 0)
{
value2= 0;
flag_stop= 1;
}
key_with();
}
tiandi_shang_xia(); //當電梯不動時、判斷是向上、還是向下
P0 =smg_du[dt_value]; //顯示
if(flag_100ms == 1)
{
flag_100ms = 0;
td_dis(); //電梯處理函數
}
}
}
/*************定時器0中斷服務程序***************/
void time0_int() interrupt 1
{
static uchar value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
if(value % 2 == 0)
{
flag_100ms = 1 ;
}
}
|