收藏 分销(赏)

微机原理应用打字计时练习.docx

上传人:仙人****88 文档编号:9280938 上传时间:2025-03-19 格式:DOCX 页数:28 大小:52.87KB 下载积分:10 金币
下载 相关 举报
微机原理应用打字计时练习.docx_第1页
第1页 / 共28页
微机原理应用打字计时练习.docx_第2页
第2页 / 共28页


点击查看更多>>
资源描述
******************* 实践教学 ******************* 兰州理工大学 2011年春季学期 微机原理应用课程设计 题 目: 打字计时练习 专业班级: 姓 名: 学 号: 指导教师: 成 绩: 摘要 本设计为打字计时系统,其主要分为五部分,第部分为设计概述,主要介绍设计的任务、目标,以及设计所用设备器材,第二部分为软件设计环境与DOS,主要是介绍软件设计环境,以及DOS资料的介绍。并且在此之上画出了原理框图。第三部分为软件设计,其主要介绍本设计中采用何种软件设计方案及相关的流程图,在流程图的基础上,写出本系统的程序。第四部分为调试及运行结果,它是在完成软件设计的基础之上,对本系统进行测试,看是否满足题目要求,最后以表格的方式对测试的结果给予反应,直接明了。第五部分为设计心得总结,主要是介绍在经过本次设计后,自己的一些心得体会。最后还给出了本设计的一些参考文献。 关键词:打字计时,时间的中断,字符显示 前 言 微机原理及应用是一门实践性很强的课程;其课程设计目的在于综合运用所学知识,全面掌握微型计算机与DOS方式的工作原理、编程和使用方法;在设计中,通过小组协作提出并论证设计方案,进行软件调试,最后获得正确的结果,可以加深和巩固对理论知识的更好掌握,进一步建立计算机应用系统体概念,初步掌握DOS开发方法,为以后进行实际的软件应用开发奠定良好的基础。 本设计是利用Masm for window集成实验环境来实现的打字练习计时程序,在程序中利用自编的中断程序kbint检测按键时产生的中断,并把按键的扫描码转换为ASCII码存入缓存区BUFFER(内存中的一个区域),这个工作和EOM 09类型的键盘中断例行程序所完成的工作大致相同,只是在解释各个键时作了简化,既只解释了可显示字符(入英文小写字母、数字及一些字符),其他特殊键(如组合键、双态键、功能键等)都未做解释,只作字符码0来处理。另外加入一个菜单模块,增加了程序的观赏性。 本次课程设计由某某完成。其中主要负责软件方案及程序设计,主要负责协调测试,是负责寻找资料与文档的编写 目 录 1、设计任务 5 2、设计要求 5 3、设计目的 5 4、软件设计思想 6 5、程序流程图 7 6、程序代码 12 7、调试及运行结果 26 8、课程设计心得 27 9、设计的主要参考文献 28 正文 1、设计任务 设计一个在键盘上练习打字并能统计时间的程序。 2、设计要求 1、自行编写键盘中断和时间中断处理程序,并保存原中断向量。程序运行时,使用自编的中断向量处理程序。程序退出时,恢复中断向量。 2、查阅文献资料,一般在5篇以上; 3、完成算法设计和程序设计、调试; 4、撰写课程设计说明书; 5、做好答辩工作。 3、设计目的 1、熟悉和掌握有关键盘和时间的中断; 2、掌握字符显示技术; 3、熟悉汇编语言程序的编译、链接过程; 。 4、软件设计思想 在键盘上练习的打字例句及其地址表、计时单元等预先放在DATA数据段中。 自编中断程序检测按键时产生的中断,并把按键的扫描码转换为ASCII码存入缓冲区。 主程序部分保存原来的09类型的中断向量,设置自编例行程序的中断向量,设置中断屏蔽位,然后打开中断。当键盘中断处理后,主程序中安排指令读取缓冲区中的字符显示在屏幕上。主程序末尾,利用DOS功能恢复原09类型的中断向量,然后返回DOS。 打字时间统计利用自编的定时器中断处理程序,每输完一个例句,计时一次。在此中断例行程序中,定时器中断的次数记录在计数单元count中,当count计数值为18时,sec计数单元加1,当sec计数值达到60时,min计数单元加1。因为输入完一个句子无论如何也不会达到小时级,所以对hours计数值的调整判断,实际只起到退出定时器中断的作用。 显示时间的子程序分别将各计时单元的二进制数转换为十进制数,并以min:sec:msec的形式显示出来。其中msec是由count中的计数值转换成的: count×1s/18.2=count×55ms,该式中,18.2是计算机系统产生的一个时间中断,每秒18.2次。 5、程序流程图 5.1系统结构图 主程序 输入模块 错误字符统计及输出模块 计时模块 码变换模块 显示模块 调用 执行函数 调用 定义数据段和参数设置 开始 结束 5.2 各模块说明 存放字符的数据段模块:主要存放显示字符的数据段,以字符形式存储输入错误个数,以字符形式存储打字用时,同时包括堆栈段。 主程序:程序的主体,通过执行函数调用各个模块,是整个程序的核心,同时也是函数正常运行的枢纽。 输入模块: 测试者通过键盘键入内容,同时和存放字符的数据段比较。 计时模块:将两次调用系统的时间差储存起来。 码变换模块:计算机输入设备输入的信息一般是由ASCII码和BCD码表示的数据和字符,CPU一般均用二进制数进行计算或其他信息处理,处理结果输出又必须依照外设的要求变为ASCII码、BCD码、七段显示码等。因此,在应用软件中,各类数制的转换和代码的转换是必不可少的。在此程序模块中,将ax中的十进制数转换为字符存储在ds:si指向的存储空间中;显示ds:si指向的一段以0结尾的字符串;将al中的bcd码转换成十进制存储在al中返回。 显示模块:测试者获取信息的窗口,计算机通过显示模块将提示信息,打字用时和测试结果呈现在测试者的面前。 执行函数模块:调用各个分模块,是主程序的执行者。 程序结束模块:结束程序。 输入模块: 从键盘输入字符 启动计时器 对 错 显示淡绿色 显示红色 输出字符 开始 结束 和数据段的数据比较 计时模块:第一次调用系统时间T1 根据显示输入数据 数据输入完成,再次调用系统时间T2 两次调用时间的时间差 T=T2-T1 将时间差T存入t中 开始 结束 将ax中的十进制数转换为字符存储在ds:si指向的存储空间中 显示ds:si指向的一段以0结尾的字符串 将al中的bcd码转换成十进制存储在al中返回 显示提示信息 开始 结束 6、程序代码 ;******************** ;存放字符的数据段 * ;******************** data segment db "interpret:movdh,12movdl,2movcl,01101010bcallshow_strcalprompt1call error_num_dispcall prompt2call time_dispret",0 data ends ;************************* ;以字符形式存储错误个数 * ;************************* count segment db 16 dup(0) count ends ;************************* ;以字符形式存储打字用时 * ;************************* all_time segment db 16 dup(0) all_time ends ;************** ;堆栈段 * ;************** stack segment db 512 dup(0) stack ends ;************** ;主程序 * ;************** assume cs:code code segment start:mov ax,data mov ds,ax mov si,0 mov ax,stack mov ss,ax mov sp,512 call interpret mov ax,4c00h int 21h ;******************* ;打字模块 * ;******************* print: push ax push bx push cx push dx push si mov bh,0 ;在第0页显示 mov dh,13 ;将光标设置为13行 mov dl,1 ;将光标设置为第一列 mov cx,1 ;输出一个字符 mov bp,0;用bp计数错误的功能 call timer;启动计时器 pr_start:mov ah, ds:[si] cmp ah,0 je p_end;遇到0则输入结束 mov ah,2;设置光标 int 10h mov ah,0;输入一个数 int 16h cmp al,ds:[si] jne wrong mov bl,01101010b;输入正确时的显示颜色 jmp pri wrong: inc bp mov bl,01101100b;输入错误时的显示颜色 pri: inc si inc dl mov ah,9;输出字符 int 10h jmp pr_start p_end: call timer pop si pop dx pop cx pop bx pop ax ret ;******************************** ;错误字符个数输出模块 * ;******************************** error_num_disp:push ax push cx push dx push si push bp push ds mov ax,count mov ds,ax mov si,0 mov ax,bp call dtoc mov dh,1 mov dl,15 mov cl,0ach mov si,0 call show_str pop ds pop bp pop si pop dx pop cx pop ax ret ;*********************************************** ; 计时器,将两次调用timer的时间差存储在t中 * ;*********************************************** timer: jmp short t_start t dw 0 t_start: push ax push bx mov al,2 out 70h,al in al,71h call bcd_ten mov bl,60 mul bl mov bx,ax mov al,0 out 70h,al in al,71h call bcd_ten mov ah,0 add ax,bx sub ax,t mov t,ax pop bx pop ax ret ;*************************** ;显示时间 * ;*************************** time_disp:push ax push cx push dx push si push ds mov ax,all_time mov ds,ax mov si,0 mov ax,t call dtoc mov dh,3 mov dl,12 mov cl,0ach mov si,0 call show_str pop ds pop si pop dx pop cx pop ax ret ;*********************************************************** ;将ax中的十进制数转换为字符存储在ds:si指向的存储空间中 * ;*********************************************************** dtoc: push ds push ax push cx push dx push di mov di,0 mov bx,10 dtoc1:mov dx,0 div bx mov cx,ax add dx,30h push dx inc di jcxz dtoc2 jmp dtoc1 dtoc2:mov cx,di dtoc3:pop dx mov ds:[si],dl inc si loop dtoc3 pop di pop dx pop cx pop ax pop ds ret ;**************************************** ;显示ds:si指向的一段以0结尾的字符串 * ;**************************************** show_str:push cx push si push ax push bx push es push dx mov al,0A0h dec dh mul dh mov bx,ax mov al,2 mul dl sub ax,2 add bx,ax mov ax,0B800h mov es,ax mov al,cl mov ch,0 s2:mov cl,ds:[si] jcxz ok2 mov es:[bx],cl mov es:[bx+1],al inc si add bx,2 jmp short s2 ok2:pop dx pop es pop bx pop ax pop si pop cx ret ;******************************************** ;将al中的bcd码转换成十进制存储在al中返回 * ;******************************************** bcd_ten:push bx push cx push dx mov dl,al mov cx,4 shr al,cl mov bl,10 mul bl and dl,00001111b add al,dl pop dx pop cx pop bx ret ;**************************************** ;显示提示信息 * ;**************************************** prompt1: jmp short p1_start p1 db "error number:",0 p1_start:push ax push cx push dx push ds push si mov ax,seg p1 mov ds,ax mov si,offset p1 mov dh,1 mov dl,1 mov cl,11101100b call show_str pop si pop ds pop dx pop cx pop ax ret ;********************************* ;解释执行模块 * ;********************************* interpret:mov dh,12 mov dl,2 mov cl,01101010b call show_str call print call prompt1 call error_num_disp call prompt2 call time_disp ret code ends end start ;********************************* ;显示提示信息 * ;********************************* prompt2: jmp short p2_start p2 db "all time:",0 p2_start:push ax push cx push dx push ds push si mov ax,seg p2 mov ds,ax mov si,offset p2 mov dh,3 mov dl,1 mov cl,11101100b call show_str pop si pop ds pop dx pop cx pop ax ret 7、调试及运行结果 错误字符数:107 测试时间: 11秒 8、课程设计心得 一周的课程设计在忙忙碌碌中一晃而这次课程设计进一步端了我的学习态度,学会了实事求是,严谨的作风,提高了动手能力。 实事求是,严谨的工作作风是我们所必须具备的,是什么就是什么。科学来不得半点儿马虎。否则就会“差之毫厘,失之千里。”同时,对自己要严格要求,不能够一知半解,要力求明明白白。 急于求成是不好的,我有所感受。如果省略了那些必要的步骤,急于求成,不仅会浪费时间,还会适得其反。 在我看来,懂得少,并不可怕,可怕的是不向别人虚心学习。没有人生下来就知道什么,也没有人生下来就很聪明。即使天才,也要通过后天的努力,才获得成功的。我觉得动手之前,头脑里必须清楚该怎么做,这一点是很重要的。就目前来说,我的动手能力虽然差一点,但我想,通过我的不懈努力,在这方面,我总会得到提高。这一点,我坚信。因为别人能做到的, 我也一定能做到。 在此次的课程设计中我最大的体会就是进一步认识到了理论联系实践的重要性。一份耕耘,一份收获。通过一个星期电子实习,让我明白科学的思维方法和学习方法是多么重要,只有这样才能够有很高的效率,才能够让自己的工作更完美。 总而言之,此次课程设计让我学到了好多平时在课堂上学不到的东西,增加了我的知识运用能力,增强我的实际操作能力。谢谢老师给我们提供这么好的机会,为我们之后走向社会奠定了一个好的基础 。 9、设计的主要参考文献 [1] 宋杰,汪志宏,江敏,微机原理与接口技术课程设计,机械工业出版社,2005.4 [2] 周明德,微型计算机系统原理及应用习题集、习题解答与实验指导,清华大学出版社,2005.7 [3] 张开成,微型计算机原理,西南师范大学出版社,2006.8 [4] 沈美明,温冬婵, IBM-PC汇编语言程序设计第2版,清华大学出版社,2006.5 [5] 戴梅萼,史嘉权, 微型机原理与技术-习题、实验和综合训练题集,清华大学出版社,2009.4
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服