当前位置:文档之家› 汇编语言模拟电梯实验报告书

汇编语言模拟电梯实验报告书

一.实训目的 (1)二.实训内容与要求 (1)1.基本内容 (2)2.实训要求 (2)三.实训设计思路 (1)1.总体思路 (3)2.硬件设计 (4)3.软件设计 (6)四.模拟电梯源代码 (9)五.加载调试 (28)六.实训总结 (30)1.出现的问题及排除方法 (30)2.实训注意事项 (30)3.心得体会 (1)七.参考文献 (31)一.实训目的1.了解电梯调度算法,运用汇编语言编写程序。

2.利用微机实验系统来模拟电梯,实现电梯功能。

3.进一步掌握微机接口的设计方法,正确连各芯片引脚。

4. 加强学生实际应用能力及综合知识运用能力的培养。

二.实训内容与要求绘制流程图、根据流程图编写程序、选用硬件电路编制应用软件、自主选择硬编制应用软件,并画出详细原理图。

2.实训要求用键盘、按钮、八段码和LED模拟电梯工作过程。

楼层设为8层,键盘数字键1~8用来键入希望停的楼层,8个LED显示希望停的楼层,八段码指示电梯当前所在楼层,按钮用来启、停电梯。

电梯正常运行时以每2秒1层的速度上升或下降。

要求“电梯”能按以下方式运行:(1)设电梯停在某层。

键入1~8数字键,如数字与当前电梯停层同,则什么亦不动作,若不同则相应楼层的LED亮;如按运行键,则电梯自动判别上升或下降一直到达希望停的楼层。

(2)设电梯正在上升或下降运行,若键入新的希望停的楼层数字,则对同方向未到的楼层能停,对其它情况则先停原希望停的楼层,然后按运行键后继续运行)。

如下几例:电梯在2层,向上运行,LED希望在6层停,若键入4,则将在4楼停,若按运行键,则运行至6层停;若键入的不是4而是8,则电梯将先停在6层,再按运行键,运行至8层停若键入的不是4(或8),而是1,则电梯先停在6层,再按运行键,运行至1层停。

三.实训设计思路利用非编码键盘、LED显示器、八段数码管等模块。

有8个楼层,用8个按键模拟电梯中的请求按钮,用8个按键模拟8个楼层每层向上请求的按钮,再用8个模拟8个楼层每层向下请求的按钮。

非编码键盘有16个键,可以用1-8号键模拟电梯内的按钮。

当电梯静止状态时,无论外部哪一层有请求,电梯都由静止状态转入向上或向下运行的状态,直到到达请求的楼层;当电梯处于向上运行的状态时,此时高于该楼层向上的请求和内部请求级别最高,其次是所有楼层向下的请求,再次是低于该楼层向上的请求;当电梯处于向下运行的状态时则情况相反。

由于中断级别在随着电梯所处楼层的不同而变化,定义三个单字节变量REQ_U、REQ_D和REQ_IN分别存储电梯每一层向上、向下和内部的请求,每一个变量用低8位,每一位代表一层。

8253定时器每隔20ms产生一次中断,中断程序便去执行扫描键盘,当扫描到有电梯内部或者外部按键时,将请求存储到变量中。

每到一个状态时再检查请求变量REQ_U、REQ_D和REQ_IN的值,根据电梯的运行方向和变量中的请求,来决定电梯下一步的运行。

设电梯的当前楼层为floor(floor=1~8),运行方向为dir(dir=0,向上;dir=1,向下),在电梯运行的工程中,用数码管输出floor值显示当前的楼层。

LED输出REQ_IN的值显示电梯内已经请求的楼层。

图1 系统结构框图2.硬件设计由于采用了PC 机资源和微机实验平台,不需要其他的硬件电路。

利用了微机平台上的8253定时/计数器、8255并行接口单元、LED 单元、非编码键盘、数码管显示单元等等。

图2 硬件结构图主要的模块如下: 可编程定时/计数器8253定时/计数器8253主要是用于定时20ms ,触发中断进行键盘扫描。

电路连线是CLOCK0接Q6,分频后频率为46875Hz ,OUT0接中断IRQ2,每20ms 中断一次,GATE0接5v 。

计数器的初值应该是3A9H 。

8255并行接口单元8255主要是用于键盘的扫描和发光二极管的数据输出。

所以用8255A 口的低5位接5个发光二极管,B 口低4位接非编码键盘的列线,高4位接键盘的行线。

LED 显示系统用1格LED 显示器,选用动态显示方式。

,显示程序在循环过程中一直被调用,从而实时地被显示出来。

已知用于LED 数码管显示的编码表为: LEDtable DB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hDB 80h,90h,88h,83h,0c6h,0c1h,86h,8eh 它依次表示0~9,A ~F 这16个数码的显示编码。

数字对应数码管显示控制转换字节(共阴编码)显示--HGFE,DCBA --编码 0 --0011,1111--0x3F; 1 --0000,0110--0x06;2 --0101,1011--0x5B;3 --0100,1111--0x4F;4 --0110,0110--0x66;5 --0110,1101--0x6D;6 --0111,1101--0x7D;7 --0000,0111--0x07;8 --0111,1111--0x7F;9 --0110,1111--0x6F; 非编码键盘采用的是行反转法来扫描键盘的,调用键盘扫描的程序TESTFLOOR 后,程序中的变量FLOOR 的值就是按下的键的值,如果FLOOR 为0FFH 则表示无键盘输入,为0~15 则按照上往下从左往右的顺序分别代表每一个按键按下的信息。

5.74ls273带有清除端的8D 触发器,在清除端保持高电平时,具有锁存功能,锁存控制端为11脚CLK ,采用上升沿锁存。

1D ~8D 为数据输入端,1Q ~8Q 为数据输出端,正脉冲触发,低电平清除。

3.软件设计设计思路:通过软件编程使8253输出定时信号申请中断,在中断服务程序中扫描键盘,如果有按键,修改相应的变量位,并输出内部请求变量REQ_IN 到发光二极管显示当前的内部请求楼层。

在主程序中,查询变量的值,根据电梯调度算法运行电梯。

(1)主要设计模块程序主要包括以下主要模块:键盘扫描程序、LED 显示程序、电梯调度算法。

1)键盘扫描程序:采用的是行反转法来扫描键盘的。

2)LED 显示程序:只用到了一个LED ,只要将floor 转换为相应的段码。

先输出位码,再输出段码,循环输出就可以动态显示。

为了循环的显示,将LED显示程序3)电梯调度算法:在设计时将电梯一次从下到上视为一次运行(注意不一定从底层到顶层),同理,电梯一次从上到下也视为一次运行(注意不一定从顶层到底层)。

当电梯向上运行时:位于当前层以下的向上请求都被忽略留到下次向上运行时处理;位于当前层以上的向上请求都被记录留到此次运行处理;无论哪层的向下请求都被忽略留到下次向下运行时处理。

当电梯向下运行时:位于当前层以上的向下请求都被忽略留到下次向下运行时处理;位于当前层以下的向下请求都被记录留到此次运行处理;无论哪层的向上请求都被忽略留到下次向上运行时处理。

(2)程序流程图1)主程序框图如图2图3 主程序框图2)中断服务程序框图如图3图4 中断服务程序框图3)电梯算法流程图如图4其中,dir 代表电梯的运行方向,0代表电梯向上运行,1代表向下运动。

设REQ_U(n)代表第n 层向上的请求,同样,REQ_D(n) 代表第n 层向下的请求,REQ_IN(n) 代表第n 层内部的请求。

求next 的方法为:电梯向上时,next 为内部请求的最小值和向上请求的大于floor 的最小值之间的小者。

电梯向下时,next 为内部请求的最大值和向下请求中小于floor 的最大值之间的大者。

没有满足要求的时返回0。

图5 电梯算法流程图四.模拟电梯源代码data segmentioport equ 0c400h-0280hls273 equ ioport+2a8h;74ls273芯片地址io8255a equ ioport+288h;8255控制端以及a,c端口地址Array io8255b equ ioport+28bhio8255c equ ioport+28ahio8253a equ ioport+280h;8253控制端以及0,1计数端口地址io8253b equ ioport+281hio8253c equ ioport+283hled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;七段码data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov dx,io8255b;8255初始化,a口输出,c口输入mov al,8bhout dx,almov cl,31h;cl代表当前电梯所在楼层,初始值设为1 main: mov al,0call disp;显示当前楼层mov bl,0;bl为第一次输入的要去的楼层mov ch,0;ch为在中途中再次输入的要去的楼层call disp8ledmov ah,01;键盘输入blint 21hcmp al,1bh;是esc则退出je exitcmp al,31h;在1-8之间?如不是重新输入jl maincmp al,38hjg main Array mov bl,alcall disp8led;8led显示bl对应的楼层cmp bl,cl;bl与cl比较je main;相等则返回重新输入jg up;大于则向上运行jl down;小于则向下运行up: call stop;调用暂停子程goup:add cl,1call updelay;调用向上运行延时子程序call disp;调用显示子程序,用于显示当前楼层clcmp cl,bl;cl,bl不等则继续je main;相等则返回jmp gouptomain:jmp mainupgetch:mov ah,1;在上升过程中如在有按键则跳转此处int 21hcmp al,73h;s键断电待修,验收时改用开关改变8253门控信号实现该功能je uprepaircmp al,70h;p键急停键je urgentcmp al,31h;在1-8之间?如不是继续上行jl gotoupcmp al,38hjg gotoupmov ch,alcall disp8led;显示cl对应楼层ledcall delay2;两秒计时时间到Array call disp;显示当前楼层call blequcl;判断bl与cl是否相等cmp ch,cl;比较ch与cl的区别je stopupbl;相等着在该层停,等待运行信号输入jl upbldownch;ch小于cl则先上行至bl在下行至chcmp ch,bl;ch大于cl则在判断ch与bl的大小关系je jmpupbl;相等则一直上行至bljl upchupbl;ch大于cl小于bl则先上行到ch在上行到bl jg toupblupch;ch大于bl则先上行到bl在上行到ch gotoup:call delay2jmp goupuprepair:mov al,0;验收时未用mov ah,1int 21hcmp al,73hjne uprepaircall delay2call dispjmp goupurgent:call delay2;急停功能call dispjmp mainupdelay proc near;向上运行延时子程序call delay;用于初始化8253push dxud: mov ah,1;键盘是否有输入int 16hjne upgetch;如有则跳转到输入处理in al,dxand al,01;是否计时结束jz udpop dxretupdelay endptoupblupch:jmp upblupchdown: call stop;调用暂停子程序godown:sub cl,1call downdelay;调用向下运行延时子程序call disp;调用显示子程序,用于显示当前楼层clcmp cl,bl;cl,bl不等则继续je tomain;相等则返回jmp godownstopupbl:call dispmov ch,0call disp8ledcall stop2call upbljmp mainupbldownch:call disp8ledcall upblmov bl,0call disp8ledcall stop2call downchjmp maincall disp8ledcall upbljmp mainupchupbl:call disp8ledcall upchmov ch,0call disp8ledcall stop2call upbljmp mainupblupch:call disp8ledcall upblmov bl,0call disp8ledcall stop2call upchjmp maindowndelay proc near;向下运行延时子程序,与向上运行延时子程序大体相同call delaypush dxdd: mov ah,1int 16hjne downgetchmov dx,io8255cin al,dxand al,01pop dxretdowndelay endpdowngetch:mov ah,1;在下降过程中如在有按键则跳转此处int 21hcmp al,73h;s键断电待修,验收时改用开关改变8253门控信号实现该功能je downrepaircmp al,70h;p键急停键je urgent2cmp al,31h;在1-8之间?如不是继续下降jl gotodowncmp al,38hjg gotodownmov ch,alcall disp8led;显示cl对应楼层ledcall delay2;两秒计时时间到call disp;显示当前楼层call blequcl;判断bl与cl是否相等cmp ch,cl;比较ch与cl的区别je stopdownbl;相等着在该层停,等待运行信号输入jg downblupch;ch大于cl则先下行至bl在上行至chcmp ch,bl;ch小于cl则在判断ch与bl的大小关系je jmpdownbl;相等则一直下行至bljl downbldownch;ch小于cl小于bl则先下行到bl在下行到ch jg downchdownbl;ch大于bl则先下行到ch在下行到bl gotodown:call delay2jmp godowndownrepair:mov al,0 Array mov ah,1int 21hcmp al,73hjne downrepaircall delay2call dispjmp godownstopdownbl:call disp8ledmov ch,0call disp8ledcall stop2call downbljmp maindownblupch:call disp8ledcall downblmov bl,0call disp8ledcall stop2call upchjmp mainurgent2:call delay2;急停功能 call dispjmp main jmpdownbl:mov ch,0call disp8ledcall downbljmp main Array downbldownch:call disp8led call downblmov bl,0call disp8led call stop2call downchjmp main downchdownbl:call disp8led call downchmov ch,0call disp8led call stop2call downbljmp mainvip: cmp bl,cl;直达功能jl vipdownjg vipupjmp mainvipup:add cl,1call vipdelaycall dispjmp vipvipdown:sub cl,1call vipdelaycall dispjmp vipvipgetch:mov ah,1;直达过程中对急停以及断电待修的处理int 21h Array cmp al,73hje viprepaircmp al,70hje urgent2call delay2jmp vipviprepair:mov al,0mov ah,1int 21hcmp al,73hjne viprepaircall delay2call dispjmp vipvipdelay proc near;直达的延时子程序call delaypush dxvd: mov ah,1int 16hjne vipgetchmov dx,io8255cin al,dxand al,01jz vdpop dxretvipdelay endp Array stop proc near;暂停子程序,实现按回车继续和判断是否为直达键gostop:mov al,0mov ah,1int 21hcmp al,76h;是否为直达键je vipcmp al,13;是否为运行键jne gostopmov al,0retstop endpupbl proc near;上行到bl的子程序upbl1:add cl,1call dirdelaycall dispcmp cl,bljl upbl1retupbl endpupch proc near;上行到ch的子程序upch1:add cl,1call dirdelaycall dispcmp cl,chjl upch1retupch endpdownbl proc near;下行到bl的子程序downbl1:sub cl,1call dirdelaycmp cl,bljg downbl1retdownbl endpdownch proc near;下行到ch的子程序downch1:sub cl,1call dirdelaycall dispcmp cl,chjg downch1retdownch endpdelay proc near;初始化8253的子程序,两计数器连级push dxmov dx,io8253c;8253的计数器0置方式3mov al,36hout dx,almov dx,io8253a;计数器0初始值为10000mov ax,10000out dx,almov al,ahout dx,almov dx,io8253c;8253的计数器1置方式0mov al,70hout dx,almov dx,io8253b;计数器1初始值为200 Array mov ax,200out dx,almov al,ahout dx,alpop dxretdelay endpurgent3:call delay2call dispjmp mainblequcl proc nearcmp bl,cljne backcmp bl,chje blequchmov bl,0call dispcall disp8ledcall stop2cmp ch,cljg upchherejl downchhereupchhere:call upchjmp maindownchhere:call downchjmp mainblequch:mov ch,0call disp8ledjmp mainback: retblequcl endpdirdelay proc near;直接上下行的延时子程序call delaypush dxdirback:mov ah,1int 16hjne dirgetchmov dx,io8255cin al,dxand al,01jz dirbackpop dxretdirdelay endpdirgetch:mov ah,1;直接上下行对按键的处理int 21hcmp al,73hje dirrepaircmp al,70hje urgent3jmp dirbackdirrepair:mov al,0mov ah,1int 21hjne dirrepaircall delay2call dispjmp dirbackstop2 proc near;没有直达键的暂停子程序gostop2:mov al,0mov ah,1int 21hcmp al,13jne gostop2mov al,0retstop2 endpdelay2 proc near;判断延市时是否结束的子程序push dxdelay3:mov dx,io8255cin al,dx ;查询8255的Pc0是否为高电平 and al,01jz delay3pop dxretdelay2 endpdisp proc near;显示当前楼层的子程序mov dl,clmov ah,2int 21h;用于在屏幕上显示mov dl,0dhmov ah,2 ;回车符int 21hmov dl,0ahmov ah,2 ;换行符int 21hsub cl,30h;七段码显示mov al,clpush bxpush dxmov bx,offset ledxlatmov dx,io8255aout dx,alpop dxpop bxadd cl,30hmov al,0retdisp endpdisp8led proc near;8led显示,显示bl与cl对应的楼层push axcmp bl,0hje n0cmp bl,31hje n1cmp bl,32hje n2cmp bl,33hje n3cmp bl,34hje n4cmp bl,35hje n5cmp bl,36hje n6cmp bl,37hje n7cmp bl,38hje n8n0: mov al,0bjmp chledn1: mov al,1bjmp chledn2: mov al,10bjmp chledn3: mov al,100bjmp chledn4: mov al,1000bjmp chledn5: mov al,10000bjmp chledn6: mov al,100000bjmp chledn7: mov al,1000000bjmp chledn8: mov al,10000000bjmp chledje m0cmp ch,31hje m1cmp ch,32hje m2cmp ch,33hje m3cmp ch,34hje m4cmp ch,35hje m5cmp ch,36hje m6cmp ch,37hje m7cmp ch,38hje m8m0: add al,0bjmp displedm1: add al,1bjmp displedm2: add al,10bjmp displedm3: add al,100bjmp displedm4: add al,1000bm5: add al,10000bjmp displedm6: add al,100000bjmp displedm7: add al,1000000bjmp displedm8: add al,10000000bjmp displed displed:push dx mov dx,ls273 out dx,al pop dxpop axmov al,0 ret disp8led endp exit:mov ah,4ch int 21h code ends end start五.加载调试1.打开实验箱,插上电源线和数据线,数据线的两端分别插到pc 的串口和实验箱的,仿真机通讯口2.打开实验箱右侧电源,打开实验箱里的电源。

相关主题