武汉科技大学微机原理课程设计模拟电梯系统汇编.docx
《武汉科技大学微机原理课程设计模拟电梯系统汇编.docx》由会员分享,可在线阅读,更多相关《武汉科技大学微机原理课程设计模拟电梯系统汇编.docx(27页珍藏版)》请在冰豆网上搜索。
武汉科技大学微机原理课程设计模拟电梯系统汇编
武汉科技大学微机原理课程设计-模拟电梯系统(汇编)
二○一三~二○一四学年第二学期
电子技术学院
电子信息工程系
课程设计报告书
班级:
姓名:
课程名称:
微机原理及应用课程设计
学时学分:
1周1学分
指导老师:
杨君
二○一三年十二月三十一日
一、课程设计目的:
综合运用本课程知识,利用集成电路设计实现一些中小规模电子电路或者完成一定功能的程序,以复习巩固课堂所学的理论知识,提高程序设计实现系统、绘制系统电路图的能力,为实际应用奠定一定的基础。
二、课程设计时间安排:
第一天:
教师布置设计任务,讲解设计要求,提示设计要点。
第二~三天:
查阅资料(在图书馆或上网),提出设计方案。
第三~七天:
画出详细设计图(电路图),编写程序,调试程序,得出实验结果并写出设计报告。
三、课程设计选题:
设计要求:
(1).在1--8楼之间一次可输入多个任意楼层号连续控制电梯按指定楼层号顺序上升与下降.以上过程完成后可重新输入任意楼层号连续控制电梯按指定楼层号顺序上升与下降.只有按ESC键才退出程序返回DOS状态。
例如:
1-3-5-7-6-4-2-1(可观察教十楼电梯的实际运行情况).
(2).在1--7楼之间按任意顺序不连续控制电梯上升与下降.按一次计算机键盘的上箭头电梯上升一楼,按一次计算机键盘的下箭头电梯下降一楼.(上箭头的ASCII码19H,下箭头的ASCII码1AH.)
(3).在电梯上升与下降过程中,要显示出1--7楼之间所要到达的楼层数,同时还要用箭头显示电梯是上升状态还是下降状态.
(4).电梯运行到指定楼层后,打开电梯门,然后关门继续运行.
(5).电梯运行时,在任意时刻遇到紧急情况时应能实时中断电梯运行.也可以在任意时刻恢复电梯运行.(按A/a键模拟中断发生,电梯停止运行.按B/b键恢复电梯运行)
(6).在计算机屏幕上将电梯的平面模型改成三维立体模型.
(7).在电梯旁画一个小方块.这个小方块随电梯上升而上升,下降而下降.以增加电梯运行时的动感.
(8).电梯仿真软件运行时,应在计算机屏幕上详细说明其使用方法,以及本软件作者姓名和日期.
报告要求:
(1).在报告中应对电梯仿真软件的设计思想,设计方法用文字详细说明.
(2).在报告中应有完整的程序清单(必需加注释).
(3).在报告中应有完整的程序框图.
(4).谈谈自己通过这次设计实践的收获和体会.
参考文献:
[1]朱定华,微机原理、汇编与接口技术,清华大学出版社,2005
[2]徐士良,PC机C图形编程手册,清华大学出版社,1994
四、课程设计内容:
1、程序模块:
3、程序设计思路:
电梯模拟程序主要是一个画图程序,程序需要利用一连串的画图指令来实现动画效果。
首先,程序中将用到INT10H的一系列指令来实现画图功能。
要实现动画效果,如电梯门开关、电梯上下移动就必须在生成新的图形同时将老的图形擦去,所以运动的过程分为擦去原有图像和画新图像两部分完成。
当新的图形可以直接覆盖原有效果时则直接画新图形即可,新图形无法覆盖老效果时则首先要用背景颜色将原有图形重绘一次,这样就达到了擦出的效果。
CPU完成一连串画图指令速度是非常迅速的,为了清除观察到动画效果所以添加了一个延时模块,在画图命令中调用此命令可以清晰观察到动画效果。
其次,还需要INT21H的9H号功能实现字符串的显示功能。
由于需要键盘输入电梯控制相关指令,所以需要用到INT16H的1H号功能停止和继续电梯的运动;还需要INT21H的0AH号功能实现输入兵显示字符串;以及INT21H的0CH号功能清空键盘缓存。
在此基础上,用一系列的循环、判断、跳转命令将各种功能结合起来最终搭建成模拟电梯程序。
4、程序代码及注释:
CLEARMACRO;清屏的宏
MOVBH,7;卷入行属性,黑底白字,正常显示.
MOVAX,0600H;AH=6屏幕初始化或上卷.AL=0整个窗口空白.
INT10H;CH=左上角行号,CL=左下角列号.
ENDM;DH=右上角行号,DL=右下角列号.
;---------------------------------------
POSMACRO;移动光标的宏
MOVBH,00H;BH=页号DH,DL=行号,列号.
MOVAH,02H;AH=2置光标位置.
INT10H
ENDM
;---------------------------------------
HENGMACROX1,Y1,COLOR,X2;写横的宏
LOCALBH1;定义标号
MOVCX,X1;起始点横作标-->CX
MOVDX,Y1;起始点纵作标-->DX
BH1:
MOVAH,0CH;写象素
MOVAL,COLOR;设定颜色参数-->AL
INT10H
INCCX
CMPCX,X2;写至终点横作标为止
JNZBH1
ENDM
;---------------------------------------
SHUMACROCX1,CY1,COLOR,CY2;写竖的宏
LOCALBH2;定义标号
MOVCX,CX1
MOVDX,CY1
BH2:
MOVAH,0CH
MOVAL,COLOR;AL=(00--0FH)共16种颜色.
INT10H
INCDX
CMPDX,CY2
JNZBH2
ENDM
;---------------------------------------
DELAYMACRO;延时1s的宏
LOCALREAD
PUSHDX;入栈,保护原有DX、CX中的数据
PUSHCX
SUBAX,AX
INT1AH;INT1AH的0号功能读当前时钟值,CX:
DX=时钟计数值
MOVTIME,DX
MOVTIME[2],CX
READ:
SUBAX,AX
INT1AH
SUBDX,TIME
SBBCX,TIME[2]
CMPDX,DLY
JBREAD
POPCX;出栈,恢复现场
POPDX
ENDM
;---------------------------------------
UPMACRON,DX1;小方块上升的宏
LOCALUPA,UPB;定义标号
MOVAL,N;小方块从N-1层上升至N层
MOVCH,30;小方块上升一层,并且将下一层的小方块清除
MULCH;30*N个像素
MOVDX,430
SUBDX,AX;430-30*N个像素得到画小方块的纵坐标下限值
MOV[DZ],DX
ADDDX,20;每个小方块边长为20个像素
MOVDX1,DX;得到纵坐标上限值
UPA:
HENG170,[DZ],0CH,190;画小方块
INC[DZ]
MOVAX,DX1
CMP[DZ],AX
JNZUPA
ADDDX,11;坐标调整到移动之前的坐标
MOV[DZ],DX
ADDDX,20
MOVDX1,DX
UPB:
HENG170,[DZ],00H,190;擦原小方块
INC[DZ]
MOVAX,DX1
CMP[DZ],AX
JNZUPB
ENDM
;---------------------------------------
DOWNMACRON,DX1;小方块下降的宏
LOCALDOWNA,DOWNB;定义标号
MOVAL,N;小方块从N+1层下降至N层
MOVCH,30;小方块下降一层,并且将上一层的小方块清除
MULCH
MOVDX,430
SUBDX,AX
MOV[DZ],DX
ADDDX,20
MOVDX1,DX
DOWNA:
HENG170,[DZ],0CH,190;画小方块
INC[DZ]
MOVAX,DX1
CMP[DZ],AX
JNZDOWNA
SUBDX,49
MOV[DZ],DX
ADDDX,20
MOVDX1,DX
DOWNB:
HENG170,[DZ],00H,190;擦原有小方块
INC[DZ]
MOVAX,DX1
CMP[DZ],AX
JNZDOWNB
ENDM
;---------------------------------------
CLOSEMACRO;画电梯关门状态的宏
LOCALCE
MOV[DZ],220
CE:
HENG210,[DZ],09H,370;电梯关门
INC[DZ]
CMP[DZ],420
JNZCE
SHU291,220,02H,420;电梯大门缝隙
SHU290,220,02H,420
SHU289,220,02H,420
ENDM
;---------------------------------------
HALFMACRO;画电梯半开门状态的宏
LOCALHF
MOV[DZ],221
HF:
HENG210,[DZ],09H,250;电梯半开门
HENG252,[DZ],07H,328
HENG330,[DZ],09H,370
INC[DZ]
CMP[DZ],420
JNZHF
SHU251,220,02H,420;电梯大门缝隙
SHU329,220,02H,420
ENDM
;---------------------------------------
FULLMACRO;画电梯全开门状态的宏
LOCALFL
MOV[DZ],221
FL:
HENG210,[DZ],09H,215;电梯全开门
HENG217,[DZ],07H,363
HENG365,[DZ],09H,370
INC[DZ]
CMP[DZ],420
JNZFL
SHU216,220,02H,420;电梯大门缝隙
SHU364,220,02H,420
ENDM
;---------------------------------------
PAUSEMACRO;电梯紧急暂停的宏
LOCALWAIT,WAN
SUBAX,AX
MOVAH,1
INT16H
CMPAL,'a';读取键盘缓存中是否有"a",有就进入暂停等待循环,没有则退出
JNZWAN
MOVDX,0301H
POS
MOVDX,OFFSETMSG7;显示MSG7
MOVAH,9
INT21H
MOVAH,0CH;清空键盘缓存
INT21H
WAIT:
CLC;CF=0
MOVAH,1
INT16H
CMPAL,'b';检测键盘缓存中是否有"b",有就退出暂停等待循环,没有则继续循环
JNZWAIT
WAN:
MOVDX,0301H
POS
MOVDX,OFFSETMSG6;用于将MSG7的信息擦除
MOVAH,9
INT21H
MOVAH,0CH
INT21H
ENDM
;---------------------------------------
datasegment
MSG1DB'Pleasepress"1-8"or"w/s"rootherstoterminate.(eg:
1-3-8/w):
$';输出多个空格是为了清空上一次的输入
MSG2DB'Pleasepressanykey.','$'
MSG3DB'Floor:
$'
MSG4DB'Direction:
$'
MSG5DB'To:
$'
MSG6DB'Whentheelevatorrunning,pleasepress"a"toemergencystop.$'
MSG7DB'Pleasepress"b"tocontinue.$'
MSG8DB'WUSTLiGang2014.2.5$'
DATDB0FFH,0,255DUP(0)
DLYEQU18
DZDW0
TIMEDW0,0
NUM1DB1
NUM2DB1
COUNTDB0
DX1DW0
DX2DW0
dataends
;---------------------------------------
stackssegment
STADW100DUP(0)
TOPDW?
stacksends
;---------------------------------------
codesegment
assumecs:
code,ds:
data,ss:
stacks
;---------------------------------------
startprocfar
movax,data
movds,ax
movax,stacks
movss,ax
movax,data
moves,ax
pushax
pushbx
pushcx
pushdx
pushsi
pushdi
MOVCX,0
MOVDX,2479H
MOVBH,7
MOVAX,0601H
INT10H
MOVAX,0012H;置图形显示方式
INT10H;640列*480行,16色.
MOVDX,0;光标位置初始化
POS
HENG220,99,0AH,420;信息栏外边框
HENG220,151,0AH,420
SHU220,99,0AH,151
SHU420,99,0AH,151
HENG223,102,0AH,417;信息栏内边框
HENG223,148,0AH,417
SHU223,102,0AH,148
SHU417,102,0AH,148
CLOSE;电梯大门处于关闭状态
HENG210,220,02H,370;电梯大门缝隙边框
HENG210,420,02H,370
SHU210,220,02H,420
SHU370,220,02H,420
HENG209,219,02H,371;加粗边框
SHU209,220,02H,420
SHU371,220,02H,420
MOV[DZ],219
MOVDX1,210
MOVDX2,370
SB1:
HENGDX1,[DZ],03H,DX2;三维电梯上侧面
DEC[DZ]
INCDX1
INCDX2
CMP[DZ],180
JNZSB1
MOV[DZ],371
MOVDX1,220
MOVDX2,420
SB2:
SHU[DZ],DX1,03H,DX2;三维电梯右侧面
INC[DZ]
DECDX1
DECDX2
CMP[DZ],410
JNZSB2
MOV[DZ],421
SB3:
HENG160,[DZ],0EH,200;画电梯框架
SUB[DZ],30
CMP[DZ],151
JNZSB3
SHU160,181,0EH,422
SHU200,181,0EH,422
MOV[DZ],400
BRICK:
HENG170,[DZ],0CH,190;画初始小方块
INC[DZ]
MOVAX,420
CMP[DZ],AX
JNZBRICK
MOVDX,072BH
POS
MOVDL,NUM1
ADDDL,30H
MOVAH,2
INT21H;初始楼层显示"1"
MOVDX,1C3BH
POS
MOVDX,OFFSETMSG8;显示MSG8
MOVAH,9
INT21H
MOVDX,0723H
POS
MOVDX,OFFSETMSG3;显示MSG3
MOVAH,9
INT21H
MOVDX,081DH
POS
MOVDX,OFFSETMSG4;显示MSG4
MOVAH,9
INT21H
MOVDX,082DH
POS
MOVDX,OFFSETMSG5;显示MSG5
MOVAH,9
INT21H
MOVDX,0301H
POS
MOVDX,OFFSETMSG6;显示MSG6
MOVAH,9
INT21H
INPUT:
MOVDX,0101H
POS
MOVDX,OFFSETMSG1;显示MSG1
MOVAH,9
INT21H
MOVDX,0143H
POS
MOVDX,OFFSETDAT;输入并显示字符串
MOVAH,10
INT21H
MOVAL,DAT+1
MOVCOUNT,AL;记录输入的字符个数
MOVBP,2
MOVAL,DAT[BP]
CMPAL,'w';输入w则上升一层
JEUP1
CMPAL,'s';输入s则下降一层
JEDOWN1
CMPAL,31H;输入小于1的ACSⅡ码则退出
JBOVER
CMPAL,38H;输入大于8的ACSⅡ码则退出
JAOVER
ANDAL,0FH;输入1至8则进入多楼层控制命令循环TARGET1
MOVNUM1,AL
TARGET1:
ADDBP,2;因为输入格式为"1-2-6",每次BP偏移两位起到了仅取有效位数字的作用
MOVAL,DAT[BP]
ANDAL,0FH;将字符转换为数字
CMPAL,1;检测后续输入的字符是否合法,超出1~8范围则返回输入界面
JBINPUT
CMPAL,8
JAINPUT
MOVNUM2,AL
MOVDX,0831H
POS
MOVDL,DAT[BP];显示电梯下一站要停的楼层数
MOVAH,2
INT21H
DELAY
TARGET2:
MOVAL,NUM2
CMPAL,NUM1;若下一站楼层大于当前楼层,则跳至上升命令段
JATARGET3;若下一站楼层小于当前楼层,则在当前命令段
MOVAL,NUM2
CMPAL,NUM1;第二次比较,若到达目标楼层或两站楼层相同则跳至SHOW命令显示开关门动画
JZSHOW
DECNUM1
PAUSE;在画图命令之前插入暂停命令,确保电梯在任何楼层时都能暂停
DOWNNUM1,DX1;电梯下降
MOVDX,0829H
POS
MOVDL,19H;显示下箭头
MOVAH,2
INT21H
MOVDX,072BH
POS
MOVDL,NUM1;显示当前楼层数
ADDDL,30H;将数字转换为ASCⅡ码
MOVAH,2
INT21H
DELAY;电梯在每一层停留1S以便观察
JMPTARGET2
TARGET3:
INCNUM1
PAUSE;在画图命令之前插入暂停命令,确保电梯在任何楼层时都能暂停
UPNUM1,DX1;电梯上升
MOVDX,0829H
POS
MOVDL,18H;显示上箭头
MOVAH,2
INT21H
MOVDX,072BH
POS
MOVDL,NUM1;显示当前楼层数
ADDDL,30H;将数字转换为ASCⅡ码
MOVAH,2
INT21H
DELAY;电梯在每一层停留1S以便观察
JMPTARGET2
UP1:
CMPNUM1,8
JNBINPUT
INCNUM1
MOVDX,0831H
POS
MOVDL,NUM1;显示电梯下一站要停的楼层数
ADDDL,30H
MOVAH,2
INT21H
UPNUM1,DX1;电梯上一层
MOVDX,0829H
POS
MOVDL,18H;显示上箭头
MOVAH,2
INT21H
MOVDX,072BH
POS
MOVDL,NUM1;显示当前楼层数
ADDDL,30H;将数字转换为ASCⅡ码
MOVAH,2
INT21H
JMPSHOW
DOWN1:
CMPNUM1,1
JNAINPUT
DECNUM1
MOVDX,0831H
POS
MOVDL,NUM1;显示电梯下一站要停的楼层数
ADDDL,30H
MOVAH,2
INT21H
DOWNNUM1,DX1;电梯下一层
MOVDX,0829H
POS
MOVDL,19H;显示下箭头
MOVAH,2
INT21H
MOVDX,072BH
POS
MOVDL,NUM1;显示当前楼层数
ADDDL,30H;将数字转换为ASCⅡ码
MOVAH,2
INT21H
SHOW:
MOVDX,0829H
POS
MOVDL,'-';到达楼层时"Direction"显示"-"
MOVAH,2
INT21H
DELAY;电梯门开关每个动作间停留1S以便观察
PAUSE;每个动作后插入PAUSE使电梯能在开关门时暂停
HALF
DELAY
PAUSE
FULL
DELAY
PAUSE
HALF
DELAY
PAUSE
CLOSE
DELAY
PAUSE
SUBAX,AX
INT1AH
MOVTIME,DX
MOVTIME[2],CX
MOVAH,0CH
INT21H;清空键盘缓冲区
MOVAL,COUNT
CBW;将字节扩展为字
CMPBP,AX;若此时没到输入数据最后一位则进入TARGET1,若已到最后一位则进入INPUT开始新一轮运行
JBTARGET1
JMPINPUT
OVER:
MOVDX,101CH;显示MSG2
POS
MOVDX,OFFSE