⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 电梯3b.txt

📁 用键盘、按键、八段码和LED模拟电梯的工作过程。楼层设为8层
💻 TXT
📖 第 1 页 / 共 2 页
字号:
一.实验基本要求

达到的实验要求:

用键盘、按键、八段码和LED模拟电梯的工作过程。楼层设为8层,键盘数字键1~8用来键入希望停的楼层,8个LED希望停的楼层,八段码指示电梯当前所在楼层,按钮用来启、停电梯。电梯正常运行时以每2秒1层的速度上升或下降。要求“电梯”能按以下方式运行:

(1)设当前电梯停在某(8段码显示相应楼层,8个LED全灭)。键入1~8数字键,如键入的数字与当前电梯停层同,则不发生任何动作;若不同则相应楼层的LED亮。如再按运行键,则电梯自动判别上升或下降(在运行过程中八段码显示楼层变化)一直到达希望停的楼层(八段码显示该楼层,相应LED灭);

(2)设当前电梯正在上升或下降运行(此时八段码显示楼层变化,LED指示希望抵达的楼层),若键入新的希望停的楼层数字(相应的LED亮),则对同方向(上升或下降)未到的楼层能停,对其他情况则先停原希望停的楼层,然后按运行键后继续运行。如下几例:

1):设电梯当前在2楼,向上运行,LED指示希望在6楼停,此时若键入4,则电梯将在4层停,若再按运行键,则继续运行至6层停。

2):同上情况,若键入的不是4而是8,则电梯将先停在6楼,再按运行键,运行至8层停。

3):同上情况,若键入的不是4(或8)而是1,则电梯将先停在6楼,再按运行键,运行至1层停。

达到进一步设计要求

除运行按钮外,有其他几个按钮,模拟更多的电梯运行功能,

(1)直达按钮v  若按此按钮,电梯按直达方式运行,即使运行期间新键入的停靠楼层(即使是同方向未到楼层)亦不停,直达终点楼层。

(2)急停按钮p  电梯运行中,若按此按钮,则电梯立即停在将要到达的楼层。

(3)断电待修键(由开关控制)  按下该钮电梯不能工作,再按一下才重新工作。

二.流程图(附)

三.源程序(附)

四.试验过程出现的问题及排除方法

编程中遇到的大多是逻辑问题.另一个经常遇到的问题就是跳转(jump)语句超出范围的错误(relative jump out of range),这个错误的解决是通过改变语句的顺序,如实在无法通过改变顺序来消除错误,则通过二次跳转,即跳过中间过程再跳至目标。

我们写的电梯程序,d的意义为当前楼层,当输入要去的楼层bl时,判断bl与cl的大小关系,假设bl>cl,则程序先把cl加1,再延时两秒,再比较bl与cl的大小是否相等,如果相等则跳出,不等则把cl加1,再延时,再判断。

当在上行过程中再输入另一个想去的楼层ch时,则跳转至 ch处理过程。因为是在延时前就把cl加1了,因此在这上行两秒内,cl已经上了一层了。因此就必须判断ch以及bl是否与此时的cl相等,如相等则在即将到达的这一层停。由于一开始我们来判断bl与cl是否相等,导致如果在即将到bl层的时候按下ch则会使cl不断增大,即ASCП 码不断增大,又返回至0H,又增大至bl 才停止。

另外一个问题就是8个LED显示要去哪个楼层的问题。我们是用数据DD0—DD7接到74LS273输出的。bl,ch同时要被显示。我们于是就把bl,ch的0,1,2,3,…..8分别对应于0B,1B,10B,………10000000B,然后把两者相加就能显示了。如果到达bl则把bl赋为0,则对应灯灭。如果到达ch,则把ch赋为0,则ch对应楼层灯灭。现在如果输入ch等于bl,按要求是对应灯亮,到该层停,而实际上变成上一层灯亮,因为ch与bl对应二进制相加,产生进位。解决方法是,如果bl,ch相等,则先把cl 复 位为0,然后再调用8LED显示。


源文件:

data segment

ioport     equ 0c400h-0280h

ls273      equ ioport+2a8h;74ls273芯片地址

io8255a equ ioport+288h;8255控制端以及a,c端口地址

io8255b equ ioport+28bh

io8255c equ ioport+28ah

io8253a equ ioport+280h;8253控制端以及0,1计数端口地址

io8253b equ ioport+281h

io8253c equ ioport+283h

led  db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;七段码

data ends

code segment

       assume cs:code,ds:data

start:       mov ax,data

       mov ds,ax

       mov dx,io8255b;8255初始化,a口输出,c口输入

       mov al,8bh

       out dx,al

       mov cl,31h;cl代表当前电梯所在楼层,初始值设为1    

main:     mov al,0

       call disp;显示当前楼层

       mov bl,0;bl为第一次输入的要去的楼层

       mov ch,0;ch为在中途中再次输入的要去的楼层

       call disp8led

       mov ah,01;键盘输入bl

       int 21h

       cmp al,1bh;是esc则退出

       je exit

       cmp al,31h;在1-8之间?如不是重新输入

       jl main

       cmp al,38h

       jg main

       mov bl,al

       call disp8led;8led显示bl对应的楼层

       cmp bl,cl;bl与cl比较

       je main;相等则返回重新输入

       jg up;大于则向上运行

jl down;小于则向下运行

up:  call stop;调用暂停子程序

goup:     add cl,1

       call updelay;调用向上运行延时子程序

       call disp;调用显示子程序,用于显示当前楼层cl

       cmp cl,bl;cl,bl不等则继续

       je main;相等则返回

       jmp goup

tomain:jmp main

upgetch:mov ah,1;在上升过程中如在有按键则跳转此处

       int 21h

       cmp al,73h;s键断电待修,验收时改用开关改变8253门控信号实现该功能

       je uprepair

       cmp al,70h;p键急停键

       je urgent

       cmp al,31h;在1-8之间?如不是继续上行

       jl gotoup

       cmp al,38h

       jg gotoup

       mov ch,al

       call disp8led;显示cl对应楼层led

       call delay2;两秒计时时间到

       call disp;显示当前楼层

       call blequcl;判断bl与cl是否相等

       cmp ch,cl;比较ch与cl的区别

       je stopupbl;相等着在该层停,等待运行信号输入

       jl upbldownch;ch小于cl则先上行至bl在下行至ch

       cmp ch,bl;ch大于cl则在判断ch与bl的大小关系

       je jmpupbl;相等则一直上行至bl

       jl upchupbl;ch大于cl小于bl则先上行到ch在上行到bl

       jg toupblupch;ch大于bl则先上行到bl在上行到ch

gotoup:call delay2

       jmp goup      

uprepair:mov al,0;验收时未用

       mov ah,1

       int 21h

       cmp al,73h

       jne uprepair

       call delay2

       call disp

 jmp goup


urgent:   call delay2;急停功能

       call disp

       jmp main

updelay proc near;向上运行延时子程序

       call delay;用于初始化8253

       push dx

ud:  mov ah,1;键盘是否有输入

       int 16h

       jne upgetch;如有则跳转到输入处理

       mov dx,io8255c;8255c口输入

       in al,dx

       and al,01;是否计时结束

       jz ud

       pop dx

       ret

updelay endp

toupblupch:jmp upblupch

down:    call stop;调用暂停子程序

godown:       sub cl,1

       call downdelay;调用向下运行延时子程序

       call disp;调用显示子程序,用于显示当前楼层cl

       cmp cl,bl;cl,bl不等则继续

       je tomain;相等则返回

       jmp godown

stopupbl:call disp

       mov ch,0

       call disp8led

       call stop2

       call upbl

       jmp main

upbldownch:call disp8led

       call upbl

       mov bl,0

       call disp8led

       call stop2

       call downch

       jmp main

jmpupbl:mov ch,0

       call disp8led

       call upbl

       jmp main

upchupbl:call disp8led

       call upch

       mov ch,0

call disp8led


call stop2

       call upbl

       jmp main

upblupch:call disp8led

       call upbl

       mov bl,0

       call disp8led

       call stop2

       call upch

       jmp main

downdelay proc near;向下运行延时子程序,与向上运行延时子程序大体相同

       call delay

       push dx

dd:  mov ah,1

       int 16h

       jne downgetch

       mov dx,io8255c

       in al,dx

       and al,01

       jz dd

       pop dx

       ret

downdelay endp

downgetch:mov ah,1;在下降过程中如在有按键则跳转此处

       int 21h

       cmp al,73h;s键断电待修,验收时改用开关改变8253门控信号实现该功能

       je downrepair

       cmp al,70h;p键急停键

       je urgent2

       cmp al,31h;在1-8之间?如不是继续下降

       jl gotodown

       cmp al,38h

       jg gotodown

       mov ch,al

       call disp8led;显示cl对应楼层led

       call delay2;两秒计时时间到

       call disp;显示当前楼层

       call blequcl;判断bl与cl是否相等

       cmp ch,cl;比较ch与cl的区别

       je stopdownbl;相等着在该层停,等待运行信号输入


jg downblupch;ch大于cl则先下行至bl在上行至ch

       cmp ch,bl;ch小于cl则在判断ch与bl的大小关系

       je jmpdownbl;相等则一直下行至bl

       jl downbldownch;ch小于cl小于bl则先下行到bl在下行到ch

       jg downchdownbl;ch大于bl则先下行到ch在下行到bl

gotodown:call delay2

       jmp godown

downrepair:mov al,0

       mov ah,1

       int 21h

       cmp al,73h

       jne downrepair

       call delay2

       call disp

       jmp godown

stopdownbl:call disp8led

       mov ch,0

       call disp8led

       call stop2

       call downbl

       jmp main

downblupch:call disp8led

       call downbl

       mov bl,0

       call disp8led

       call stop2

       call upch

       jmp main

urgent2:call delay2;急停功能

       call disp

       jmp main

jmpdownbl:mov ch,0

       call disp8led

       call downbl

       jmp main

downbldownch:call disp8led

       call downbl

       mov bl,0

       call disp8led

       call stop2

       call downch

       jmp main

downchdownbl:call disp8led

       call downch


mov ch,0

       call disp8led

       call stop2

       call downbl

       jmp main

vip: cmp bl,cl;直达功能

       jl vipdown

       jg vipup

       jmp main

vipup:    add cl,1

       call vipdelay

       call disp

       jmp vip

vipdown:sub cl,1

       call vipdelay

       call disp

       jmp vip

vipgetch:mov ah,1;直达过程中对急停以及断电待修的处理

       int 21h

       cmp al,73h

       je viprepair

       cmp al,70h

       je urgent2

       call delay2

       jmp vip

viprepair:mov al,0

       mov ah,1

       int 21h

       cmp al,73h

       jne viprepair

       call delay2

       call disp

       jmp vip

vipdelay proc near;直达的延时子程序

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -