《自动控制原理》课程设计指法练习程序.doc

上传人:土8路 文档编号:10220086 上传时间:2021-04-30 格式:DOC 页数:56 大小:181KB
返回 下载 相关 举报
《自动控制原理》课程设计指法练习程序.doc_第1页
第1页 / 共56页
《自动控制原理》课程设计指法练习程序.doc_第2页
第2页 / 共56页
《自动控制原理》课程设计指法练习程序.doc_第3页
第3页 / 共56页
《自动控制原理》课程设计指法练习程序.doc_第4页
第4页 / 共56页
《自动控制原理》课程设计指法练习程序.doc_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《《自动控制原理》课程设计指法练习程序.doc》由会员分享,可在线阅读,更多相关《《自动控制原理》课程设计指法练习程序.doc(56页珍藏版)》请在三一文库上搜索。

1、课程设计任务书学生姓名: 专业班级: 电气0803班 指导教师: 工作单位: 自动化学院 题 目: 指法练习程序 初始条件: 1.从屏幕上方随机落下可显示字符,字符的出现位置亦是随机的;2.在字符下落的过程中可输入任意键,若键入与下落字符相匹配的键,则该字符消失并发出蜂鸣声,同时计分;3.按ESC 键结束练习并显示命中数;4.按Q 键退出。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1) 设计任务及要求分析(2) 方案比较及认证说明(3) 系统原理阐述(4) 硬件设计课题需要说明:硬件原理,电路图,采用器件的功能说明(5) 软件设计课题需要说明:软件思想

2、,流程图,源程序及程序注释(6) 调试记录及结果分析(7) 总结(8) 参考资料(9) 附录:芯片资料或程序清单,软件演示屏幕拷贝图或硬件实物图时间安排:1月10日1月12日:收集资料,方案选择1月13日1月17日:整体流程,程序细节1月18日1月20日:调试程序,报告撰写1月20:交设计报告,程序演示,答辩指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日摘要本程序首先出现开始界面,然后按ENTER键进入,这时会出现速度选择界面进行选择速度,然后进入游戏界面,这时其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失,同时扬声器发声;按ESC键弹出得分结果界面;按Q键退出

3、。从设计任务及要求的分析、方案比较及认证说明、系统原理阐述、软件设计、程序调试以及心得体会六部分来对该程序的设计进行详细解释和说明,并且结合了流程图和实际界面截图。从构思,编写,调试到完整的程序实现设计任务。每一部分都做了深入的分析和说明,同时也从主题上对程序进行了分析。关键词:功能模块 核心代码 子程序 调试 运行结果目 录1设计任务及要求的分析12 方案比较及认证说明13 系统原理阐述14 软件设计24.1软件设计的思想24.2主程序及其功能说明24.2.1主程序的流程图34.2.2主程序功能说明44.3初始化子程序及其功能说明84.3.1初始化子程序的流程图94.3.2初始化子程序功能说

4、明94.4速度选择子程序及其功能说明104.4.1速度选择子程序的流程图104.4.2速度选择子程序功能说明114.5显示时钟子程序及其功能说明134.5.1显示时钟子程序的流程图134.5.2显示时钟子程序功能说明134.6开始打字子程序及其功能说明154.6.1开始打字子程序的流程图154.6.2开始打字子程序功能说明154.7显示打字结果子程序及其功能说明194.7.1显示打字结果子程序的流程图194.7.2显示打字结果子程序功能说明195 调试记录及结果分析215.1调试记录215.2运行结果226 总结24参考文献25附录26指法练习程序1设计任务及要求的分析这次课程设计的任务是写一

5、个程序,运行可执行程序后,从屏幕上方随机落下可显示字符,字符的出现位置亦是随机的;在字符下落的过程中可输入任意键,若键入与下落字符相匹配的键,则该字符消失并发出蜂鸣声,同时计分;并且在程序运行过程中,若按ESC 键,则结束练习并显示命中数,若按Q 键则退出。根据题目要求可以看到有以下几部分来实现打字练习:1.随机显示字母,字母出现的位置随机。2.字母自动落下。3.从键盘输入的字母与落下字母相同则该字母消失,同时下一个字母自动接着落下,并且扬声器发声。4程序开始统计得分和总字符数5.按下“Ese”键则程序显示得分和总字符数返。6.在主界面按“Q”则程序退出。打字练习的主要功能由以上六部分组成,每

6、一部分之间的联系都是比较紧密的。对于以上及部分,最主要的部分就是中间的四个部分,这是打字练习的重点,需要详细设计其所需要的功能。2方案比较及认证说明对于随机显示字母和字母出现的随机位置,有两种不同的产生方式。方式1:可以将字母随机的排在一个字符串中,然后通过查表的方式来显示不同的字母,字母出现位置的随机也可以这样。方式2:通过数学上产生随机数的算法来实现字母出现位置的随机,从而根据字母的位置来选择不同的随机字母。方式1只需要在开始将字母随机的排在一个字符串中,然后将字母出现位置也随机的排列在内存中就行了,这种方式调用起来方便和快捷;方式2需要用汇编语言对随机算法进行描述,从而不断的产生随机数,

7、较为复杂。最后,综和各自的优缺点,本程序选择了方式1。3系统原理阐述从设计任务及要求可以得知编写此汇编程序的基本原理,编写一个主程序和若干个子程序(初始化子程序、提示信息子程序、速度设定子程序、开始打字子程序,显示打字结果子程序)来完成设计任务所要求的功能,使程序模块化和功能化,让程序看起来简洁,明了。主程序完成的功能为:首先调用初始化子程序,对系统参数进行初始化和主界面初始化,然后调用字母下降速度选择和设定子程序对字母下降速度进行设定,其次调用系统时钟子程序显示当前时间,然后调用开始游戏子程序开始打字和计分。若想中断打字过程,并看自己的成绩,可按esc键进行游戏结束时分数显示子程序的调用,窗

8、口会显示打字情况。初始化子程序对整个程序中用到的参数进行初值设定,并显示开始界面和提示信息。速度选择和设定子程序实际上是延时环节,字母下落速度越快则延时越少,反之亦然。系统时钟子程序是采用中断调用系统时钟并显示在打字游戏窗口,让用户可以随时知道打字所花费的时间,人机交互友好,体现人性化设计。开始游戏子程序会调用字母下落子程序和随机字母和随机位置产生子程序,不断的落下字母让用户进行打字游戏,并随时显示用户的得分情况。字母下落子程序通过不断的本行写空格和下一行写当前字母来实现字母的下落。随机字母和随机位置产生子程序通过查表的方法来实现随机字母和随机位置的产生。游戏结束时分数显示子程序会显示本次用户

9、的打字情况。本程序有多个子程序和主程序构成,主程序不断地调用子程序来进行打字游戏。4软件设计4.1 软件的设计思想根据设计任务及要求,可以得到汇编语言的基本思想为编写一个主程序和若干个子程序,各子程序分别为:初始化子程序、速度设定子程序、显示时钟子程序、开始打字子程序,显示打字结果子程序,在程序运行时主程序分别调用各个子程序来完成汇编语言程序的编制和打字游戏的不断进行。因为各个子程序是相互独立的,所以可以让这些子程序分别独立的完成某一特定的功能,然后再依靠主程序来调用这些不同的功能模块,这样通过增加子程序逐渐增加系统的功能,最终主程序将所有的小功能模块连接在一起,从而达到设计任务所要求的功能。

10、这样,将一个大功能简化为一个个小功能,可以大大减小编写程序的难度,并且这样进行模块化设计大大增加了程序的可阅读性和移植性,在以后要用到相同的功能时可以将其移植过来,还大大简化了程序的设计,避免了重复劳动。4.2 主程序及其功能说明4.2.1主程序的流程图开始初始化速度选择ENTER显示当前时间是否ESC键开始游戏否是显示得分是否重新开始(Y /N)结束游戏YNQ键图1 主程序流程图4.2.2主程序的功能说明由图1可知主程序是程序的脉络主线,程序的运行就是围绕着主程序的执行而运行的同时也是其他子程序的接入点。主模块是打字游戏的核心模块,主要通过各个键盘符来控制各个子模块之间的协调,完成打字游戏的

11、运行。子模块主要包括:初始化子模块、速度设定子模块、显示时钟子模块、开始打字子模块,显示打字结果子模块。其中初始化子模块包括显示初始界面菜单,初始化程序参数,判断是否进入游戏;速度设定子模块包括速度选择子程序和速度设置子程序。显示时钟子模块包括取系统时钟和显示两个子程序。开始打字子模块包括显示分数子程序,当敲入字符与下落相符时扬声器发声子程序,字母下落子程序,产生新的字母和新的位置子程序,延时子程序。这些程序有机的组合在一起,完成整个打字游戏的运行。主程序如下所示。pushReg macropush axpush bxpush cxpush dxendm ;寄存器出栈popReg macrop

12、op dx pop cx pop bx pop axendm ;*设置光标宏* curse macro cury,curxpushReg mov ah,02h mov bh,00hmov dh,curymov dl,curxint 10hpopRegendm ;清屏宏定义 clear_screen macro op1,op2,op3,op4,color pushReg mov ax,0600h ;清屏程序 mov bh,color mov ch,op1 mov cl,op2 mov dh,op3 mov dl,op4 int 10h curse 0,0popReg endm ;菜单显示宏定义

13、menu macro cury,curx,op3 ; curse cury,curx mov ah,02h mov bh,00h mov dh,cury mov dl,curx int 10h ;mov ah,02h mov ah,09h lea dx,op3 int 21h endmdata segment ; add your data here! ;随机的字母 letters db etfpzybjsyoqirfxtdaphbfdbchrrmjwzxkhuieqtwfqzuglnvmlmotogaitlbpfuhgdzwxwqiproeagndclrjyvnzcyjywdquvpmnek

14、nvkesbhlagsoxivscmskkujcxach_count equ $-letters ;ch_count=130 、;随机的x坐标xpos db 73,42,44,74,76,43,24,62,76,1,2,44,59,77,23,9,13,53,50,63,36,15,0,33,12,51,18,8,6db 66,68,30,18,10,2,79,48,7,6,29,47,27,43,25,40,32,42,28,56,17,11,10,18,25,5,45,16db 37,67,61,28,20,69,70,34,74,55,33,4,57,69,12,66,53,2,47,4

15、0,72,34,35,20,27,71,1,6db 8,32,40,52,58,11,9,79,77,5,45,77,11,7,42,22,21,71,35,29,78,22,14,37,38,47,58,28db 78,49,31,22,50,63,39,61,51,56,48,76,7,10,75,62,67,38,3,61,24,60,56,54,34,8,33,50db 59,53,1,26,14,13,37,24,19,54,15,60,57,21,70,54,75,63,23,58,49,71,5,26,60,12,26db 15,68,69,43,8,75,41,6,74,65,

16、64,3,73,78,64,32,9,51,72,55,19,66,49,21,62,46,36,29db 0,3,46,16,72,27,59,20,46,19,38,16,45,14,41,48,41,39,52,73,30,4,52,35,67,31,13,39db 30,23,31,65,55,17,70,36,65,0,4,57,64,25,44,17 x_count equ $-xpos ;x_count=239;欢迎界面 menu0 db Welcome to play !$ menu1 db 1.Press Enter to game!,0dh,0ah,$ menu3 db 2

17、.Press Esc to exit!,0dh,0ah,$ menu40 db Hint: when you exit from the game ,0dh,0ah,$ menu41 db you will kown how much you get ,0dh,0ah,$ ;版权界面copyright_msg db Portions Copyright 2011 zhang chong. All rights reserved.,0dh,0ah,$ ;速度选项speed_msg1 db choose speed:$speed_msg2 db 1.Press h-high speed$speed

18、_msg3 db 2.Press l-low speed$speed_msg4 db 3.othes-orditional$ speed_msg5 db Speed is ungelivable? Press s to set$;输入速度值set_msg1 db Please Input a num(=x) between 1 to 999$ set_msg2 db as x percent of the orditional speed$set_msg3 db x=$set_msg4 db %$;时间和分数 time_msg db Time:$goal_msg db Your score:$

19、 ;结束界面显示score_msg1 db Congratulation! There are total $score_msg2 db chars.$score_msg3 db You have hit $score_msg4 db And you have tapped keyboard for $score_msg5 db times.$ score_msg6 dbThe hit rate is:$ score_msg7 db%;是否重新开始提示restart_msg db Do you want to continue? (y/n):$char db 0 ;字母ch_index dw

20、0 ;字母的索引x_index dw 0 ;位置的索引blife db 0 ;字母是否还在letter_y db 1 ;字母y坐标letter_x db 0 ;字母x坐标ispeed db 1 ;速度选择,0慢速,1普通,2快速score dw 0 ;得分即击中次数total dw 0 ;总共字母数nhit dw 0 ;击键次数second db 0ffh ;时间的当前秒数numchar db 4,?,4 dup(0) ;输入数字 speednum dw 0 ;速度值bset db 0 ;是否重设数字char_yn db 2,0,2 dup(0) ;是否继续的符号(Y/N)data endss

21、tack segment dw 128 dup(0)stack endscode segmentassume cs:code,ds:data,ss:stack start:; set segment registers: mov ax, data mov ds, ax mov es, axRESTART: call Init ; 初始化 cmp ax,0 je Lexit call SpeedChoose ;速度选择 call SetInterface ;速度设置界面 ; add your code here;输出一句话LgetTime: call ShowTime call PlayGame

22、s ;是否有结束标志 cmp al,0 jne LgetTime LendGame: call GameOver CALL IsRestart cmp al,0 je Lexit ;重新开始 mov bx,RESTART jmp bxLexit: mov ax, 4c00h ; exit to operating system. int 21h 4.3 初始化子程序及其功能说明4.3.1初始化子程序的流程图初始化参数初始化开始界面按键是否ENTER键进入游戏是退出游戏否图2 初始化子程序流程图4.3.2初始化子程序功能说明初始化子模块包括初始化程序参数,显示初始界面菜单,判断是否进入游戏。首先

23、初始化字母出现的位置,初始化得分和各种标志的值,然后显示初始界面菜单,通过一个比较指令和堆栈操作来判断是否进入游戏。其源程序如下。;初始化界面和判断是否进入游戏Init proc near mov letter_y,1 ;初始化y坐标 mov letter_x,0 ;初始化x坐标 ;初始化分数,击键次数和总字符数 mov score,0 mov nhit,0 mov total,0 mov bset,0 ;默认没有设置速度 mov blife,0 ;生命置空 mov ispeed,1 ;速度置为普通 clear_screen 0d,00d,24d,79d,11 ;青色包括时间和分数;24*80

24、(0开始) menu 05,20,menu0 ;菜单信息的宏调用 menu 07,20,menu1 menu 09,20,menu3 menu 13,20,menu40 menu 15,22,menu41 menu 23,08,copyright_msg ;输入是否进入游戏 mov bx,0; mov ah,01h int 21h cmp al,0dh jne Lendi inc bxLendi:push bx pop ax retInit endp 4.4 速度选择子程序及其功能说明4.4.1速度选择子程序的流程图显示速度选择界面检测键盘输入是否s设置速度标志置1设置速度是否h速度选择标志置

25、2是否l速度选择标志置0退出程序是否是否是否图3 速度选择子程序4.4.2速度选择子程序功能说明速度选择子程序初始默认速度为正常速度,然后检测键盘输入,若输入为s则转入速度设置子程序,此时可以输入0-999的数对字母下降的速度进行调整,输入数字越大则延时时间越短,即字母下降速度越快;若输入为h则将速度选择标志置2,此标志会让字母下降时延时时间缩短,即让字母下降速度变快;若输入为l则将速度选择标志置0,此标志会让字母下降时延时时间增长,即让字母下降速度变慢。速度选择子程序的源程序如下。;选择速度SpeedChoose proc near clear_screen 0d,00d,24d,79d,1

26、1 ;青色包括时间和分数;24*80(0开始) menu 07,24,speed_msg1 menu 09,24,speed_msg2 menu 11,24,speed_msg3 menu 13,24,speed_msg4 menu 17,20,speed_msg5 mov ispeed,1 ;默认普通速度 mov bset,0 ;默认没有设置速度 mov ah,01h int 21h or al,20h ;转为小写 cmp al,s jne Lnexts mov bset,1 call Setspeed ;设置速度 jmp LendChoose Lnexts: cmp al,h jne Li

27、sSlow mov ispeed,2 jmp LendChoose LisSlow:cmp al,l jne LendChoose mov ispeed,0 LendChoose: ret SpeedChoose endpSetSpeed proc near clear_screen 0,0,24,79,10 ;橙黄色界面 menu 9,20,set_msg1 menu 11,20,set_msg2 menu 13,20,set_msg3 menu 13,27,set_msg4 call CinNum ;输入数字 ret SetSpeed endp;输入速度比例CinNum proc near

28、 ;输入数字LreCin: curse 13,23 ;清除输入垃圾值 mov cx,3 mov ah,02h Lcout: mov dl, int 21h loop Lcout ;输入字符串 curse 13,23 lea dx,numchar mov ah,0ah int 21h xor cx,cx mov cl,numchar1 ;输入数字个数 lea si,numchar2 xor ax,ax ;输入数字大小 mov bl,10 ;乘10再加数 L11: ;判断输入是否合法 mov dl,si cmp dl,0 jl LreCin cmp dl,9 jg LreCin ;乘10再加数 m

29、ul bl sub dl,0 xor dh,dh add ax,dx ;加上新数 inc si loop L11 cmp ax,0 je LreCin mov speednum,ax ;速度值 ret Cinnum endp 4.5 显示时钟子程序及其功能说明4.5.1 显示时钟子程序的流程图取系统时间秒值是否变化输出当前时间退出程序是否图4 显示时钟子程序的流程图4.5.2 显示时钟子程序的功能说明显示时钟子程序首先通过DOS中断中的取系统时钟中断,获得当前系统时钟的时、分、秒值,然后将秒值与程序定义的秒值标志进行比较,若两者不想等,则将系统当前的时钟输出,若秒值没有变化,则直接退出程序。此

30、部分源程序如下。;显示时间showTime proc near mov ah,2ch ;取时间 int 21h cmp second,dh ;秒变化则再次输出,秒不变化则继续等待 jz LreShow curse 0,5 mov al,ch call p ;输出“小时” mov ah,02h mov dl,: int 21h mov al,cl call p ;输出“分钟” mov dl,: int 21h mov al,dh call p ;输出“秒钟” LreShow: ret ShowTime endp;计算2位整数,主要用于时间和分数输出p proc near mov ah,00h ;

31、将al补充为ax mov bl,10 div bl mov bh,ah ;余数存入ah mov dl,al ;商存入al or dl,30h mov ah,02h int 21h mov dl,bh or dl,30h int 21h retp endp 4.6开始打字子程序及其功能说明4.6.1 开始打字子程序的流程图显示当前得分检测键盘是否有输入与显示字符是否相同字符生命值为0扬声器发声得分加1是否esc键退出程序显示得分情况当前位置显示空字母位置下移是否显示新字母生命值置1,总字符数加1,产生新字母和新列坐标,显示新字母延时设定值否是否在当前位置显示当前字母是是否否是图5 开始打字子程序

32、的流程图4.6.2 开始打字子程序的功能说明 开始打字子程序的程序段中,首先调用显示分数子程序对当前得分进行动态显示,然后检测是否有字符从键盘输入,若没有则直接调用下落子程序和延时子程序,让字母按正常方式下落。若有字符从键盘输入则判断和当前显示字母是否相同,相同则对相关标志进行处理,不相同则判断是否和esc键相同,相同则退出程序并显示得分情况,最后除了退出程序外,其他情况都要经过字母下落子程序和延时子程序,在字母下落子程序中,会根据相关标志值的情况,判断是显示新字符,还是继续当前字符的下落,下落的快慢是由延时的长短决定的。在本程序中,有很多INT10的指令。灵活的利用INT10丰富的指令功能,

33、可以巧妙的设计出想要的程序来。INT10中断规定,DH和DL共同控制着字符输出的位置,其中DH为字符输出的行标,DL为字符输出的列标,通过改变DH和DL的值,可以改变字符在命令符输出屏幕上的位置,从而实现字符下落。开始打字子程序的源程序如下,。PlayGames Proc near cmp score,1000 jl Lrightshow curse 0,76 ;显示分数 jmp Lendsetpos Lrightshow: curse 0,77 ;显示分数 Lendsetpos: call PrintScore ;输出分数 mov ah,0bh ;是否有字符输入 int 21h inc al

34、 jne Lnochar ;没有字符 mov ah,07h int 21h inc nhit ;击键次数加一 cmp al,char ;是否和当前字符相同 jne LnotHit call SOUND ;按键正确则发 mov blife,0 ;击中当前字符 inc score jmp Lnochar LnotHit:cmp al,27;esc 键退出 jne Lnochar dec nhit ;退出不算击键 xor ax,ax jmp Lendplay Lnochar: call LetterDown call Delay mov ax,1Lendplay: ret PlayGames end

35、p;显示四位数字数字PrintScore proc near ;万位数字 mov ax,score cmp ax,10000 jl Lsmlth mov bx,10000 xor dx,dx div bx mov ax,dx ;万位数字暂不显示 Lsmlth:;千位数字 cmp score,1000 jl Lsmallhun xor dx,dx mov bx,1000 div bx push dx ;余数 call outnum ;显示千位数字 pop ax Lsmallhun: ;显示百位数字 mov bl,100 div bl push ax ;余数 call outnum ;显示百位数字

36、 pop ax mov al,ah ;显示个位和十位数字 call p ret PrintScore endp 字母下降一层LetterDown proc near mov ch,letter_y mov cl,letter_x mov dl, call LetterShow inc letter_y ;下降一格 mov al,0 cmp blife,0 ;生命值为0 jne Lnext1 inc alLnext1: cmp letter_y,24 ;到达游戏界面底部 jl Lnext2 inc alLnext2: cmp al,0 ;是否该显示新字母 jne Lnewletter ;字母下一

37、行显示 mov ch,letter_y mov cl,letter_x mov dl,char call LetterShow jmp Lendown Lnewletter: mov blife,1 inc total ;总字符数加1 call GenNewPos mov ch,letter_y mov cl,letter_x mov dl,char call LetterShow Lendown: ret LetterDown endp4.7 显示打字结果子程序及其功能说明4.7.1显示打字结果子程序的流程图清屏显示总的字符数显示得分数显示总击键数开始是否重新开始退出游戏是否图6 显示打字结

38、果子程序的流程图4.7.2显示打字结果子程序的功能说明显示打字结果子程序通过不断的调用计算数字位数子程序,显示数字子程序来将总字符数、总击键数、得分数,显示在屏幕上,当然字符前面也有一些提示信息,它们是通过调用宏来实现字符串现实的,并且通过调用INT10的相关中断改变字符串显示的颜色和数字显示的颜色。其源程序如下所示。GameOver proc near ;游戏结束显示分 clear_screen 0,0,24,79,14 ;橙黄色界面 ;总共的字符数 ;-total menu 07,20,score_msg1 mov ax,total call CountNum ;计算数字位数,返回值在cx

39、中 mov bl,52 add bl,cl ;x坐标 push bx clear_screen 07,52,07,bl,12 ;分数处颜色为红色 curse 07,52 mov ax,total call CoutNum ;输出数字 pop bx inc bl menu 07,bl,score_msg2 ;-score ;击中的字符数 menu 09,20,score_msg3 mov ax,score call CountNum ;计算数字位数,返回值在cx中 mov bl,33 add bl,cl ;x坐标 push bx clear_screen 09,33,09,bl,12 ;分数处颜

40、色为红色 curse 09,33 mov ax,score call CoutNum ;输出数字 pop bx inc bl menu 09,bl,score_msg2;-nhit ;击键的次数数 menu 11,20,score_msg4 mov ax,nhit call CountNum ;计算数字位数,返回值在cx中 mov bl,53 add bl,cl ;x坐标 push bx clear_screen 11,53,11,bl,12 ;分数处颜色为红色 curse 11,53 mov ax,nhit call CoutNum ;输出数字 pop bx inc bl menu 11,bl,score_msg5 ;显示是否重新开始 menu 15,20,

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1