模拟电梯的设计与实现一、实验目的1.了解电梯调度算法。2.利用微机实验系统来模拟电梯。3.进一步掌握微机接口的设计方法。二、实验内容与要求1.设计基本要求用键盘、按钮、发光二极管和LED显示单元来模拟电梯工作过程。楼层设为5层,用键盘键入希望停的楼层,5个发光二极管显示希望停的楼层,LED指示电梯当前所在楼层,按钮用来启、停电梯。电梯正常运行时以每2秒1层的速度上升或下降。2.提高要求设计几个按钮,模拟更多的电梯运行功能,如:•直达按钮。若按此按钮,电梯按直达方式运行,即对运行期间新键入的停靠楼层(即使是同方向未到楼层)亦不停,直达终点楼层;•急停按钮。电梯运行中,若按此按钮,则电梯立即停在下一到达的楼层;•断电待修按钮。按下该钮电梯不能工作,再按一下才能重新工作;•其它功能按钮(由设计者自由发挥)。三、实验报告要求1.设计目的和内容2.总体设计3.硬件设计:原理图(接线图)及简要说明4.软件设计框图及程序清单5.设计结果和体会(包括遇到的问题及解决的方法)四、电梯的工作方式电梯工作按以下方式运行:1.假设当前电梯停在某层(LED显示相应楼层,5个发光二极管全灭)。键入数字键,如键入的数字与当前电梯停靠层相同,则什么也不做,若不同则相应楼层的发光二极管亮;电梯自动判别上升或下降(在运行过程中用八段码来显示楼层变化)一直到达希望停的楼层(八段码显示该楼层,相应LED灭)。2.假设当前电梯正在上升或下降运行(此时八段码显示楼层变化,LED指示希望抵达的楼层),若键入新的希望停靠的楼层数字(相应的LED亮),则对同方向(上升或下降)未到的楼层能停靠,对其它情况则先停靠原先希望停的楼层,然后继续运行)。如下几例:1)设电梯当前在2层,向上运行,LED指示希望在4层停,此时若键入3,则电梯将在3楼停,然后继续运行至4层停;2)同上情况,若键入的不是3而是5,则电梯将先停在4层,然后运行至5层停;3)同上情况,若键入的不是3(或5),而是1,则电梯先停在4层,然后运行至1层停。五、总体设计思路本设计主要是利用微机应用实验平台来模拟电梯的运行,用到了平台上的一个非编码键盘、LED显示器、八段数码管等模块。有5个楼层,需要用5个按键模拟电梯中的请求按钮,用5个按键模拟5个楼层每层向上请求的按钮,再用5个模拟5个楼层每层向下请求的按钮。非编码键盘有16个键,可以用1-5号键模拟电梯内的按钮,用6-0号键模拟每层向上请求的按纽,A-E模拟每层向下请求的按纽。当电梯静止状态时,无论外部哪一层有请求,电梯都由静止状态转入向上或向下运行的状态,直到到达请求的楼层;当电梯处于向上运行的状态时,此时高于该楼层向上的请求和内部请求级别最高,其次是所有楼层向下的请求,再次是低于该楼层向上的请求;当电梯处于向下运行的状态时则情况相反。由于中断级别在随着电梯所处楼层的不同而变化,而且中断源比较多。所以用每一个中断源直接和中断控制器相连,需要用到多个8259A级联,很不方便。为解决这个问题,首先定义三个单字节变量REQ_U、REQ_D和REQ_IN分别存储电梯每一层向上、向下和内部的请求,每一个变量用低5位,每一位代表一层。例如,REQ_U为00000110B,这代表在2层和3层有向上的请求。8253定时器每隔20ms产生一次中断,中断程序便去执行扫描键盘,当扫描到有电梯内部或者外部按键时,将请求存储到变量中。每到一个状态时再检查请求变量REQ_U、REQ_D和REQ_IN的值,根据电梯的运行方向和变量中的请求,来决定电梯下一步的运行。设电梯的当前楼层为floor(floor=1~5),运行方向为dir(dir=0,向上;dir=1,向下),在电梯运行的工程中,用数码管输出floor值显示当前的楼层。LED输出REQ_IN的值显示电梯内已经请求的楼层。六、系统硬件电路设计由于采用了PC机资源和微机实验平台,不需要其他的硬件电路。利用了微机平台上的8253定时/计数器、8255并行接口单元、LED单元、非编码键盘、数码管显示单元等等。系统结构框图,如图1所示。图1系统结构框图主要的模块如下:1.可编程定时/计数器8253定时/计数器8253主要是用于定时20ms,触发中断进行键盘扫描。电路连线是CLOCK0接Q6,分频后频率为46875Hz,OUT0接中断IRQ2,每20ms中断一次,GATE0接5v。计数器的初值应该是3A9H。2.8255并行接口单元8255主要是用于键盘的扫描和发光二极管的数据输出。所以用8255A口的低5位接5个发光二极管,B口低4位接非编码键盘的列线,高4位接键盘的行线。3.LED显示系统虽然只用了1格LED显示器,但为了数字更新更方便,主程序更加简单,故此系统选用动态显示方式。由于系统的软件部分的运行时的核心程序是一直循环的,因此显示程序也是在循环过程中一直被调用,从而实时地被显示出来。4.非编码键盘本系统采用的是行反转法来扫描键盘的,调用键盘扫描的程序TESTKEY后,程序中的变量KEY的值就是按下的键的值,如果KEY为0FFH则表示无键盘输入,为0~15则按照上往下从左往右的顺序分别代表每一个按键按下的信息。不过此扫描程序没有考虑到多个按键同时按下的情况。又因为模拟电梯的按键一般不会有两个按键同时按下的情况,所以,多个按键的情况可以不予考虑。Q6IRQ25Vclk08253GATE0OUT0A口8255B口C口LED显示模块CS0CS1CS2CS35个发光二极管非编码键盘片选七、软件设计本设计的软件设计的思路:通过软件编程使8253输出定时信号申请中断,在中断服务程序中扫描键盘,如果有按键,修改相应的变量位,并输出内部请求变量REQ_IN到发光二极管显示当前的内部请求楼层。在主程序中,查询变量的值,根据电梯调度算法运行电梯。1.主要设计模块程序主要包括以下主要模块:键盘扫描程序、LED显示程序、电梯调度算法。1)键盘扫描程序:采用的是行反转法来扫描键盘的,相应的程序设计请参考实验指导书上实验3中的相关介绍。2)LED显示程序:本设计只用到了一个LED,只要将floor转换为相应的段码。先输出位码,再输出段码,循环输出就可以动态显示。为了循环的显示,将LED显示程序放在中断服务程序中。相应的程序设计请参考实验指导书上实验3中的相关介绍。3)电梯调度算法:在设计时将电梯一次从下到上视为一次运行(注意不一定从底层到顶层),同理,电梯一次从上到下也视为一次运行(注意不一定从顶层到底层)。当电梯向上运行时:a)位于当前层以下的向上请求都被忽略留到下次向上运行时处理。b)位于当前层以上的向上请求都被记录留到此次运行处理。c)无论哪层的向下请求都被忽略留到下次向下运行时处理。当电梯向下运行时:a)位于当前层以上的向下请求都被忽略留到下次向下运行时处理。b)位于当前层以下的向下请求都被记录留到此次运行处理。c)无论哪层的向上请求都被忽略留到下次向上运行时处理。2.程序流程图1)主程序框图如图2开始系统初始化查询电梯请求变量电梯运行图2主程序框图2)中断服务程序框图如图3中断保护现场LED输出显示floor键盘扫描有键按下?修改请求变量点亮相应的发光二极管恢复现场中断返回是否图3中断服务程序框图3)电梯算法流程图如图4其中,dir代表电梯的运行方向,0代表电梯向上运行,1代表向下运动。设REQ_U(n)代表第n层向上的请求,同样,REQ_D(n)代表第n层向下的请求,REQ_IN(n)代表第n层内部的请求。求next的方法为:电梯向上时,next为内部请求的最小值和向上请求的大于floor的最小值之间的小者。电梯向下时,next为内部请求的最大值和向下请求中小于floor的最大值之间的大者。没有满足要求的时返回0。查询请求变量有请求?dir=0?求nextnext=0?floor++floor=next?延时清除请求变量相应位并延时求nextNdir=1YYN求nextnext=0?floor--floor=next?延时清除请求变量相应位并延时求nextNdir=0YYNYNYN图4电梯算法流程图