1、东南大学吴健雄学院微机试验及课程设计课程设计汇报FBI Warning:汇编代码是好几届之前一个学姐,我只是修改了一下.修改后完美运行汇报是我自己写转载不需要注明出处,就说是你写姓 名: 学 号: 专 业: 吴健雄学院 实 验 室: 计算机硬件试验室 组 别: 同组人员: 设计时间: 年 5 月 17 日 年 6 月 6日评定成绩: 审阅老师: 目 录一课程设计目标和要求2二方案论证和原理设计3三具体(机理)设计3四方案实现和测试(或调试)6五分析和总结7一. 课程设计目标和要求设计目标:微机课程综合设计用于检验和提升学生在原理和接口综合应用方面分析问题和处理问题能力,同时也给学生提供更多、愈
2、加好训练机会,课程给出了10 道微机硬件应用综合测试题。为完成每道测试题,最少需要选择TPC 微机试验装置中三部分以上硬件电路(还需将它们有机组合起来)并编制对应应用。经过试验还能够让学生愈加好了解所学知识在实际控制中利用,增加对本专业认识和学习爱好。设计要求:1)设计基础要求用键盘、按钮、八段码和LED 模拟电梯工作过程。楼层设为8 层,键盘数字键18 用来键入期望停楼层,8 个LED 显示期望停楼层,2 位八段码指示电梯目前所在楼层,按钮用来启、停电梯。电梯正常运行时以每2 秒层速度上升或下降。要求“电梯”能按以下方法运行:(1)设目前电梯停在某层(2 位八段码显示对应楼层,8 个LED
3、全灭)。键入18 数字键,如键入数字和目前电梯停层同,则什么亦不动作,若不一样则对应楼层LED 亮;如再按运行键,则电梯自动判别上升或下降(在运行过程中八段码显示楼层改变)一直抵达期望停楼层(八段码显示该楼层,对应LED 灭);(2)设目前电梯正在上升或下降运行(此时八段码显示楼层改变,LED 指示期望抵达楼层),若键入新期望停楼层数字(对应LED 亮),则对同方向(上升或下降)未到楼层能停,对其它情况则先停原期望停楼层,然后按运行键后继续运行)。以下几例: 设电梯目前在2 层,向上运行,LED 指示期望在6 层停,此时若键入4,则电梯将在4 楼停,若再按运行键,则继续运行至6 层停; 同上情
4、况,若键入不是4 而是8,则电梯将先停在6 层,再按运行键,运行至8 层停; 同上情况,若键入不是4(或8),而是1,则电梯先停在6 层,再按运行键,运行至层停。2)深入设计要求除运行按钮外,再设计多个按钮,模拟更多电梯运行功效,如: 同时在8*8 点阵显示器显示上升和下降箭头,当停止时显示目前所在楼层号. 直达按钮。若按此按钮,电梯按直达方法运行,即对运行期间新键入停靠楼层(即使是同方向未到楼层)亦不停,直达终点楼层; 急停按钮。电梯运行中,若按此按钮,则电梯立即停在下一抵达楼层; 断电待修按钮。按下该钮电梯不能工作,再按一下才能重新工作;设置急停开关(K0-K7 至一),引入中止处理,立即
5、响应,就近停靠;分工情况:我跟XXX一组,我关键负责程序框架构建和大部分代码编写,XXX负责其它程序编写和硬件连接等工作。二.方案论证和原理设计我们在成熟考虑程序整体要求和框架后,决定把程序总共分为四个模块,分别为电梯运行模块,电梯接收请求判定模块,显示模块,计时模块。电梯运行模块是整个程序主模块,其关键功效就是判定电梯运行方向和停靠所要去楼层优先次序。电梯接收请求判定模块关键是应急停,直达,等候维修等命令。计时模块用于对系统每二秒停一楼层计数。显示模块则包含所要到楼层显示和运行过程中所到楼层实时显示。有8个楼层,需要用8个按键模拟电梯中请求按钮; 当电梯静止状态时,不管外部哪一层有请求,电梯
6、全部由静止状态转入向上或向下运行状态,直到抵达请求楼层;当电梯处于向上运行状态时,此时高于该楼层向上请求和内部请求等级最高,其次是全部楼层向下请求,再次是低于该楼层向上请求;当电梯处于向下运行状态时则情况相反;因为中止等级在伴随电梯所处楼层不一样而改变,而且中止源比较多。所以用每一个中止源直接和中止控制器相连,需要用到多个8259A级联,很不方便。为处理这个问题,首先定义三个单字节变量REQ_U、REQ_D和REQ_IN分别存放电梯每一层向上、向下和内部请求,每一位代表一层。比如,REQ_U为 00000110B,这代表在2层和3层有向上请求。8253定时器每隔20ms产生一次中止,中止程序便
7、去实施扫描键盘,当扫描到有电梯内部或外部按键时,将请求存放到变量中。每到一个状态时再检验请求变量REQ_U、REQ_D和REQ_IN值,依据电梯运行方向和变量中请求,来决定电梯下一步运行。设电梯目前楼层为floor(floor=18),运行方向为dir(dir=0,向上;dir=1,向下),在电梯运行工程中,用数码管输出floor值显示目前楼层。LED输出REQ_IN值显示电梯内已经请求楼层。关键模块以下:1可编程定时/计数器8253定时/计数器8253关键是用于定时20ms,触发中止进行键盘扫描。电路连线是CLOCK0接Q6,分频后频率为46875Hz,OUT0接中止IRQ2,每20ms中止
8、一次,GATE0接5v。计数器初值应该是3A9H;28255并行接口单元8255关键是用于数码管和发光二极管数据输出。所以用8255B口8接8个发光二极管,A口接数码管数据端。3 LED点阵显示因为提升要求需要显示上下箭头,所以使用8*8点阵显示箭头。4 微机控制器程序在微机上运行,经过总线控制试验箱上各部件运行。三.具体(机理)设计1) 软件步骤图(总步骤图)本设计软件设计思绪:经过软件编程使8253输出定时信号申请中止,在中止服务程序中扫描键盘,假如有按键,修改对应变量位,并输出内部请求变量REQ_IN到发光二极管显示目前内部请求楼层。在主程序中,查询变量值,依据电梯调度算法运行电梯。图表
9、 1 电梯系统总步骤图2) 电梯控制算法模块逻辑实现:当电梯向上运行时: a) 在目前层以下向上请求全部被忽略留到下次向上运行时处理。 b) 在目前层以上向上请求全部被统计留到此次运行处理。 c) 不管哪层向下请求全部被忽略留到下次向下运行时处理。 当电梯向下运行时: a) 在目前层以上向下请求全部被忽略留到下次向下运行时处理。 b) 在目前层以下向下请求全部被统计留到此次运行处理。 c) 不管哪层向上请求全部被忽略留到下次向上运行时处理。算法实现:dir代表电梯运行方向,0代表电梯向上运行,1代表向下运动。设REQ_U(n)代表第n层向上请求,一样,REQ_D(n) 代表第n层向下请求,RE
10、Q_IN(n) 代表第n层内部请求。求next方法为:电梯向上时,next为内部请求最小值和向上请求大于floor最小值之间小者。电梯向下时,next为内部请求最大值和向下请求中小于floor最大值之间大者。没有满足要求时返回0。图表 2 电梯控制算法步骤图3) LED显示程序:本设计只用到了一个LED,只要将floor转换为对应段码。先输出位码,再输出段码,循环输出就能够动态显示。为了循环显示,将LED显示程序放在中止服务程序中。(将“楼层”作偏移码,利用XLAT,很简单就能够实现译码)图表 3 电梯按键、显示中止步骤图 VCC4) 硬件连接图280H28bH1MHz/CS PA0-7 PB
11、0-7PC08255/CS CLK0 GATE0 OUT0 CLK1 GATE1 OUT18253八段码数码管 LED小灯急停开关四. 方案实现和测试(或调试)首先依据设计思绪,选择采取8253和8255芯片,规避了使用较为复杂中止。然后调试硬件,确定位选、芯片等工作正常。这能够经过手动输入控制字,进行简单输入输出实现。然后确定8253、8255芯片地址,开始软件编程。软件编程首先完成整体逻辑框架,然后具体编写子程序。刚开始时采取软件延时,优先调试8255。采取8255A、B口0方法,A、B口改变将反应在八段码和LED灯上。子程序编写立即设计好算法转换为程序流,用程序流方向实现选择,用调用子程
12、序实现具体操作。 然后加入8253硬件延时,将OUT1连至PC0,经过不停查询PC0口状态进行延时。因为前面8255已经调好,所以8253调试比较顺利。 最终将全部硬件连线接好,进行整机联调。当中发觉很多问题,首先利用示波器排除硬件故障,再回过头来对软件进行单步,这时因为有现象,进行软件调试时候也更有针对性。经过设置断点,逐步跟踪寄存器值,经过几次修改以后,成功实现了预定方案。 因为数码管和LED灯显示全部是采取查表法,依据输入字符ASCII码查表得到输出,有时出现LED不正常亮灭现象,是在查表时犯错,比如没有减去31H,就会使灯显示杂乱无章。实物连接图:五分析和总结1)设计要求每次电梯开关时
13、间为2秒,而一开始我们无法确保正确时间。以后经过讨论后发觉能够用8253计数器达成此功效,我们翻阅书籍后分别用方法3和方法0实现了正确2秒要求。2) 编程中碰到大多是逻辑问题.另一个常常碰到问题就是跳转语句超出范围错误,这个错误处理是经过改变语句次序,如实在无法经过改变次序来消除错误,则经过二次跳转,即跳过中间过程再跳至目标。3) 我们写电梯程序,d意义为目前楼层,当输入要去楼层bl时,判定bl和cl大小关系,假设blcl,则程序先把cl加,再延时两秒,再比较bl和cl大小是否相等,假如相等则跳出,不等则把cl加,再延时,再判定。4) 当在上行过程中再输入另一个想去楼层ch时,则跳转至 ch处
14、理过程。因为是在延时前就把cl加1了,所以在这上行两秒内,cl已经上了一层了。所以就必需判定ch和bl是否和此时cl相等,如相等则在立即抵达这一层停。因为一开始我们来判定bl和cl是否相等,造成假如在立即到bl层时候按下ch则会使cl不停增大,即ASCII 码不停增大,又返回至0,又增大至bl 才停止。5) 另外一个问题就是8个LED显示要去哪个楼层问题。我们是用数据DD0DD7接到74LS273输出。bl,ch同时要被显示。我们于是就把bl,ch0,1,2,3,.8分别对应于0B,1B,10B,10000000B,然后把二者相加就能显示了。假如抵达bl则把bl赋为0,则对应灯灭。假如抵达ch
15、,则把ch赋为0,则ch对应楼层灯灭。现在假如输入ch等于bl,按要求是对应灯亮,到该层停,而实际上变成上一层灯亮,因为ch和bl对应二进制相加,产生进位。处理方法是,假如bl,ch相等,则先把cl 复位为0,然后再调用LED显示。6)电梯这个题目标特点就是状态多,多种大小循环相互嵌套,极难写代码。不过,因为每一层代码全部是相同,在调试出某一层以后,其它七层代码也很好写。在设计过程中我们碰到了很多问题,而汇编语言本身不是像高级语言一样直观和简练,刚开始走了不少弯路,但不停调试和查资料以后感觉好多了,程序编写速度也大大加紧了。试验过程中,我不停翻书,巩固了上课没听懂知识,加深了对各个芯片直观印象
16、,也培养了细心试验能力。参考书目:1 杨素行等,微型计算机系统原理及应用,北京,清华大学出版社,2 东南大学微机系统和接口课程组,微机试验及课程设计教程试用版3.0,南京,东南大学出版社,附录代码程序data segment ioport equ 0ec00h-0280h io8253a equ ioport+280h;0计数端口计数为10000,方法3 io8253b equ ioport+281h;1计数端口计数为200,方法0io8253c equ ioport+283h;8253控制端 ;shangmian shi 8253io8255aequ ioport+288h;8255控制端和
17、a,b,c端口地址 io8255b equ ioport+289hio8255cequ ioport+28ah io8255 equ ioport+28bh prothequ ioport+290h;点阵灯显示,行阵protlrequ ioport+298h;点阵灯显示,列阵number db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;七段码 min db 00h,01h,02h,03h,04h,05h,06h,07h;点阵行;buff1 db 10h,30h,7fh,0ffh,0ffh,7fh,30h,10h;向上箭头buff1db 10h,20h,40
18、h,0ffh,0ffh,40h,20h,10h;buff2 db 08h,0ch,0feh,0ffh,0ffh,0feh,0ch,08h;向下箭头buff2 db 08h,04h,02h,0ffh,0ffh,02h,04h,08hbuff3db 00h,00h,00h,00h,00h,00h,00h,00hmenu db *,0DH,0AH db * DianTiKongZhiQi-elevator *,0Dh,0Ah db * 61010207 Jia Xiawen *,0DH,0AHdb * 61010317 Yu Hailei *,0Dh,0Ah db *,0Dh,0Ah db inpu
19、t a number to go to the corresponding level,0DH,0AH db esc-exit,0DH,0AH db enter-go,0DH,0AHdb z-go directly,0Dh,0Ah db x-quickstop,0Dh,0Ah db c-waiting for fixing,0Dh,0Ahdb 280H-8253CS,0Dh,0Ahdb 1MHz-8253_clk0,0Dh,0Ahdb VCC-8253_gate0,0Dh,0Ahdb 8253_clk1-8253_out0,0Dh,0Ahdb 8253_gate1-K0,0Dh,0Ahdb 8
20、253_out1-8255_PC0,0Dh,0Ahdb 28bH-8255_cs,0Dh,0Ahdb PA07-SHU MA GUAN,0Dh,0Ahdb PB07-led07,0Dh,0Ah db MOVE!,0Dh,0Ah ,$ data endsstacks segment stack db 100 dup (?)stacks endscode segment assume cs:code,ds:data,ss:stacksstart: mov ax,data;初始化 mov ds,ax mov dx,offset menu;打印菜单,说明硬件电路连接等 mov ah,09 int 21
21、h mov dx,io8255;8255初始化,a、b输出,c口输入 mov al,89h out dx,al mov bl,31h;bl代表目前电梯所在楼层,初始值设为1 main: mov al,0 call shownumber;显示目前楼层 mov cl,0;cl为第一次输入要去楼层 mov ch,0;ch为在中途中再次输入要去楼层 call showled mov ah,01;经过键盘输入第一次要去得楼层cl int 21h cmp al,1bh;是esc则退出 je exit cmp al,31h;键入数字是否在1-8之间,如不是重新输入 jl main cmp al,38h;跟8
22、比较,假如比8大,则循环输入 jg main mov cl,al call showled;8个led灯显示cl对应楼层 cmp cl,bl;cl和bl比较 je main;相等则返回重新输入 jg up;大于则向上运行 jl todown;小于则向下运行exit: mov ah,4ch int 21h ;-电梯上行up: call judge;电梯上行情况up1: add bl,1 call updelay;调用向上运行延时子程序,出现向上箭头 call shownumber;调用显示子程序,经过数码管显示目前楼层bl cmp bl,cl;bl,cl不等则继续 je main;相等则返回 j
23、mp up1 upgetch:mov ah,1;在上升过程中假如有其它键按下时 int 21h cmp al,78h;判定是否为急停键xje jitcmp al,63h;判定是否为断电待修键cje duandian cmp al,31h;数字是否在1-8之间如不是继续上行 jl gotoup cmp al,38h jg gotoup mov ch,al call showled call delayup call shownumber call judgeequ;判定目前楼层和第一次要去楼层是否相同 cmp ch,bl;比较ch和bl区分 je loucengxiangdeng;相等则在该层停
24、,等候运行信号输入 jl xianshanghouxia;ch小于bl则先上行至cl在下行至ch cmp ch,cl;ch大于bl则在判定ch和cl大小关系 je xiangdengup;相等则一直上行至cl jl sameup;ch大于bl小于cl则先上行到ch在上行到cl jg tosameup2;ch大于cl则先上行到cl在上行到ch gotoup:call delayup jmp up1 duandian:mov al,0;上升时碰到了断电情况,则等候键入,除非再次键入为c才继续运行mov ah,7int 21hcmp al,63hjne duandiancall delayupcal
25、l shownumberjmp up1jit:call delayup;上升时碰到了急停情况,则停在下一层,然后回到maincall shownumberjmp maintodown: jmp downupdelay proc near;向上运行延时子程序 call delayfirst;用于初始化8253 push dx call cleardots ;调用使其能够清零updelay1:call dotsup;循环调用向上箭头显示mov ah,1;键盘是否有输入 int 16h jne upgetch;如有则跳转到输入处理 mov dx,io8255c;8255c口输入,看2s延时是否结束
26、in al,dx and al,01;是否计时结束 jz updelay1 pop dx ret updelay endptomain: jmp maintosameup2:jmp sameup2;-上行中碰到多种情况列举loucengxiangdeng:call shownumber;第二次要去得楼层和目前楼层相同,直接停在该层 mov ch,0 call showled call stop2 call upcl jmp main xianshanghouxia:call showled;先上行到cl再下行到ch call upcl mov cl,0 call showled call st
27、op2 call downch jmp main xiangdengup:mov ch,0;二次要去楼层和第一次要去相同,直接上行到第一次要取得楼层 call showled call upcl jmp main sameup:call showled;同方向楼层,先上行到ch再上行到cl call upch mov ch,0 call showled call stop2 call upcl jmp main sameup2:call showled;同方向楼层,先上行到cl再上行到ch ;- call upcl mov cl,0 call showled call stop2 call u
28、pch jmp main jittt: jmp jit;-电梯下行,和电梯上行情况基础类似,稍作修改即可down: call judgedown1: sub bl,1 call downdelay call shownumber cmp bl,cl je tomain jmp down1 downgetch:mov ah,1 int 21hcmp al,78hje jit1cmp al,63hje duandian1 cmp al,31h jl gotodown cmp al,38h jg gotodown mov ch,al call showled call delaydown call
29、shownumber call judgeequ cmp ch,bl je stopdowncl jg downclupch;ch大于bl则先下行至cl在上行至ch cmp ch,cl;ch小于bl则在判定ch和cl大小关系 je jmpdowncl;相等则一直下行至cl jl downcldownch;ch小于bl小于cl则先下行到cl在下行到ch jg todownchdowncl;ch大于cl则先下行到ch在下行到cl gotodown:call delaydown jmp down1 duandian1:mov al,0;下降碰到了断电情况,则等候键入,除非再次键入为c才继续运行mov
30、 ah,7int 21hcmp al,63hjne duandian1call delaydowncall shownumberjmp down1jit1:call delaydown;下降时碰到了急停情况,则停在下一层,然后回到maincall shownumberjmp maindowndelay proc near;向下运行延时子程序,和向上运行延时子程序大致相同 call delayfirst push dx call cleardots;调用使其能够清零ddy: call dotsdown;循环调用向下箭头显示mov ah,1 int 16h jne downgetch mov dx
31、,io8255c in al,dx and al,01 jz ddy pop dx ret downdelay endptodownchdowncl:jmp downchdowncl;-下行中碰到多种情况列举stopdowncl:call showled mov ch,0 call showled call stop2 call downcl jmp main downclupch:call showled call downcl mov cl,0 call showled call stop2 call upch jmp main jmpdowncl:mov ch,0 call showle
32、d call downcl jmp main downcldownch:call showled call downcl mov cl,0 call showled call stop2 call downch jmp main downchdowncl:call showled call downch mov ch,0 call showled call stop2 call downcl jmp main ;-电梯上、下行中碰到多种情况处理方法jitt: jmp jitttjudgeequ proc near ;判定目前楼层和第一次要去楼层关系 cmp cl,bl jne back cmp
33、 cl,ch je clequch mov cl,0 call shownumber call showled call stop2 cmp ch,bl jg upchhere jl downchhere upchhere:call upch jmp main downchhere:call downch jmp main clequch:mov ch,0 call showled call onlydelay; jmp main back: ret judgeequ endp upcl proc near;上行到cl子程序upcl1: inc bl call dirdelay1 call s
34、hownumber cmp bl,cl jl upcl1 ret upcl endpjitt1: jmp jit1upch proc near;上行到ch子程序 upch1: add bl,1 call dirdelay1 call shownumber cmp bl,ch jl upch1 ret upch endp downcl proc near;下行到cl子程序 downcl1:sub bl,1 call dirdelay2 call shownumber cmp bl,cl jg downcl1 ret downcl endp downch proc near;下行到ch子程序 do
35、wnch1:sub bl,1 call dirdelay2 call shownumber cmp bl,ch jg downch1 ret downch endp ;-直接上下行时对按键情况处理stop2 proc near;没有直达键暂停子程序 gostop2:mov al,0 mov ah,1 int 21h cmp al,13 jne gostop2 mov al,0 ret stop2 endpdirgetch1:mov ah,1;直接上行对按键处理 int 21h cmp al,63hje dirduandian1cmp al,78hje jit21jmp dirback1dirg
36、etch2:mov ah,1;直接下行对按键处理 int 21h cmp al,63hje dirduandian2cmp al,78hje jit22jmp dirback2jit21:call delayup;call shownumberjmp mainjit22:call delaydown;call shownumberjmp maindirduandian1:mov al,0;直接上行时碰到了断电待修情况mov ah,1int 21hcmp al,63hjne dirduandian1call delayup;call shownumber jmp dirback1dirduandian2:mov al,0;直接下行时碰到了断电待修情况mov ah,1int 21hcmp al,63hjne dirduandian2call delaydown;call shownumber jmp dirback2 tojit: jmp jitt dirdelay1 proc near;直接上行延时子程序 call delayfirst