东南大学吴健雄学院微机课程设计电梯控制器Word文档格式.docx

上传人:b****5 文档编号:19102989 上传时间:2023-01-03 格式:DOCX 页数:34 大小:717.01KB
下载 相关 举报
东南大学吴健雄学院微机课程设计电梯控制器Word文档格式.docx_第1页
第1页 / 共34页
东南大学吴健雄学院微机课程设计电梯控制器Word文档格式.docx_第2页
第2页 / 共34页
东南大学吴健雄学院微机课程设计电梯控制器Word文档格式.docx_第3页
第3页 / 共34页
东南大学吴健雄学院微机课程设计电梯控制器Word文档格式.docx_第4页
第4页 / 共34页
东南大学吴健雄学院微机课程设计电梯控制器Word文档格式.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

东南大学吴健雄学院微机课程设计电梯控制器Word文档格式.docx

《东南大学吴健雄学院微机课程设计电梯控制器Word文档格式.docx》由会员分享,可在线阅读,更多相关《东南大学吴健雄学院微机课程设计电梯控制器Word文档格式.docx(34页珍藏版)》请在冰豆网上搜索。

东南大学吴健雄学院微机课程设计电梯控制器Word文档格式.docx

当电梯处于向上运行的状态时,此时高于该楼层向上的请求和内部请求级别最高,其次是所有楼层向下的请求,再次是低于该楼层向上的请求;

当电梯处于向下运行的状态时则情况相反;

由于中断级别在随着电梯所处楼层的不同而变化,而且中断源比较多。

所以用每一个中断源直接和中断控制器相连,需要用到多个8259A级联,很不方便。

为解决这个问题,首先定义三个单字节变量REQ_U、REQ_D和REQ_IN分别存储电梯每一层向上、向下和内部的请求,每一位代表一层。

例如,REQ_U为00000110B,这代表在2层和3层有向上的请求。

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

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

设电梯的当前楼层为floor(floor=1~8),运行方向为dir(dir=0,向上;

dir=1,向下),在电梯运行的工程中,用数码管输出floor值显示当前的楼层。

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

主要的模块如下:

1.可编程定时/计数器8253

定时/计数器8253主要是用于定时20ms,触发中断进行键盘扫描。

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

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

2.8255并行接口单元

8255主要是用于数码管和发光二极管的数据输出。

所以用8255B口8接8个发光二极管,A口接数码管的数据端。

3LED点阵显示

由于提高要求需要显示上下箭头,所以使用8*8点阵显示箭头。

4微机控制器

程序在微机上运行,通过总线控制实验箱上各部件的运行。

三.详细(机理)设计

1)软件流程图(总流程图)

本设计的软件设计的思路:

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

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

图表1电梯系统总流程图

2)电梯控制算法模块

逻辑实现:

当电梯向上运行时:

 

a)位于当前层以下的向上请求都被忽略留到下次向上运行时处理。

b)位于当前层以上的向上请求都被记录留到此次运行处理。

c)无论哪层的向下请求都被忽略留到下次向下运行时处理。

当电梯向下运行时:

a)位于当前层以上的向下请求都被忽略留到下次向下运行时处理。

 

b)位于当前层以下的向下请求都被记录留到此次运行处理。

c)无论哪层的向上请求都被忽略留到下次向上运行时处理。

算法实现:

dir代表电梯的运行方向,0代表电梯向上运行,1代表向下运动。

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

求next的方法为:

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

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

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

图表2电梯控制算法流程图

3)LED显示程序:

本设计只用到了一个LED,只要将floor转换为相应的段码。

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

为了循环的显示,将LED显示程序放在中断服务程序中。

(将“楼层”作偏移码,利用XLAT,很简单就可以实现译码)

图表3电梯按键、显示中断流程图

4)硬件连接图

急停开关

四.方案实现与测试(或调试)

首先根据设计思路,选择采用8253和8255芯片,规避了使用较为复杂的中断。

然后调试硬件,确定位选、芯片等工作正常。

这可以通过手动输入控制字,进行简单输入输出实现。

然后确定8253、8255芯片的地址,开始软件编程。

软件编程首先完成整体的逻辑框架,然后具体编写子程序。

刚开始时采用软件延时,优先调试8255。

采用8255的A、B口的0方式,A、B口的变化将反映在八段码和LED灯上。

子程序的编写即将设计好的算法转换为程序流,用程序流的方向实现选择,用调用子程序实现具体操作。

然后加入8253的硬件延时,将OUT1连至PC0,通过不断查询PC0口的状态进行延时。

由于前面8255已经调好,所以8253的调试比较顺利。

最终将全部硬件连线接好,进行整机联调。

当中发现许多问题,首先利用示波器排除硬件故障,再回过头来对软件进行单步,这时由于有现象,进行软件调试的时候也更有针对性。

通过设置断点,逐步跟踪寄存器值,经过几次的修改之后,成功实现了预定方案。

由于数码管和LED灯显示都是采用查表法,根据输入字符的ASCII码查表得到输出,有时出现LED不正常亮灭的现象,是在查表时出错,比如没有减去31H,就会使灯的显示杂乱无章。

实物连接图:

五.分析与总结

1)设计要求每次电梯开关时间为2秒,而一开始我们无法保证精确的时间。

后来经过讨论后发现可以用8253计数器达到此功能,我们翻阅书籍后分别用方式3和方式0实现了精确2秒的要求。

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

3)我们写的电梯程序,d的意义为当前楼层,当输入要去的楼层bl时,判断bl与cl的大小关系,假设bl>

cl,则程序先把cl加1,再延时两秒,再比较bl与cl的大小是否相等,如果相等则跳出,不等则把cl加1,再延时,再判断。

4)当在上行过程中再输入另一个想去的楼层ch时,则跳转至ch处理过程。

因为是在延时前就把cl加1了,因此在这上行两秒内,cl已经上了一层了。

因此就必须判断ch以及bl是否与此时的cl相等,如相等则在即将到达的这一层停。

由于一开始我们来判断bl与cl是否相等,导致如果在即将到bl层的时候按下ch则会使cl不断增大,即ASCII码不断增大,又返回至0,又增大至bl才停止。

5)另外一个问题就是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,然后再调用LED显示。

6)电梯这个题目的特点就是状态多,各种大小循环相互嵌套,很难写代码。

但是,由于每一层的代码都是相似的,在调试出某一层之后,其他七层的代码也很好写。

在设计过程中我们遇到了很多问题,而汇编语言本身不是像高级语言一样直观和简洁,刚开始走了不少弯路,但不断调试和查资料之后感觉好多了,程序的编写速度也大大加快了。

实验过程中,我不断翻书,巩固了上课没听懂的知识,加深了对各个芯片的直观的印象,也培养了细心实验的能力。

参考书目:

[1]杨素行等,《微型计算机系统原理及应用》,北京,清华大学出版社,2009年

[2]东南大学微机系统与接口课程组,《微机实验及课程设计教程试用版3.0》,南京,东南大学出版社,2010年

附录.代码程序

datasegment

ioportequ0ec00h-0280h

io8253aequioport+280h;

0计数端口计数为10000,方式3

io8253bequioport+281h;

1计数端口计数为200,方式0

io8253cequioport+283h;

8253控制端

;

shangmianshi8253

io8255aequioport+288h;

8255控制端以及a,b,c端口地址

io8255bequioport+289h

io8255cequioport+28ah

io8255equioport+28bh

prothequioport+290h;

点阵灯显示,行阵

protlrequioport+298h;

点阵灯显示,列阵

numberdb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;

七段码

mindb00h,01h,02h,03h,04h,05h,06h,07h;

点阵的行

buff1db10h,30h,7fh,0ffh,0ffh,7fh,30h,10h;

向上箭头

buff1db10h,20h,40h,0ffh,0ffh,40h,20h,10h

buff2db08h,0ch,0feh,0ffh,0ffh,0feh,0ch,08h;

向下箭头

buff2db08h,04h,02h,0ffh,0ffh,02h,04h,08h

buff3db00h,00h,00h,00h,00h,00h,00h,00h

menudb'

************************************************'

0DH,0AH

db'

*DianTiKongZhiQi---elevator*'

0Dh,0Ah

*61010207JiaXiawen*'

0DH,0AH

*61010317YuHailei*'

0Dh,0Ah

inputanumbertogotothecorrespondinglevel'

esc----------exit'

enter--------go'

z------------godirectly'

x------------quickstop'

c------------waitingforfixing'

0Dh,0Ah

280H----8253CS'

1MHz----8253_clk0'

VCC----8253_gate0'

8253_clk1----8253_out0'

8253_gate1----K0'

8253_out1----8255_PC0'

28bH----8255_cs'

PA0~7----SHUMAGUAN'

PB0~7----led0~7'

MOVE!

'

0Dh,0Ah,'

$'

dataends

stackssegmentstack

db100dup(?

stacksends

codesegment

assumecs:

code,ds:

data,ss:

stacks

start:

movax,data;

初始化

movds,ax

movdx,offsetmenu;

打印菜单,说明硬件电路的连接等

movah,09

int21h

movdx,io8255;

8255初始化,a、b输出,c口输入

moval,89h

outdx,al

movbl,31h;

bl代表当前电梯所在楼层,初始值设为1

main:

moval,0

callshownumber;

显示当前楼层

movcl,0;

cl为第一次输入的要去的楼层

movch,0;

ch为在中途中再次输入的要去的楼层

callshowled

movah,01;

通过键盘输入第一次要去得楼层cl

cmpal,1bh;

是esc则退出

jeexit

cmpal,31h;

键入的数字是否在1-8之间,如不是重新输入

jlmain

cmpal,38h;

跟8比较,如果比8大,则循环输入

jgmain

movcl,al

callshowled;

8个led灯显示cl对应的楼层

cmpcl,bl;

cl与bl比较

jemain;

相等则返回重新输入

jgup;

大于则向上运行

jltodown;

小于则向下运行

exit:

movah,4ch

---------------------------------------------------------------------------------电梯上行

up:

calljudge;

电梯上行的情况

up1:

addbl,1

callupdelay;

调用向上运行延时子程序,出现向上的箭头

调用显示子程序,通过数码管显示当前楼层bl

cmpbl,cl;

bl,cl不等则继续

相等则返回

jmpup1

upgetch:

movah,1;

在上升过程中如果有其他的键按下时

cmpal,78h;

判断是否为急停键x

jejit

cmpal,63h;

判断是否为断电待修键c

jeduandian

数字是否在1-8之间如不是继续上行

jlgotoup

cmpal,38h

jggotoup

movch,al

callshowled

calldelayup

callshownumber

calljudgeequ;

判断当前楼层与第一次要去的楼层是否相同

cmpch,bl;

比较ch与bl的区别

jeloucengxiangdeng;

相等则在该层停,等待运行信号输入

jlxianshanghouxia;

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

cmpch,cl;

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

jexiangdengup;

相等则一直上行至cl

jlsameup;

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

jgtosameup2;

ch大于cl则先上行到cl在上行到ch

gotoup:

calldelayup

jmpup1

duandian:

moval,0;

上升时遇到了断电的情况,则等待键入,除非再次键入的为c才继续运行

movah,7

int21h

cmpal,63h

jneduandian

calldelayup

callshownumber

jmpup1

jit:

calldelayup;

上升时遇到了急停的情况,则停在下一层,然后回到main

jmpmain

todown:

jmpdown

updelayprocnear;

向上运行的延时子程序

calldelayfirst;

用于初始化8253

pushdx

callcleardots;

调用使其能够清零

updelay1:

calldotsup;

循环调用向上的箭头显示

movah,1;

键盘是否有输入

int16h

jneupgetch;

如有则跳转到输入处理

movdx,io8255c;

8255c口输入,看2s延时是否结束

inal,dx

andal,01;

是否计时结束

jzupdelay1

popdx

ret

updelayendp

tomain:

tosameup2:

jmpsameup2

---------------------------------------------------------------------------------上行中遇到的各种情况列举

loucengxiangdeng:

callshownumber;

第二次要去得楼层与当前楼层相同,直接停在该层

movch,0

callstop2

callupcl

jmpmain

xianshanghouxia:

callshowled;

先上行到cl再下行到ch

movcl,0

calldownch

xiangdengup:

movch,0;

二次要去的楼层与第一次要去的相同,直接上行到第一次要取得楼层

callshowled

callupcl

jmpmain

sameup:

同方向的楼层,先上行到ch再上行到cl

callupch

sameup2:

同方向的楼层,先上行到cl再上行到ch;

------------------------

callstop2

callupch

jittt:

jmpjit

----------------------------------------------------------电梯下行,与电梯上行的情况基本类似,稍作修改即可

down:

calljudge

down1:

subbl,1

calldowndelay

cmpbl,cl

jetomain

jmpdown1

downgetch:

movah,1

int21h

cmpal,78h

jejit1

jeduandian1

cmpal,31h

jlgotodown

cmpal,38h

jggotodown

movch,al

calldelaydown

callshownumber

calljudgeequ

cmpch,bl

jestopdowncl

jgdownclupch;

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

cmpch,cl;

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

jejmpdowncl;

相等则一直下行至cl

jldowncldownch;

ch小于bl小于cl则先下行到cl在下行到ch

jgtodownchdowncl;

ch大于cl则先下行到ch在下行到cl

gotodown:

calldelaydown

jmpdown1

duandian1:

下降遇到了断电的情况,则等待键入,除非再次键入的为c才继续运行

jneduandian1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1