基于微机抢答器.docx
《基于微机抢答器.docx》由会员分享,可在线阅读,更多相关《基于微机抢答器.docx(12页珍藏版)》请在冰豆网上搜索。
![基于微机抢答器.docx](https://file1.bdocx.com/fileroot1/2023-1/4/9ac671c3-aa94-4e00-bf23-2333f5d4c4f0/9ac671c3-aa94-4e00-bf23-2333f5d4c4f01.gif)
基于微机抢答器
1概述
计算机的基本结构,经过简化可以看成有运算器和控制器构成的中央处理器单元,即CPU,和RAM与I/O接口电路组成。
通常,在微型计算机中中央处理器单元CPU做成一个单独的芯片,称为微处理器或微处理机。
储存器是位于CPU之外的另一种芯片,称为内存储器或主存储器。
它是计算机的一个记忆装置,用来存放以二进制编码形式表示的程序,原始操作数,运算和处理中间结果及最后结果。
计算机通过执行一个解题程序来完成一个具体的求解,而一个解题程序由若干指令组成。
因此,要了解计算机如何执行一个程序(即计算机的整机工作原理),必须先了解控制器完成一条指令的所采取的控制步骤。
控制器完成一条指令需经过取指令,分析指令和执行指令。
只要掌握计算机整机工作原理的基本概念,再去学习更高级,更复杂的计算机技术便会变得清晰和容易。
应用在计算机中的物件也是越来越多。
抢答器是各种竞赛活动中不可缺少的设备。
在电脑中制作一个简单的抢答器,通过计算机的显示器显示抢答者,借助键盘提供近百个接口进行抢答,操作简单,可以满足一般的竞赛活动的需要。
这也充分满足可人们的要求。
基于微机原理下,实现抢答器设计。
首先,要具备有数字电路的理论知识;其次也要具备有微机原理的理论知识和实践能力;再者熟悉汇编语言的编程技术,80X86的CPU结构和指令系统;最后也得了解接口电路的设计方法。
这次的抢答器程序设计,还附加了一些另外的要求,在屏幕上显示倒计时时间;时间为0时进行抢答;抢答完成后显示抢答人和抢答时间。
在满足了上述要求后在PC机上实现抢答的功能。
这样才具有实用性。
2相关指令介绍
在设计的抢答器程序中,使用汇编语言编写的,这样就会用到了许多指令,包括一些常用的指令,子程序调用指令,宏调用指令以及DOS和BIOS的功能调用指令等。
这里将把这次会用的指令做以下说明解释。
1)宏指令
宏指令是源程序中具有独立功能的一端程序代码。
它可以根据用户的需要,由用飞户自己在源程序中定义。
宏指令一经定义,便可在以后的程序中多次调用。
宏指令由MASM宏汇编程序提供的伪指令实现,格式为
宏指令名MACRO<形式参数>
。
。
。
;宏体
。
。
。
;
ENDM
2)通用数据传送指令
指令格式:
MOVOP1,OP2
将源操作数(OP2)内容传送到目标操作数(OP1)中。
MOV指令常用于对寄存器、存储器赋值,数据暂存等场合。
3)堆栈操作指令
存储器堆栈操作指令是CPU对内存堆栈段中的存储单元进行存(压入堆栈)、取(弹出堆栈)的操作。
指令格式是:
PUSHOP2(源操作数);POPOP1(目的数)
4)比较指令CMP
指令格式:
CMPOP1,OP2
将OP1减OP2,执行完成后,OP1、OP2仍保持原值,其想减结果不送至OP1,仅影响标志位。
5)转移指令
JMPOP1,指令功能为无条件地控制程序转移到OP1指定的目标地址。
JA:
如果高于,转移;
JB:
如果低于,转移;
JZ:
如果为零,转移;
JNZ:
如果不为零,转移;
JE:
如果等于,则跳转;
JAE:
如果高于或等于,则跳转;
JNE:
如果不等于,则跳转。
6)循环(控制)指令:
LOOP循环指令也称为迭代控制指令,用来管理程序循环的次数。
调用子程序和返回指令CALLOP/RET。
7)中断指令
INT10H是由BIOS对屏幕及显示器所提供的服务程序,使用INT10H中断服务程序时,调用的功用如下,
00H—设置显示方式(AH=00H,AL=显示方式码)
02H—DH=行数,DL=列数,BH=页面,设置光标位置
INT21H是由BIOS对设备所提供的服务程序,使用INT21H中断服务程序时,调用的功用如下,
02H—显示输出(DL=显示输出字符)
06H—控制台输入输出(DL=FFH输入,DL=字符输出,AL=输入字符)
4CH—终止程序(AL=返回码)
INT1AH调用功用如下,
00H —读取时钟“滴答”计数(CX=计时变量高子内容,DX=计时变量低字内容)
3程序设计和流程图
3.1程序汇编设计及注释
对抢答器其的设计,首先就是一个怎么样的显示过程。
用汇编语言实现输出字符串的思想,首先用BIOS的10H中断类型的02H功能置光标位置,然后用宏指令输出字符串,接着用DOS的21H中断类型的09H功能显示字符串来显示主界面。
接下来就实现抢答的功能,显示要倒计时,这里用延迟一秒来作用。
到达0后,就开始执行按键抢答计算,显示,和相关附加功能,具体见程序如下:
datasegment
Counting=5;倒计时的秒数,也是抢答时间上限
Didas=18;滴答次数
msgCDdb'Counting','$'
msgUdb'User'
Uiddb?
db':
'
Timedb?
'.',?
?
'Seconds.$'
UKeydb'123';按键ASCII码
UCount=($-UKey);抢答人数
msgdb'PressAnykeytoExit!
$'
msg1db'NoonePress!
$'
StartCdw?
?
;抢答开始时钟计数
EndCdw?
?
;抢答结束时钟计数
Timesdw?
?
dataends
PRTSTRMACROZ;输出字符串
leadx,Z
movah,09h
Int21h
ENDM
SETXYMACROX,Y;设置光标位置,X=行,Y=列
xorbh,bh;清零
movah,02h
movdh,X
movdl,Y
Int10h
ENDM
codesegment
assumecs:
code,ds:
data
DELAYProcNear;延迟一秒子程序
pushdx;储存dx
pushcx;储存cx
xorax,ax;清零
int1ah;读取第一次获得时间
movTimes,dx
Read_Time:
xorax,ax
int1ah;再次读取时间
subdx,Times
cmpdx,Didas;与1秒相比较
jbRead_Time;不高于则转移
popcx;取出cx
popdx;取出dx
ret;返回
DELAYENDP
start:
movax,data
movds,ax;代码段赋值
movah,00h
moval,02h
int10h;80×25黑白字符显示模式
SETXY9,35
PRTSTRmsgCD;屏幕中间显示Counting
;倒计时开始
xorcx,cx;清零
movcl,Counting;
PC:
SETXY10,39
movdl,cl
adddl,30h
movah,02h
int21h;显示倒计时秒数
callDELAY;延时一秒
loopPC;倒计时未到0,继续执行
SETXY10,39
movdl,cl
adddl,30h
movah,02h
int21h;显示最后一次数0
;抢答计时开始
xorax,ax
int1ah;cx:
dx=读取时钟计数,每秒18.2次.
movStartC,dx
movStartC+2,cx;保存抢答开始时钟计数
movbx,Counting*182/10;Counting秒所经过的时钟数
adddx,bx
adccx,0
movEndC,dx
movEndC+2,cx;计算并保存抢答结束计数
J_again:
movah,06h
movdl,0ffh
int21h
oral,al;al为0表示取完,跳出循环
jzJ_test;没按键则直接检测是否已到抢答时间上限
xorsi,si;将SI清零
PC1:
cmpUKey[si],al;比较按键和UKEY中的字符
jeJ_Press;相等,则跳转
incsi;SI+1
cmpsi,UCount;比较两者
jbPC1;低于则执行
J_test:
movah,0
int1ah;获取时钟数
movbx,EndC
movax,EndC+2
subbx,dx
sbbax,cx;预置时钟与获取时钟比较
jaeJ_again;大于则执行
SETXY11,33;定义坐标
PRTSTRmsg1;否则显示NoOnePress
jmpPC2;无条件转移
J_Press:
movah,0
int1ah;获得按键时刻的时钟数
incsi
movax,si
addal,30h
movUid,al;存贮按键用户编号
movbx,StartC
movax,StartC+2
subdx,bx
sbbcx,ax;计算从计时开始到按键经过的时钟数,最后存在dx中
movax,1000
muldx
movbx,182
divbx;将时钟数换算成百分秒数,存放在ax中
movbl,100
divbl;计算整秒数,结果在al中
addal,30h
movTime,al
moval,ah
xorah,ah
movbl,10
divbl;计算十分秒数,结果在al中
addal,30h
movTime+2,al
addah,30h
movTime+3,ah;百分秒
SETXY11,34
PRTSTRmsgU
PC2:
SETXY12,29
PRTSTRmsg
PC3:
movah,06h
movdl,0ffh
int21h;等待用户按键退出
cmpal,0
jePC3
movax,4ch
int21h
codeends
endstart
3.2抢答器程序流程图
4仿真结果
我们在MF2KP仿真软件上进行编译、连接、运行后,弹出的对话框如下:
图1调试结果1
由上图可知,从第5秒开始倒计时。
图2调试结果2
由上图可知,计时到0秒的时候开始抢答,抢答后显示抢答者和抢答时间。
5心得体会
在这几天里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
以前在上课的时候,老师经常强调在写一个程序的时候,一定要事先把程序原理方框图化出来,但是我开始总觉得这样做没必要,很浪费时间。
但是,这次课程设计完全改变了我以前的那种错误的认识,以前我接触的那些程序都是很短、很基础的,但是在课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的。
因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。
其次,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。
在设计过程中,经常会遇到这样那样的情况,就是心里想老着这样的编程可以行得通,但实际运行后,总是实现不了,因此耗费在这上面的时间用去很多。
做课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解各个知识点,而且考试内容有限,所以在这次课程设计过程中,我从根本上了解了很多很多知识点,并且对于它们在实际中的应用有了更多的认识。
平时看课本时,有时问题老是弄不懂,做完课程设计,那些问题就迎刃而解了。
而且还可以记住很多东西。
平时看课本,这次看了,下次就忘了,认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。
经过本次的课程设计,也感觉到自己所学的太有限了,在设计过程中,自己也发现了自己许多的不足之处,有些自己认为很了解的东西,却在自己设计时候总是过不去,后来经过几经查阅书籍,才找到相应知识点,进行分析和吸收。
完成这次课程设计我觉得收获很多,不但进一步掌握了微机原理的知识及专业仿真软件的基本操作,还提高了自己的设计能力及动手能力。
理论知识的不足在这次实践中表现的很明显,这将有助于我今后进一步的学习。
6参考文献
[1]姚燕南,薛钧义主编.《微型计算机原理与接口技术》.北京:
高等教育出版社,2004
[2]周明德,蒋本珊主编.《微机原理与接口技术》.北京:
人民邮电出版社,2002
[3]薛花主编.《微机原理与接口技术》.天津:
天津大学出版社,2009
[4]吴宁主编.《Pentium微型计算机原理及应用》.北京:
电子工业大学出版社,2000
[5]仇玉章主编.《32为微型计算机原理与接口技术》.北京:
清华大学出版社,2000
[6]邹逢兴主编.《计算机硬件技术基础》.北京:
高等教育出版社,1998
[7]谢瑞和主编.《微机技术实践》.武汉:
华中科技大学出版社,1995
[8]马忠梅主编.《单片机C语言应用程序设计》.北京:
北京航空航天大学出版,1997