二○一三~二○一四学年第二学期电子技术学院电子信息工程系课程设计报告书班级:姓名:课程名称:微机原理及应用课程设计学时学分: 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、程序模块:2、程序流程图:3、程序设计思路:电梯模拟程序主要是一个画图程序,程序需要利用一连串的画图指令来实现动画效果。
首先,程序中将用到INT 10H的一系列指令来实现画图功能。
要实现动画效果,如电梯门开关、电梯上下移动就必须在生成新的图形同时将老的图形擦去,所以运动的过程分为擦去原有图像和画新图像两部分完成。
当新的图形可以直接覆盖原有效果时则直接画新图形即可,新图形无法覆盖老效果时则首先要用背景颜色将原有图形重绘一次,这样就达到了擦出的效果。
CPU完成一连串画图指令速度是非常迅速的,为了清除观察到动画效果所以添加了一个延时模块,在画图命令中调用此命令可以清晰观察到动画效果。
其次,还需要INT 21H 的9H号功能实现字符串的显示功能。
由于需要键盘输入电梯控制相关指令,所以需要用到INT 16H的1H号功能停止和继续电梯的运动;还需要INT 21H的0AH号功能实现输入兵显示字符串;以及INT 21H的0CH号功能清空键盘缓存。
在此基础上,用一系列的循环、判断、跳转命令将各种功能结合起来最终搭建成模拟电梯程序。
4、程序代码及注释:CLEAR MACRO ; 清屏的宏MOV BH,7 ; 卷入行属性,黑底白字,正常显示.MOV AX,0600H ; AH=6 屏幕初始化或上卷.AL=0 整个窗口空白. INT 10H ; CH=左上角行号,CL=左下角列号.ENDM ; DH=右上角行号,DL=右下角列号.;---------------------------------------POS MACRO ; 移动光标的宏MOV BH,00H ; BH=页号 DH,DL=行号,列号.MOV AH,02H ; AH=2 置光标位置.INT 10HENDM;---------------------------------------HENG MACRO X1,Y1,COLOR,X2 ; 写横的宏LOCAL BH1 ; 定义标号MOV CX,X1 ; 起始点横作标-->CXMOV DX,Y1 ; 起始点纵作标-->DXBH1: MOV AH,0CH ; 写象素MOV AL,COLOR ; 设定颜色参数-->ALINT 10HINC CXCMP CX,X2 ; 写至终点横作标为止JNZ BH1ENDM;---------------------------------------SHU MACRO CX1,CY1,COLOR,CY2 ; 写竖的宏LOCAL BH2 ; 定义标号MOV CX,CX1MOV DX,CY1BH2: MOV AH,0CHMOV AL,COLOR ; AL=(00--0FH)共16种颜色.INT 10HINC DXCMP DX,CY2JNZ BH2ENDM;---------------------------------------DELAY MACRO ;延时1s的宏LOCAL READPUSH DX ;入栈,保护原有DX、CX中的数据PUSH CXSUB AX,AXINT 1AH ;INT 1AH的0号功能读当前时钟值,CX:DX=时钟计数值MOV TIME,DXMOV TIME[2],CXREAD: SUB AX,AXINT 1AHSUB DX,TIMESBB CX,TIME[2]CMP DX,DLYJB READPOP CX ;出栈,恢复现场POP DXENDM;---------------------------------------UP MACRO N,DX1 ;小方块上升的宏LOCAL UPA,UPB ; 定义标号MOV AL,N ;小方块从N-1层上升至N层MOV CH,30 ;小方块上升一层,并且将下一层的小方块清除 MUL CH ;30*N个像素MOV DX,430SUB DX,AX ;430-30*N个像素得到画小方块的纵坐标下限值 MOV [DZ],DXADD DX,20 ;每个小方块边长为20个像素MOV DX1,DX ;得到纵坐标上限值UPA: HENG 170,[DZ],0CH,190 ;画小方块INC [DZ]MOV AX,DX1CMP [DZ],AXJNZ UPAADD DX,11 ;坐标调整到移动之前的坐标MOV [DZ],DXADD DX,20MOV DX1,DXUPB: HENG 170,[DZ],00H,190 ;擦原小方块INC [DZ]MOV AX,DX1CMP [DZ],AXJNZ UPBENDM;---------------------------------------DOWN MACRO N,DX1 ;小方块下降的宏LOCAL DOWNA,DOWNB ; 定义标号MOV AL,N ;小方块从N+1层下降至N层MOV CH,30 ;小方块下降一层,并且将上一层的小方块清除 MUL CHMOV DX,430SUB DX,AXMOV [DZ],DXADD DX,20MOV DX1,DXDOWNA: HENG 170,[DZ],0CH,190 ;画小方块INC [DZ]MOV AX,DX1CMP [DZ],AXJNZ DOWNASUB DX,49MOV [DZ],DXADD DX,20MOV DX1,DXDOWNB: HENG 170,[DZ],00H,190 ;擦原有小方块INC [DZ]MOV AX,DX1CMP [DZ],AXJNZ DOWNBENDM;---------------------------------------CLOSE MACRO ;画电梯关门状态的宏LOCAL CEMOV [DZ],220CE: HENG 210,[DZ],09H,370 ;电梯关门INC [DZ]CMP [DZ],420JNZ CESHU 291,220,02H,420 ;电梯大门缝隙 SHU 290,220,02H,420SHU 289,220,02H,420ENDM;---------------------------------------HALF MACRO ;画电梯半开门状态的宏LOCAL HFMOV [DZ],221HF: HENG 210,[DZ],09H,250 ;电梯半开门 HENG 252,[DZ],07H,328HENG 330,[DZ],09H,370INC [DZ]CMP [DZ],420JNZ HFSHU 251,220,02H,420 ;电梯大门缝隙 SHU 329,220,02H,420ENDM;---------------------------------------FULL MACRO ;画电梯全开门状态的宏LOCAL FLMOV [DZ],221FL: HENG 210,[DZ],09H,215 ;电梯全开门 HENG 217,[DZ],07H,363HENG 365,[DZ],09H,370INC [DZ]CMP [DZ],420JNZ FLSHU 216,220,02H,420 ;电梯大门缝隙 SHU 364,220,02H,420ENDM;---------------------------------------PAUSE MACRO ;电梯紧急暂停的宏LOCAL WAIT,WANSUB AX,AXMOV AH,1CMP AL,'a' ;读取键盘缓存中是否有"a",有就进入暂停等待循环,没有则退出JNZ WANMOV DX,0301HPOSMOV DX,OFFSET MSG7 ;显示MSG7MOV AH,9INT 21HMOV AH,0CH ;清空键盘缓存INT 21HWAIT: CLC ;CF=0MOV AH,1INT 16HCMP AL,'b' ;检测键盘缓存中是否有"b",有就退出暂停等待循环,没有则继续循环JNZ WAITWAN: MOV DX,0301HPOSMOV DX,OFFSET MSG6 ;用于将MSG7的信息擦除MOV AH,9INT 21HMOV AH,0CHINT 21HENDM;---------------------------------------data segmentMSG1 DB 'Please press "1-8" or "w/s" ro others to terminate.(eg: 1-3-8/w): $' ; 输出多个空格是为了清空上一次的输入MSG2 DB 'Please press any key.','$'MSG3 DB 'Floor: $'MSG4 DB 'Direction: $'MSG5 DB 'To: $'MSG6 DB 'When the elevator running, please press "a" to emergency stop. $'MSG7 DB 'Please press "b" to continue. $'MSG8 DB 'WUST LiGang 2014.2.5 $'DAT DB 0FFH,0,255 DUP(0)DLY EQU 18DZ DW 0TIME DW 0,0NUM1 DB 1NUM2 DB 1COUNT DB 0DX2 DW 0data ends;---------------------------------------stacks segmentSTA DW 100 DUP(0)TOP DW ?stacks ends;---------------------------------------code segmentassume cs:code,ds:data,ss:stacks;---------------------------------------start proc farmov ax,datamov ds,axmov ax,stacksmov ss,axmov ax,datamov es,axpush axpush bxpush cxpush dxpush sipush diMOV CX,0MOV DX,2479HMOV BH,7MOV AX,0601HINT 10HMOV AX,0012H ;置图形显示方式INT 10H ;640列*480行,16色.MOV DX,0 ;光标位置初始化POSHENG 220,99,0AH,420 ;信息栏外边框 HENG 220,151,0AH,420SHU 220,99,0AH,151SHU 420,99,0AH,151HENG 223,102,0AH,417 ;信息栏内边框 HENG 223,148,0AH,417SHU 223,102,0AH,148SHU 417,102,0AH,148CLOSE ;电梯大门处于关闭状态HENG 210,220,02H,370 ;电梯大门缝隙边框 HENG 210,420,02H,370SHU 210,220,02H,420SHU 370,220,02H,420HENG 209,219,02H,371 ;加粗边框SHU 209,220,02H,420SHU 371,220,02H,420MOV [DZ],219MOV DX1,210MOV DX2,370SB1: HENG DX1,[DZ],03H,DX2 ;三维电梯上侧面 DEC [DZ]INC DX1INC DX2CMP [DZ],180JNZ SB1MOV [DZ],371MOV DX1,220MOV DX2,420SB2: SHU [DZ],DX1,03H,DX2 ;三维电梯右侧面 INC [DZ]DEC DX1DEC DX2CMP [DZ],410JNZ SB2MOV [DZ],421SB3: HENG 160,[DZ],0EH,200 ;画电梯框架SUB [DZ],30CMP [DZ],151JNZ SB3SHU 160,181,0EH,422SHU 200,181,0EH,422MOV [DZ],400BRICK: HENG 170,[DZ],0CH,190 ;画初始小方块INC [DZ]MOV AX,420CMP [DZ],AXJNZ BRICKMOV DX,072BHPOSMOV DL,NUM1ADD DL,30HMOV AH,2INT 21H ;初始楼层显示"1"MOV DX,1C3BHPOSMOV DX,OFFSET MSG8 ;显示MSG8MOV AH,9INT 21HMOV DX,0723HPOSMOV DX,OFFSET MSG3 ;显示MSG3MOV AH,9INT 21HMOV DX,081DHPOSMOV DX,OFFSET MSG4 ;显示MSG4MOV AH,9INT 21HMOV DX,082DHPOSMOV DX,OFFSET MSG5 ;显示MSG5MOV AH,9INT 21HMOV DX,0301HPOSMOV DX,OFFSET MSG6 ;显示MSG6MOV AH,9INT 21HINPUT: MOV DX,0101HPOSMOV DX,OFFSET MSG1 ;显示MSG1MOV AH,9INT 21HMOV DX,0143HPOSMOV DX,OFFSET DAT ;输入并显示字符串MOV AH,10INT 21HMOV AL,DAT+1MOV COUNT,AL ;记录输入的字符个数MOV BP,2MOV AL,DAT[BP]CMP AL,'w' ;输入w则上升一层JE UP1CMP AL,'s' ;输入s则下降一层JE DOWN1CMP AL,31H ;输入小于1的ACSⅡ码则退出JB OVERCMP AL,38H ;输入大于8的ACSⅡ码则退出JA OVERAND AL,0FH ;输入1至8则进入多楼层控制命令循环TARGET1 MOV NUM1,ALTARGET1: ADD BP,2 ;因为输入格式为"1-2-6",每次BP偏移两位起到了仅取有效位数字的作用MOV AL,DAT[BP]AND AL,0FH ;将字符转换为数字CMP AL,1 ;检测后续输入的字符是否合法,超出1~8范围则返回输入界面JB INPUTCMP AL,8JA INPUTMOV NUM2,ALMOV DX,0831HPOSMOV DL,DAT[BP] ;显示电梯下一站要停的楼层数MOV AH,2INT 21HDELAYTARGET2: MOV AL,NUM2CMP AL,NUM1 ;若下一站楼层大于当前楼层,则跳至上升命令段 JA TARGET3 ;若下一站楼层小于当前楼层,则在当前命令段MOV AL,NUM2CMP AL,NUM1 ;第二次比较,若到达目标楼层或两站楼层相同则跳至SHOW命令显示开关门动画JZ SHOWDEC NUM1PAUSE ;在画图命令之前插入暂停命令,确保电梯在任何楼层时都能暂停DOWN NUM1,DX1 ;电梯下降MOV DX,0829HPOSMOV DL,19H ;显示下箭头MOV AH,2INT 21HMOV DX,072BHPOSMOV DL,NUM1 ;显示当前楼层数ADD DL,30H ;将数字转换为ASCⅡ码MOV AH,2INT 21HDELAY ;电梯在每一层停留1S以便观察JMP TARGET2TARGET3: INC NUM1PAUSE ;在画图命令之前插入暂停命令,确保电梯在任何楼层时都能暂停UP NUM1,DX1 ;电梯上升MOV DX,0829HPOSMOV DL,18H ;显示上箭头MOV AH,2INT 21HMOV DX,072BHPOSMOV DL,NUM1 ;显示当前楼层数ADD DL,30H ;将数字转换为ASCⅡ码MOV AH,2INT 21HDELAY ;电梯在每一层停留1S以便观察JMP TARGET2UP1: CMP NUM1,8JNB INPUTINC NUM1MOV DX,0831HPOSMOV DL,NUM1 ;显示电梯下一站要停的楼层数ADD DL,30HMOV AH,2INT 21HUP NUM1,DX1 ;电梯上一层MOV DX,0829HMOV DL,18H ;显示上箭头MOV AH,2INT 21HMOV DX,072BHPOSMOV DL,NUM1 ;显示当前楼层数ADD DL,30H ;将数字转换为ASCⅡ码MOV AH,2INT 21HJMP SHOWDOWN1: CMP NUM1,1JNA INPUTDEC NUM1MOV DX,0831HPOSMOV DL,NUM1 ;显示电梯下一站要停的楼层数ADD DL,30HMOV AH,2INT 21HDOWN NUM1,DX1 ;电梯下一层MOV DX,0829HPOSMOV DL,19H ;显示下箭头MOV AH,2INT 21HMOV DX,072BHPOSMOV DL,NUM1 ;显示当前楼层数ADD DL,30H ;将数字转换为ASCⅡ码MOV AH,2INT 21HSHOW: MOV DX,0829HPOSMOV DL,'-' ;到达楼层时"Direction"显示"-"MOV AH,2INT 21HDELAY ;电梯门开关每个动作间停留1S以便观察PAUSE ;每个动作后插入PAUSE使电梯能在开关门时暂停 HALFDELAYPAUSEDELAYPAUSEHALFDELAYPAUSECLOSEDELAYPAUSESUB AX,AXINT 1AHMOV TIME,DXMOV TIME[2],CXMOV AH,0CHINT 21H ;清空键盘缓冲区MOV AL,COUNTCBW ;将字节扩展为字CMP BP,AX ;若此时没到输入数据最后一位则进入TARGET1,若已到最后一位则进入INPUT开始新一轮运行 JB TARGET1JMP INPUTOVER: MOV DX,101CH ;显示MSG2POSMOV DX,OFFSET MSG2MOV AH,9INT 21HMOV DL,0FFHMOV AH,6INT 21HJZ OVERMOV CX,0MOV DX,2479HCLEARMOV AX,4C00HINT 21H ; 返回DOS.MOV AH,02HINT 10H ; 恢复文本显示方式.pop dipop sipop dxpop cxpop bxpop axstart endp;---------------------------------------- code endsend start5、程序运行截图:程序初始界面电梯移动界面开关门状态(半开)暂停状态(第二行提示语句改变)程序退出界面五、心得体会:此次课程设计是我首次使用汇编语言进行大规模编程,在这个过程中我学到了很多“微机原理及应用”课堂上未曾提到的知识,也加深了在课堂上学到的知识,使我对于微机原理和汇编语言的掌握程度达到了新的高度。