電梯運(yùn)行模擬控制器_第1頁
電梯運(yùn)行模擬控制器_第2頁
電梯運(yùn)行模擬控制器_第3頁
電梯運(yùn)行模擬控制器_第4頁
電梯運(yùn)行模擬控制器_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、目錄1.課程設(shè)計(jì)簡(jiǎn)介11.1簡(jiǎn)介11.2設(shè)計(jì)總電路圖21.3實(shí)物圖22.設(shè)計(jì)題目23.總體設(shè)計(jì)33.1電梯運(yùn)行模擬控制器的總體運(yùn)作流程33.2電梯運(yùn)行模擬控制器各模塊關(guān)系34.詳細(xì)設(shè)計(jì)46.1基本的IO配置(輸入/輸出模式)4輸出模式配置4輸入模式配置46.2外部中斷配置5定時(shí)器中斷5外部按鍵輸入中斷56.3電梯運(yùn)行邏輯設(shè)計(jì)(軟件編碼)6數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)6功能接口設(shè)計(jì)65.體會(huì)與總結(jié)76.附錄7源代碼7參考文獻(xiàn)211. 課程設(shè)計(jì)簡(jiǎn)介1.1 簡(jiǎn)介本設(shè)計(jì)使用STM8S系列作為主控芯片,使用矩陣鍵盤、若干個(gè)LED和兩位數(shù)碼管作為外設(shè)。其中矩陣鍵盤用來模擬電梯按鍵,若干個(gè)LED燈用來模擬電梯的運(yùn)動(dòng)方向、樓

2、層的指示燈(電梯內(nèi)部樓層對(duì)應(yīng)的按鈕),兩位的數(shù)碼管用于顯示電梯目前所處樓層。1.2 設(shè)計(jì)總電路圖(基于AD這個(gè)平臺(tái)生成的PCB圖與原理圖)原理圖原理圖PCB圖PCB圖1.3 實(shí)物圖實(shí)物圖2. 設(shè)計(jì)題目設(shè)計(jì)一個(gè)電梯運(yùn)行模擬控制器,其系統(tǒng)框圖如下圖所示:MCU1位七段數(shù)碼管,3個(gè)LED燈(顯示當(dāng)前電梯所處樓層與運(yùn)行方向以及電梯門的狀態(tài))鍵盤以及對(duì)應(yīng)的LED燈(18,開門,關(guān)門)每個(gè)數(shù)字按鍵對(duì)應(yīng)一個(gè)LED燈,按下按鍵燈亮,執(zhí)行完命令燈滅)8個(gè)LED燈顯示電梯所處樓層2個(gè)燈顯示當(dāng)前電梯運(yùn)行方向8×2214個(gè)按鍵表示每層樓入口的電梯按鍵電梯運(yùn)行模擬控制器框圖功能要求:能夠模擬控制一個(gè)8層樓梯的

3、電梯的運(yùn)行。具體要求如下:1.電梯平時(shí)沒有接到命令時(shí)候或者執(zhí)行完命令后停在1樓,門關(guān)閉.。2.電梯運(yùn)行速度2秒一層樓3.電梯門在開啟的情況下沒有收到命令10秒中后自動(dòng)關(guān)閉。在運(yùn)動(dòng)中門必須關(guān)閉,(最后3秒可以設(shè)置音響警告信號(hào))4.一句話,電梯控制器滿足實(shí)際電梯的運(yùn)行要求,電梯在運(yùn)行的時(shí)候可以最多記住8個(gè)命令。并且綜合考慮公平性(先按鍵先執(zhí)行)和有效性(完成任務(wù)的總的行走路徑最短)來執(zhí)行。要求完成的內(nèi)容:1.完成硬件電路的設(shè)計(jì)與安裝調(diào)試(可借助單片機(jī)實(shí)驗(yàn)電路板),并用CAD軟件畫出原理電路圖。2.畫出流程圖,編寫并調(diào)試驅(qū)動(dòng)程序。3.撰寫設(shè)計(jì)報(bào)告。3. 總體設(shè)計(jì)233.1 電梯運(yùn)行模擬控制器的總體運(yùn)

4、作流程電梯運(yùn)行模擬控制器整體運(yùn)作流程3.2 電梯運(yùn)行模擬控制器各模塊關(guān)系電梯運(yùn)行模擬控制器各模塊關(guān)系圖4. 詳細(xì)設(shè)計(jì)4566.1 基本的IO配置(輸入/輸出模式)輸出模式配置對(duì)于輸出模式IO的配置,用到的外設(shè)(LED燈,數(shù)碼管,矩陣鍵盤),在代碼中都有對(duì)它們進(jìn)行對(duì)應(yīng)的配置。其中將LED的對(duì)應(yīng)的IO口配置成推挽輸出模式。當(dāng)然數(shù)碼管也是相同的配置方式,所以不做贅述。輸出模式的引腳的配置輸入模式配置對(duì)于IO口為輸入模式的配置,將矩陣鍵盤設(shè)為輸入模式,等待外部去觸發(fā)。輸入模式的引腳的配置6.2 外部中斷配置定時(shí)器中斷此設(shè)計(jì)使用了定時(shí)器中斷用于每2s產(chǎn)生一個(gè)中斷信號(hào),這個(gè)信號(hào)的作用是讓主控芯片知道當(dāng)前(

5、正在運(yùn)動(dòng)的)電梯的所處樓層發(fā)生了變化(向上運(yùn)動(dòng)了一層或是向下運(yùn)動(dòng)了一層)。定時(shí)器中斷配置外部按鍵輸入中斷此設(shè)計(jì)使用外部按鍵輸入中斷,用來及時(shí)檢測(cè)電梯內(nèi)部、外部的樓層按鈕被按下的情況,每當(dāng)有按鈕被按下就產(chǎn)生信號(hào)使主控芯片進(jìn)行相應(yīng)的邏輯處理。外部按鍵輸入中斷(部分)6.3 電梯運(yùn)行邏輯設(shè)計(jì)(軟件編碼)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)在電梯運(yùn)行期間,電梯的運(yùn)行方向、電梯當(dāng)前所處樓層、電梯內(nèi)部的哪幾個(gè)對(duì)應(yīng)的按鈕被按下需要被存儲(chǔ)下來。以及當(dāng)外部有按鈕被按下時(shí),需要記錄當(dāng)前被按下的按鈕編號(hào)所以設(shè)計(jì)了以下的數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)功能接口設(shè)計(jì)為了讓模擬電梯的控制器的運(yùn)作與現(xiàn)實(shí)的電梯相似,需要設(shè)計(jì)相應(yīng)的接口以便模擬控制器以正確的邏

6、輯正常運(yùn)作。功能接口設(shè)計(jì)5. 體會(huì)與總結(jié)對(duì)于這次的課設(shè),我個(gè)人認(rèn)為這是大學(xué)以來工程量最大的課設(shè),因?yàn)樗婕傲塑浖奖愕木幋a,還有硬件方面的PCB制版還有最后就是要自行編寫一個(gè)規(guī)范的文檔報(bào)告,總的來說工作的內(nèi)容還是比較豐富的。在軟件編碼方面,由于C語言有一段時(shí)間沒有去使用了,所以在對(duì)單片機(jī)進(jìn)行裸機(jī)編程的時(shí)候,我去復(fù)習(xí)了單片機(jī)原理和C語言的相關(guān)書籍,以便我去選擇更好的數(shù)據(jù)結(jié)構(gòu)用來存儲(chǔ)數(shù)據(jù)。在軟件編碼過程中,比較有意思的就是去設(shè)計(jì)電梯運(yùn)作邏輯,在設(shè)計(jì)這個(gè)邏輯時(shí),我自己也再次對(duì)我們生活中的電梯運(yùn)作流程進(jìn)行了進(jìn)一步的觀察。這個(gè)邏輯相對(duì)于比較有挑戰(zhàn)性的就是,你要讓你寫的邏輯穿插在硬件層和軟件曾中正常運(yùn)行,

7、所以在DEBUG的時(shí)候也比較難去查問題,由于自己也比較懶,在DEBUG的時(shí)候懶得用那個(gè)仿真調(diào)試的功能,導(dǎo)致最后解決BUG的時(shí)間花的還是比較多的。在硬件PCB板制作方面,主要就是去學(xué)習(xí)怎樣去使用AD這個(gè)專業(yè)的畫板軟件,自己也第一次去用化學(xué)藥劑腐蝕的方法去制作最小版,自己動(dòng)手去做一個(gè)小玩意兒的經(jīng)歷也是很有意思的。在文檔編寫方面,由于之前上了WORD的選修,所以我也就趁這次機(jī)會(huì),把之前所學(xué)的只是進(jìn)行學(xué)以致用,這次文檔的編寫我盡量按照畢業(yè)課設(shè)的規(guī)范來要求自己,以求讓文檔的格式看起來更加的讓人賞心悅目。6. 附錄源代碼#include "iostm8s105c6.h"#include

8、 <stdio.h>#include <stdbool.h>/*宏定義*/#define Floors 8/*全局?jǐn)?shù)組,變量*/int floorStateFloors + 1 = 0,0,0,0,0,0,0,0,0; /*true表示有該樓層的請(qǐng)求還未處理,false表示在該樓層沒有請(qǐng)求*/unsigned char DisDisplay10 = 0X00,0XF3,0X49,0X61,0X33,0X25,0X05,0XF1,0X01,0X7F;int FloorNow = 1; /電梯所處的樓層unsigned char i = 0; /解決定時(shí)器第一次中斷問題un

9、signed char j = 0; /解決電梯按下關(guān)門請(qǐng)求后會(huì)自動(dòng)開門的變量unsigned char Temp1 = 0; /計(jì)數(shù)為兩秒用(電梯上升樓層的間隔時(shí)間)unsigned char Temp2 = 0; /10s,自動(dòng)關(guān)門用unsigned char FloorPoint = 0; /記憶指針unsigned char FloorStart = 0; /記憶初始位置unsigned char FloorOver = 0; /記憶終止位置unsigned char Index = 0;int bottonNum = -1;int direction = -2; /*初始值為 -2*

10、/int floorToGo = -1; /*樓梯將要去的樓層*/void DisBegin(void); /初始化內(nèi)部數(shù)碼管和上下說明void LedBegin(void); /初始化內(nèi)部LED函數(shù)聲明void KeyBegin(void); /初始化鍵盤輸入函數(shù)聲明void BreakPoint(void); /鍵盤中斷優(yōu)先級(jí)函數(shù)初始化void Running(void); /電梯運(yùn)行函數(shù)聲明void TIM1_Init(void); /定時(shí)器初始化函數(shù)聲明void DoorJudge(void); /中斷內(nèi)開關(guān)門的判斷程序void delay(unsigned int time); /延

11、時(shí)函數(shù)聲明void Floor_To_Go(); /吐出要去的樓層命令void Judge_Direction();void Step_one(int bottonNum);void main(void) LedBegin(); /LED初始化 KeyBegin(); /鍵盤初始化 DisBegin(); /內(nèi)部數(shù)碼管初始化 _asm("sim"); BreakPoint(); /鍵盤中斷初始化 TIM1_Init(); /定時(shí)器初始化 TIM1_CR1 = 0X04; /置CEN零,先不計(jì)數(shù) /TIM1_CR1 = 0X01; /開始計(jì)數(shù) _asm("rim&q

12、uot;); /開總中斷 while (1) Running(); /電梯運(yùn)行s /*在主循環(huán)內(nèi)要頻繁的去對(duì)比,電梯運(yùn)行到的當(dāng)前樓層是否到達(dá)了最近需要去到達(dá)的樓層(最迫切去處理的請(qǐng)求)*/ if (FloorNow = floorToGo) floorStateFloorNow = 0; /*清除當(dāng)前樓層的請(qǐng)求*/ /上下指示燈的行為步驟 if (direction = 0) PG_ODR = 0XFD; else if(direction = 1) PG_ODR = 0XFE; else PG_ODR |= 0XFF; /到達(dá)樓層,關(guān)掉上下指示燈 /初始化內(nèi)部LED函數(shù)定義void LedB

13、egin(void) PD_DDR = 0XFF; PD_CR1 = 0XFF; PD_CR2 = 0X00; PD_ODR = 0XFF; PE_DDR = 0XFF; PE_CR1 = 0XFF; PE_CR2 = 0X00; PE_ODR = 0X00; /初始化開關(guān)門指示燈的同時(shí)順便初始化按鍵使其輸出全零掃描碼 PG_DDR = 0XFF; /初始化方向指示燈 PG_CR1 = 0XFF; PG_CR2 = 0X00; PG_ODR = 0XFF;/初始化內(nèi)部數(shù)碼管void DisBegin(void) PC_DDR = 0XFF; PC_CR1 = 0XFF; PC_CR2 = 0X

14、00;/初始化鍵盤輸入函數(shù)定義void KeyBegin(void) /初始化鍵盤輸出與輸入 PA_DDR = 0XFF; /初始化開關(guān)門鍵輸出全零掃描碼 PA_CR1 = 0XFF; PA_CR2 = 0X00; PA_ODR = 0X00; PB_DDR = 0X00; /兩個(gè)矩陣鍵盤的輸入檢測(cè) PB_CR1 = 0XFF; PB_CR2 = 0XFF;/鍵盤中斷初始化函數(shù)定義void BreakPoint(void) ITC_SPR2 = 0X03; EXTI_CR1 = 0X08;/定時(shí)器初始化函數(shù)定義void TIM1_Init(void) TIM1_SMCR = 0X00; TIM

15、1_ETR = 0X00; TIM1_SR1 &= 0XEF; /先清除一次更新中斷標(biāo)志 TIM1_PSCRH = 0; TIM1_PSCRL = (unsigned char)199; /對(duì)2MHz進(jìn)行200分頻,之后頻率為10kHz TIM1_IER = 0X01; /開啟溢出中斷 TIM1_ARRH = (unsigned char)(10000 >> 8); TIM1_ARRL = (unsigned char)10000; /數(shù)10000次,記為1s TIM1_CNTRH =0 ;/(unsigned char)(20000 >> 8); TIM1_C

16、NTRL =0 ;/(unsigned char)20000; /先溢出一次/電梯運(yùn)行函數(shù)定義void Running(void) PC_ODR = DisDisplayFloorNow; unsigned char FloorLed = 0; for(Index = Floors;Index >= 1; Index -) FloorLed = FloorLed + floorStateIndex; if (Index = 1) break; FloorLed <<= 1; PD_ODR = FloorLed;#pragma vector = 13_interrupt voi

17、d TIM1_OVF_IRQ(void) i +; if(i > 1) Temp1 +; if(Temp1 > 1) /判定為兩秒 if(floorToGo > 0 && floorToGo < 9) if(FloorNow < floorToGo) /去往請(qǐng)求樓層 FloorNow +; PG_ODR = 0XFE; /上指示燈 Temp2 = 0; j = 0; /關(guān)門bug解決變量回位 else if(FloorNow > floorToGo) FloorNow -; PG_ODR = 0XFE; /下指示燈 Temp2 = 0; j

18、= 0; /關(guān)門bug解決變量回位 else if (FloorNow = floorToGo) /到達(dá)樓層 DoorJudge(); Temp1 = 0; else DoorJudge(); else; TIM1_SR1 = 0X00; /清除更新中斷標(biāo)志#pragma vector = 6 /用于判斷按下了哪里的按鈕_interrupt void KeyScan(void) TIM1_SR1 = 0X00; /先清除一次更新中斷標(biāo)志 TIM1_CR1 = 0X05; /開始計(jì)數(shù) i = 0; PE_ODR |= 0XFE; PE_ODR &= 0XFD; /內(nèi)部第一行檢測(cè) if(P

19、B_IDR & 0X0F) != 0X0F) delay(50); if(PB_IDR & 0X0F) != 0X0F) switch (PB_IDR & 0X0F) case 0X0E: bottonNum = 1; break; case 0X0D: bottonNum = 2; break; case 0X0B: bottonNum = 3; break; case 0X07: bottonNum = 4; break; default: break; PE_ODR |= 0XFE; PE_ODR &= 0XFB; /內(nèi)部第二行檢測(cè) if(PB_IDR &

20、amp; 0X0F) != 0X0F) delay(50); if(PB_IDR & 0X0F) != 0X0F) switch (PB_IDR & 0X0F) case 0X0E: bottonNum = 5; break; case 0X0D:; bottonNum = 6; break; case 0X0B: bottonNum = 7; break; case 0X07: bottonNum = 8; break; default: break; PE_ODR |= 0XFE; PE_ODR &= 0XF7; /內(nèi)部第三行開關(guān)請(qǐng)求檢測(cè) if(PB_IDR &am

21、p; 0X0F) != 0X0F) delay(50); if(PB_IDR & 0X0F) != 0X0F) switch (PB_IDR & 0X0F) case 0X0E: /開門請(qǐng)求 if(FloorNow = floorToGo) | (floorToGo = -1) PE_ODR |= 0X01; else ; break; case 0X0D: /關(guān)門請(qǐng)求 PE_ODR &= 0XFE; j +; break; default: break; PE_ODR |= 0XFE; /用完一次行掃描就關(guān)閉本次行掃描碼進(jìn)行其他判斷,判斷完了重新開就是了 PA_ODR

22、 = 0XF7; /外部按鍵第一行檢測(cè) if(PB_IDR & 0XF0) != 0XF0) delay(50); if(PB_IDR & 0XF0) != 0XF0) switch (PB_IDR & 0XF0) case 0XE0: bottonNum = 1; break; case 0XD0: bottonNum = 2; break; case 0XB0: bottonNum = 3; break; case 0X70: bottonNum = 4; break; default: break; PA_ODR = 0XEF; /外部按鍵第二行檢測(cè) if(PB_

23、IDR & 0XF0) != 0XF0) delay(50); if(PB_IDR & 0XF0) != 0XF0) switch (PB_IDR & 0XF0) case 0XD0: bottonNum = 2; break; case 0XB0: bottonNum = 3; break; case 0X70: bottonNum = 4; break; default: break; PA_ODR = 0XDF; /外部按鍵第三行檢測(cè) if(PB_IDR & 0XF0) != 0XF0) delay(50); if(PB_IDR & 0XF0) !

24、= 0XF0) switch (PB_IDR & 0XF0) case 0XE0: bottonNum = 5; break; case 0XD0: bottonNum = 6; break; case 0XB0: bottonNum = 7; break; default: break; PA_ODR = 0XBF; /外部按鍵第四行檢測(cè) if(PB_IDR & 0XF0) != 0XF0) delay(50); if(PB_IDR & 0XF0) != 0XF0) switch (PB_IDR & 0XF0) case 0XE0: bottonNum = 5

25、; break; case 0XD0: bottonNum = 6; break; case 0XB0: bottonNum = 7; break; case 0X70: bottonNum = 8; break; default: break; Step_one(bottonNum); Judge_Direction(); Floor_To_Go(); /if(HXFloorNow != floorToGo) /目的樓層亮燈判斷 if(floorToGo != -1) PE_ODR &= 0XFE; /電梯移動(dòng)時(shí)的強(qiáng)制關(guān)門指令 else; /上下指示燈的行為步驟 if (direct

26、ion = 0) PG_ODR = 0XFD; else if(direction = 1) PG_ODR = 0XFE; else PG_ODR |= 0XFF; /到達(dá)樓層,關(guān)掉上下指示燈 PE_ODR &= 0X01; /繼續(xù)輸出全零掃描碼 PA_ODR = 0X00;/中斷內(nèi)開關(guān)電梯門判斷程序void DoorJudge(void) Temp2 +; /開始計(jì)數(shù)(10s) PG_ODR = 0XFF; /再次確認(rèn)關(guān)掉上下指示燈 if(Temp2 > 5) /到了10s PE_ODR &= 0XFE; /把門關(guān)上 Floor_To_Go(); else /沒到10s

27、 if(j > 0) /但是有人按了關(guān)門鍵 PE_ODR &= 0XFE; /那就關(guān)門 Floor_To_Go(); else /如果沒人按鍵盤 PE_ODR |= 0X01; /那就先開著電梯門 void delay(unsigned int time) while(time -);/*當(dāng)按鈕按下時(shí),將會(huì)觸發(fā)外部中斷*/*外部中斷的第一步將會(huì)修改全局?jǐn)?shù)組*/void Step_one(int bottonNum) if (bottonNum != FloorNow) floorStatebottonNum = 1;/*外部中斷的第二步將會(huì)判斷direction變量的取值*/vo

28、id Judge_Direction() int i; bool flag = 0; if (direction = -2) /*此時(shí)電梯處于剛開機(jī)的狀態(tài)*/ direction = 1; /*電梯運(yùn)行方向?yàn)橄蛏?/ else if (direction = 1) /*當(dāng)電梯在向上運(yùn)行時(shí)*/ for (i = FloorNow + 1; i <= Floors; i+) if (floorStatei = 1) flag = 1; return; if (flag = 0) for (i = FloorNow - 1; i >= 1; i-) if (floorStatei = 1

29、) flag = 1; direction = 0; return; if (flag = 0) direction = -1; return; else if (direction = 0) /*當(dāng)電梯在向下運(yùn)行時(shí)*/ for (i = FloorNow - 1; i >= 1; i-) if (floorStatei = 1) flag = 1; return; if (flag = 0) for (i = FloorNow + 1; i <= Floors; i+) if (floorStatei = 1) flag = 1; return; if (flag = 0) direction = -1; return; else if (direction = -1) /*電梯再次靜止*/ int a = 0, b = 0, i, flag1 = 0, fl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論