微机课程设计电梯仿真程序_第1页
微机课程设计电梯仿真程序_第2页
微机课程设计电梯仿真程序_第3页
微机课程设计电梯仿真程序_第4页
微机课程设计电梯仿真程序_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、二一四二一五学年 第一学期信息科学与工程学院自动化系课程设计报告书姓 名: 学 号: 201204134013 班 级: 自动化1201 课程名称: 微机原理与应用课程设计 指导教师: 程磊 2014年 12月 19日电梯仿真程序1.课程设计目的:在读懂任务书给出的几个子程序的基础上,学习运用计算机动画技术等手段自己独立编制出一个完整的电梯运行计算机仿真程序.通过编制仿真程序的实践,加强同学们对计算机顺序控制的了解与认识,以达到掌握计算机顺序控制规律和计算机顺序控制技术所需的编程技巧以及相关的硬件基础知识的目的。2.设计要求: (1). 在 1- 8楼之间一次可输入多个任意楼层号连续控制电梯按

2、指定楼层号顺序上升与下降.以上过程完成后可重新输入任意楼层号连续控制电梯按指定楼层号顺序上升与下降.只有按esc键才退出程序返回dos状态。例如 : 1-3-5-8-6-4-2-1 (可观察教六楼电梯的实际运行情况). (2). 在 1 - 8 楼之间按任意顺序不连续控制电梯上升与下降. 按一次计算机键盘的上箭头电梯上升一楼,按一次计算机键盘的下箭头电梯下降一楼. (上箭头的ascii码19h , 下箭头的ascii码1ah . ) (3). 在电梯上升与下降过程中,要显示出 1-8 楼之间所要到达的楼层数,同时还要用箭头显示电梯是上升状态还是下降状态. (4). 电梯运行到指定楼层后,打开电

3、梯门,然后关门继续运行. (5). 电梯运行时, 在任意时刻遇到紧急情况时应能实时中断电梯运行.也可以在任意时刻恢复电梯运行.(按a/a 键模拟中断发生,电梯停止运行.按b/b 键恢复电梯运行) (6). 在计算机屏幕上将电梯的平面模型改成三维立体模型. (7). 在电梯旁画一个小方块.这个小方块随电梯上升而上升,下降而下降.以增加电梯运行时的动感. (8). 电梯仿真软件运行时,应在计算机屏幕上详细说明其使用方法,以及本软件作者姓名和日期.3.使用方法和介绍:在提示“input the order(1-8f)(such as 1-2-5-2):”后面输入用户要去的楼层,可从任意楼层开始运行,

4、指定楼层号顺序上升与下降,数字与数字之间用“-”连接,数字范围为1-8。电梯上升与下降过程中,提示“now the floor is:”后面显示出当前所要在的楼层数,提示“to:”后面显示1-8 楼之间所要到达的楼层数,提示“direction :”后面显示上下箭头,代表电梯当前是上升状态还是下降状态。在电梯旁有一个小方块。这个小方块随电梯上升而上升,下降而下降。增加电梯运行时的动感.。小方块在一个8层的方框内上下移动,电梯每上升一层,小方块在方框内上升一层,电梯每下降一层,小方块在方框内下降一层。并且小方块在方框内的位置与电梯当前所在楼层时对应的,例如:若当前电梯运行到第8层,则小方块也位于

5、第八层方框。为了使用户能更清晰地看到电梯的运行过程,小方块每到一层会停留1s的时间。电梯运行到指定楼层后,打开电梯门,然后关门继续运行,为了模拟真实的效果,电梯在指定楼层停下,大门依次闭合-半开门-全开门-半开门-闭合。在 1 - 8 楼之间按任意顺序不连续控制电梯上升与下降。按一次计算机键盘的上箭头电梯上升一楼,按一次计算机键盘的下箭头电梯下降一楼。 由于所使用的计算机的某些原因,这里输入“w” 上升一楼,输入“s” 下降一楼。电梯的不连续控制只在电梯停在某一层且关上的门之后。提示是“up or down only vailable when lift stop(use w or s )”,

6、当用户可以对电梯进行不连续控制时,会出现“now vailable”的提示。电梯仿真软件运行时,在计算机屏幕上显示本软件日期“*data: 2014-12-20*”,作者姓名“author is: xia zhi long ”和学号“xuehao:201204134013”。4.程序的设计思路在主程序的最前面是宏,将具有特定功能的画图代码打包成一个个宏放在住程序的最前面。有清屏的宏,移光标的宏,写横的宏,写竖的宏,画小方块上升的宏,画小方块下降的宏,画初始小方块的宏,画电梯关门状态的宏,画电梯半开门状态的宏,画电梯全开门状态的宏。由于这段画图的代码在程序中会经常使用,所将他们编成宏使用起来更方

7、便。除了主程序外还有一个延时1s的子程序。 开始主程序的运行后,先运行一段初始化程序,然后设置图形显示方式,再显示提示信息以及有关信息,然后再画电梯的三维模型,这样整个初始界面就完成了。然后再提示信息下,用户输入要去的楼层,判断该字符串的第一个字符的ascii码是否在1-8范围,如果不是则结束并返回dos界面,如果是则继续进行下一步程序。将第1个数字代表的楼层设为当前站x(n),并赋给count(该变量用来记录当前层)。将下个数字代表的层数设为下一站(如果当前站为最后一站,则重新回到开头提示用户输入信息),将count与下一站x(n+1)相比较,若count大于下一站,则小方块下降一层,cou

8、nt-,并显示当前层和目标层以及下箭头,一直循环直到相等;若count小于下一站,则小方块上升一层,count+,并显示当前层和目标层以及下箭头,一直循环直到相等;相等时,则电梯大门大门依次闭合-半开门-全开门-半开门-闭合。大门关上后,调用mov ah,1 ; int 16h检测是否有按键按下,若没有键盘按下,则x(n)=x(n+1),读取下一个字符,将该字符所代表的楼层赋给x(n+1),并回到前面检测x(n)是否为最后目标层的程序段。若有键盘按下,则判断al的值(该值为输入的字符的ascii码),若al为w则小方块上升一层,count+;若al为s则小方块下降一层,count-;两者最后都

9、回到“x(n)=x(n+1),读取下一个字符,将该字符所代表的楼层赋给x(n+1)”这一步,若al即不为w也不为s,则直接回到该步骤。以上是整个程序的大致流程和思路。5.程序的流程图 6.程序清单clss macro ; 清屏之宏 mov bh,7 ; 卷入行属性,黑底白字,正常显示. mov ax,0600h ; ah=6 屏幕初始化或上卷.al=0 整个窗口空白. int 10h ; ch=左上角行号,cl=左下角列号. endm ; dh=右上角行号,dl=右下角列号. gb macro ; 移光标之宏 mov bh,00h ; bh=页号 dh,dl=行号,列号. mov ah,02h

10、 ; ah=2 置光标位置. int 10h endm heng macro x1,y1,color,x2 ; 写横的宏 local bh1 ; 定义标号 mov cx,x1 ; 起始点横作标-cx mov dx,y1 ; 起始点纵作标-dx bh1: mov ah,0ch ; 写象素 mov al,color ; 设定颜色参数-al int 10h inc cx cmp cx,x2 ; 写至终点横作标为止 jnz bh1 endm shu macro cx1,cy1,color,cy2 ; 写竖的宏 local bh2 ; 定义标号 mov cx,cx1 mov dx,cy1 bh2: mo

11、v ah,0ch mov al,color ; al=(00-0fh)共16种颜色. int 10h inc dx cmp dx,cy2 jnz bh2 endmup macro n,dx1 ;小方块上升的宏 local upa,upb ; 定义标号 mov al,n ;小方块从n-1层上升至n层 mov ch,30 ;小方块上升一层,并且将下一层的小方块清除 mul ch mov dx,430 sub dx,ax mov dz,dx add dx,20 mov dx1,dxupa: heng 485,dz,04h,515 ;画小方块 inc dz mov ax,dx1 cmp dz,ax j

12、nz upa add dx,11 mov dz,dx add dx,20 mov dx1,dxupb: heng 485,dz,00h,515 ;画小方块 inc dz mov ax,dx1 cmp dz,ax jnz upb endmdown macro n,dx1 ;小方块下降的宏local dna,dnb ; 定义标号 mov al,n ;小方块从n+1层下降至n层 mov ch,30 ;小方块下降一层,并且将上一层的小方块清除 mul ch mov dx,430 sub dx,ax mov dz,dx add dx,20 mov dx1,dxdna: heng 485,dz,04h,5

13、15 ;画小方块 inc dz mov ax,dx1 cmp dz,ax jnz dna sub dx,49 mov dz,dx add dx,20 mov dx1,dxdnb: heng 485,dz,00h,515 ;画小方块 inc dz mov ax,dx1 cmp dz,ax jnz dnb endminit macro n,dx1 ;画初始小方块的宏local beg ; 定义标号 mov al,n ;小方块最初停在第n层,表示电梯最初停第n层 mov ch,30 mul ch mov dx,430 sub dx,ax mov dz,dx add dx,20 mov dx1,dxb

14、eg: heng 485,dz,04h,515 ;画小方块 inc dz mov ax,dx1 cmp dz,ax jnz beg endmclose macro ;画电梯关门状态的宏local cc ; 定义标号 mov dz,220cc: heng 210,dz,09h,370 ;电梯关门 inc dz cmp dz,420 jnz cc shu 291,220,02h,420 ;电梯大门缝隙 shu 290,220,02h,420 shu 289,220,02h,420 endmhalf macro ;画电梯半开门状态的宏local ha ; 定义标号 mov dz,221ha: hen

15、g 210,dz,09h,250 ;电梯半开门 heng 252,dz,07h,328 heng 330,dz,09h,370 inc dz cmp dz,420 jnz ha shu 251,220,02h,420 ;电梯大门缝隙 shu 329,220,02h,420 endmfull macro ;画电梯全开门状态的宏local f ; 定义标号 mov dz,221f: heng 210,dz,09h,215 ;电梯全开门 heng 217,dz,07h,363 heng 365,dz,09h,370 inc dz cmp dz,420 jnz f shu 216,220,02h,42

16、0 ;电梯大门缝隙 shu 364,220,02h,420 endm data segment mess db lift model ,0ah,0dh,$ me1 db press any key to reture dos.,0ah,0dh,$ ;当使用者进行非正常操作时,提示使用者手动返回dos me2 db now the floor is:,0ah,0dh,$ ;提示当前楼层 me3 db direction : ,0ah,0dh,$ me4 db input the order(1-8f)(such as1-2-5-2): $ me5 db author is: xia zhi lo

17、ng ,0ah,0dh,xuehao:201204134013$ ; 输出多个空格键是为了清空上一次的输入 me6 db *data: 2014-12-20*,0ah,0dh,$ me7 db to:,0ah,0dh,$ ;提示电梯下一站要停的楼层 me8 db up or down:,0ah,0dh,$ ;提示使用者用上、下键不连续控制电梯 me9 db only vailable when lift,0ah,0dh,$ me10 db stop(use w or s ),0ah,0dh,$ me11 db now vailable,0ah,0dh,$ me12 db ,0ah,0dh,$

18、ibuff db 0ffh,0,255 dup(0) didas equ 18 dz dw 0 times dw 0,0 num db 0 num1 db 0 count db 0 count1 db 0 dx1 dw 3 dx2 dw 6 data ends stac segment sta dw 100 dup(0) ; 堆栈段 top dw ? stac endscode segmentassume cs:code,ds:data,es:data,ss:datadelay1s proc near ;延时1s的子函数 push dx ;压栈 push cx xor ax,ax int 1a

19、h mov times,dx mov times2,cxread_time:xor ax,ax int 1ah sub dx,times sbb cx,times2 cmp dx,didas jb read_time pop cx ;出栈 pop dx retdelay1s endp start proc far mov ax,data ; 主程序 mov ds,ax mov ax,stac mov ss,ax mov ax,data mov es,ax push ax push bx push cx push dx push si push di mov cx,0 mov dx,2479h

20、mov bh,7 ;黑底白字 mov ax,0601h int 10h mov ax,0012h ; 置图形显示方式 int 10h ; 640列*480行,16色. mov dx,0421h ;显示mess gb mov dx,offset mess ;9号显示调用 mov ah,9 int 21h mov dx,1c32h ;显示me5 gb mov dx,offset me5 mov ah,9 int 21h mov dx,1b32h ;显示me6 gb mov dx,offset me6 mov ah,9 int 21h mov dx,0 gb mov dz,100 sb: heng

21、220,dz,03,420 ;显示栏 inc dz cmp dz,150 jnz sb heng 220,99,0ah,420 ;显示栏边框 heng 220,151,0ah,420 shu 220,99,0ah,151 shu 420,99,0ah,151 close ;电梯大门处于关闭状态 heng 210,220,02h,370 ;电梯大门缝隙边框 heng 210,420,02h,370 shu 210,220,02h,420 shu 370,220,02h,420 heng 209,219,02h,371 ;加粗边框 shu 209,220,02h,420 shu 371,220,0

22、2h,420 mov dz,219 mov dx1,210 mov dx2,370 sb1: heng dx1,dz,03h,dx2 ;三维电梯上侧面 dec dz inc dx1 inc dx2 cmp dz,180 jnz sb1 mov dz,371 mov dx1,220 mov dx2,420 sb2: shu dz,dx1,03h,dx2 ;三维电梯右侧面 inc dz dec dx1 dec dx2 cmp dz,410 jnz sb2 mov dz,420sb3: heng 70,dz,06h,480;画地平线 inc dz cmp dz,425 jnz sb3 mov dz,

23、421sb4: heng 480,dz,04h,520 ;小方块运行在框架内 sub dz,30 cmp dz,151 jnz sb4 shu 480,180,04h,420 shu 520,180,04h,420 mov dx,071dh gb mov dx,offset me2 ;显示me2 mov ah,9 int 21h mov dx,081dh gb mov dx,offset me3 ;显示me3 mov ah,9 int 21h mov dx,082dh gb mov dx,offset me7 ;显示me7 mov ah,9 int 21h sa1s: mov dx,0202h

24、 ;显示me4 gb mov dx,offset me4 mov ah,9 int 21h mov dx,0229h gb mov dx,offset ibuff ;输入并显示字符串 mov ah,10 int 21h mov dx,0402h ;提示使用者用上、下键不连续控制电梯 gb mov dx,offset me8 ;显示me8 mov ah,9 int 21h mov dx,0502h gb mov dx,offset me9 ;显示me9 mov ah,9 int 21h mov dx,0602h gb mov dx,offset me10 ;显示me10 mov ah,9 int

25、 21h sa1: mov al,ibuff+1 mov count,al ;记录输入的字符个数 mov bp,2 mov al,ibuffbp cmp al,30h ;将首字符与1bh(esc ascii码)比较,若相等则返回dos,这里由于汇编软件的原因改为与0的ascii码比较 jz wa1a1 jmp wa1a2 wa1a1: jmp wa1 wa1a2: cmp al,30h ;避免当使用者出入其它键是程序进入死循环 jb wa0a1 jmp wa0a2 wa0a1: jmp wa0 wa0a2: cmp al,38h ja wa0a1 and al,0fh mov num,al i

26、nit num,dx1 mov dx,072fh gb mov dl,num ;显示电梯第一站楼层数 or dl,30h ;将数字转换为字符 mov ah,2 int 21h call delay1s sa1a: add bp,2 mov al,ibuffbp and al,0fh ;将字符转换为数字 mov num1,al mov dx,0830h gb mov dl,ibuffbp ;显示电梯下一站要停的楼层数 mov ah,2 int 21h call delay1s sa1b: mov al,num1 ;下一站要去的楼层和当前所在楼层相比较 cmp al,num ;若下一站楼层大于当前

27、楼层,则小方块上升 ja sa1ca1 ;若下一站楼层小于当前楼层,则小方块下降 jmp sa1ca2 sa1ca1: jmp sa1c sa1ca2: mov al,num1 ;若下一站楼层等于当前楼层,则小方块不动 cmp al,num ;这里有2次比较 jz sa1da1 ;到达所在楼层后停止运动 jmp sa1da2 sa1da1: jmp sa1d sa1da2: dec num down num,dx1 ;电梯下降 mov dx,0829h gb mov dl,19h ;显示下箭头 mov ah,2 int 21h mov dx,072fh gb mov dl,num ;显示当前楼

28、层数 or dl,30h ;将数字转换为字符 mov ah,2 int 21h call delay1s ;小方块在每一层停止1s可让人更直观地看清电梯运行状况 jmp sa1b sa1c: inc num up num,dx1 ;电梯上升 mov dx,0829h gb mov dl,18h ;显示上箭头 mov ah,2 int 21h mov dx,072fh gb mov dl,num ;显示当前楼层数 or dl,30h ;将数字转换为字符 mov ah,2 int 21h call delay1s jmp sa1bsa1d: half ;电梯在指定楼层停下,大门依次从闭合-半开门-

29、全开门-半开门-全开门 call delay1s full call delay1s half call delay1s close call delay1s mov dx,0702h gb mov dx,offset me11 ;显示me11,表明现在可以进行不连续控制 mov ah,9 int 21h xor ax,ax int 1ah mov times,dx mov times2,cxread_time1: clc mov ah,1 ;输入上、下键 int 16h jnz get xor ax,ax int 1ah sub dx,times sbb cx,times2 cmp dx,d

30、idas jb read_time1 jmp show1 get: cmp al,w jz ups1 cmp al,s jz downs1 jmp sa1eups1: inc num up num,dx1 ;电梯上升一层 jmp showdowns1: dec num down num,dx1 ;电梯下降show: mov dx,072fh gb mov dl,num ;显示当前楼层数 or dl,30h ;将数字转换为字符 mov ah,2 int 21h mov ah,0ch int 21h ;清空键盘缓冲区show1: mov dx,0702h gb mov dx,offset me12 ;显示me12,表明现在不可以进行不连续控制 mov ah,9 int 21h sa1e: mov al,count;电梯向下一站运行 cbw cmp bp,ax jb sa1aa1 jmp sa1aa2 sa1aa1: jmp sa1a sa1aa2: jmp sa1s ;电梯重新进行新的一轮的运行w

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论