当前位置:文档之家› 微机原理课程设计报告

微机原理课程设计报告

—微机原理课程设计报告——电子表程序设计^。

(一)设计任务:用汇编语言设计一电子表程序,要求:!(1)实现秒、分、时的计时,并显示于屏幕中央(2)能够校时(3)能够半点、整点报时(二)设计原理该程序主要由三部分构成:时间设置、延时程序和时钟显示。

(1)时间设置…①输入初始时间先调用DOS操作系统模块2,在显示屏上显示‘:’,再调用DOS操作系统模块10,提示输入初始时间。

由键盘输入的时间以字符串形式存放在已定义的存储器缓冲区内,继而调用TRAN1转换子程序和MUL10乘10子程序,将存放在存储器缓冲区内的ASCII字符转换为压缩BCD码,并将时、分、秒的值放置在寄存器CH、DH、DL中。

②暂停计时按Pause Break键即可暂停计时,再按下任意键恢复计时③重新输入时间在程序运行时,可按下Esc键重新输入初始时间,此时程序检测到Esc(ASCII码为1BH)被按下,返回①步提示重新输入时间。

以上两步可实现校时的功能。

④半点、整点报时《程序运行时,分钟值每次改变都需要与30、60比较,若相等,则调用DOS操作系统模块7使计算机响铃并在时间后显示‘ ------’。

同时若分、秒值为60则需进位,时为24时进位,保证时钟程序的正确性。

(2)延时程序计算机在执行指令时,各种操作都按指令执行,但在像程序控制器那样由计算机发出指令控制外部设备是,由于外部设备所具有的机械惯性或其他原因,需要在计算机发出指令后有规律地延迟或等待一段时间。

这类延时,可以用硬件延时来完成,单用软件来实现也是一种方便和常用的方法。

计算机执行每一条指令,虽然很快,但还是需要一段时间的。

因此从理论上讲,可在程序中加一些与程序无关的指令去完成,要计算指令执行的时间,又不能过多的为了延时而增加编制程序的工作量。

因此,编制延时程序,应尽量采用较少的指令,节约存储器,并且不能对主程序造成影响。

每条指令执行时间的长短,是以计算机的时钟周期为基本单位的。

当CPU采用的时钟频率一定时,时钟周期也为定值。

因此可根据时钟周期的多少来计算执行指令所需的时间。

完成本设计任务使用的计算机采用Intel Pentium 4处理器,主频为,时钟周期约为。

通过时间约1s的长延时累加,并以时、分、秒的形式显示出来,就可以编写出一个时钟程序。

(3)时钟显示…①设置光标位置子程序IOSET一般的显示屏可显示25行、80列字符,屏幕左上角字符位置为0行0列,右下角字符位置为24行79列,对应于十六进制为:左上角为(0,0),右下角为(18,4F)。

设置光标,可调用BIOS系统,用汇编语句调用中断INT 10H,其入口信息为(AH)=2 要设置光标;(BH)=0 页号;(DH,DL)=( 0CD,24) 置光标于行、列数,本程序要求置光标于屏幕中央,即为12行36列(十进制)。

②清除屏幕子程序IOCLR当开始执行程序时,总希望有一个洁净的屏幕,此时可使显示屏幕作上滚动作,使屏幕留下一片空白,也可以清楚屏幕的一部分,是这部分空白留作它用。

要使屏幕上滚,可用汇编语句调用中断INT 10H,其入口信息为((AH)=6 是屏幕上滚;(AL)=00 上滚行数,若(AL)=0,则整屏为空白;(CH,CL)= 滚动区域的左上角行列号,本程序中(CX)=0;(DH,DL)= 滚动区域的右下角行列号,本程序中(DX)=184FH;(BG)= 空白行属性,当(BH)=7时,为正规属性(黑白)。

③屏幕显示程序DISPY显示屏幕作为常用的输出设备,可用来显示运算的中间结果或最终数据,也可用来显示表示正确完成或检验出的错误信息。

为了显示表示正确或显示错误的信息,必须在数据段中以字符串形式将提示信息加以定义,然后由显示器在屏幕上加以显示。

DOS系统中的显示功能模块号为2,每次调用仅能显示DL中的一个字符。

为显示字符串,可调用DOS系统另一功能,用汇编语句调用中断INT 21H,其入口信息为(AH)=9 显示字符串的功能模块号;^(DS:DX) 指向字符串的首地址,要求字符串以字符‘$’结尾。

(三)框图(四)程序清单DAT SEGMENTRING DB ' ------$'FLAG DB 0BUFFER DB 10DB`DB 10 DUP ()DAT ENDSSTA SEGMENT PARA STACK 'STACK'STAPN DB 100 DUP ()TOP EQU LENGTH STAPNSTA ENDSCOD SEGMENTSTART PROC FAR|ASSUME CS:COD,DS:DAT,SS:STAMOV AX,DATMOV DS,AXMOV AX,STAMOV SS,AXMOV AX,OFFSET TOPMOV SP,AXMAIN: ;主程序`PUSH BXPUSH CXPUSH DXCALL IOCLR ;清除屏幕CALL IOSET ;设置光标位置POP DXPOP CXPOP BX:MOV DL,':'MOV AH,2 ;显示字符":",提示输入时间 INT 21HMOV DX,OFFSET BUFFERMOV AH,10INT 21HMOV BX,OFFSET BUFFER+2CALL TRAN1、INC BXINC BXINC BXINC BXCALL TRAN1MOV BX,OFFSET BUFFER+2MOV AL,[BX]。

CALL MUL10MOV CH,ALINC BXINC BXMOV AL,[BX]CALL MUL10MOV DH,ALINC BX—INC BXMOV AL,[BX]CALL MUL10MOV DL,ALAGAIN:MOV AL,0MOV FLAG,ALMOV AH,01H ;判断是否键盘有无输入,若有则重新置初值、INT 16HCMP AL,1BHJZ MAINCALL TIMEMOV AL,DLADD AL,1DAAMOV DL,AL{CMP AL,60HJNE DISPYMOV DL,0MOV AL,DHADD AL,1DAAMOV DH,ALCMP AL,30H ;与30比较—JNE NEXTMOV AL,1MOV FLAG,ALNEXT: CMP AL,60H ;与60比较JNE DISPYMOV AL,1MOV FLAG,AL:MOV DH,0MOV AL,CHADD AL,1DAAMOV CH,ALCMP AL,24HJNE DISPYMOV CH,0\DISPY:MOV BX,OFFSET BUFFERMOV AL,CHCALL TRAN2INC BXMOV AL,':'MOV [BX],ALINC BX,MOV AL,DHCALL TRAN2INC BXMOV AL,':'MOV [BX],ALINC BXMOV AL,DLCALL TRAN2【INC BXMOV AL,'$'MOV [BX],ALPUSH BXPUSH CXPUSH DXCALL IOCLRCALL IOSET《MOV DX,OFFSET BUFFERMOV AH,9INT 21HMOV AL,FLAG ;若标志位为1,则报时,并显示 ------CMP AL,1JNE NEXT1MOV DX,OFFSET RINGMOV AH,9;INT 21HMOV AH,02MOV DL ,07HINT 21HNEXT1:POP DXPOP CXPOP BX》JMP AGAINRETSTART ENDPTRAN1 PROC ;ASCII码转BCD码 MOV AL,[BX]AND AL,0FHMOV [BX],ALINC BX%MOV AL,[BX]AND AL,0FHMOV [BX],ALRETTRAN1 ENDPMUL10 PROC ;BCD码转压缩BCD码 ADD AL,ALDAA?MOV CL,ALADD AL,ALDAAADD AL,ALDAAADD AL,CLDAAMOV CL,AL]INC BXMOV AL,[BX]ADD AL,CLRETMUL10 ENDPTRAN2 PROC ;压缩BCD码转ASCII码 MOV CL,ALSHR AL,1《SHR AL,1SHR AL,1SHR AL,1OR AL,30HMOV [BX],ALINC BXMOV AL,CLAND AL,0FH'OR AL,30HMOV [BX],ALRETTRAN2 ENDPTIME PROC ;延时子程序PUSH CXPUSH AXMOV AX,04FFFH…GOON2: MOV CX,0FFFFHGOON: DEC CXJNZ GOONGOON1:DEC AXCMP AX,0JNE GOON2POP AX'POP CXRETTIME ENDPIOCLR PROC ;清除屏幕子程序MOV AX,0600HMOV CX,0000HMOV DX,184FHMOV BH,07…INT 10HRETIOCLR ENDPIOSET PROC ;设置光标位置MOV DX,0C24HMOV BH,00MOV AH,02INT 10HRETIOSET ENDPCOD ENDSEND START(五)程序调试(1)源代码输入后,无法顺利汇编成OBJ文件,首先检查程序,看是否存在字符输入错误或语法错误,并借助EMU8086 软件(版)检查,经过反复调试终于顺利汇编、连接成功。

(2)程序开始运行后,无法实现清屏幕,正确调用IOCLR清楚屏幕子程序后问题得以解决。

(3)走时不准确,由于本程序是利用计算机软件延时来实现计时的,时间快慢与计算机主频有关,计算机主频为,设置了两重循环,根据主频及延时程序大致计算延时的数值,并根据调试结果相应的更改数值大小。

(4)校时程序,自己编不出能校时的程序,引用网上查找到的一个中断代码,加入到程序中,可以实现时间调校。

(5)报时程序:一开始无从下手,通过分析产生报时的条件及时间,设置了一个FLAG 标志字,很好地解决了报时问题。

(六)运行结果(截图)(1)一般状态(2)半点报时(3)整点报时(七)体会首先,由于程序较长,寄存器运用时要注意不能重复,调用或中断程序时要注意使用PUSH和POP命令保存当前地址,运用堆栈来完成。

在调试过程中,我充分感受到了断点保护的重要性,有时不能想当然,犯经验主义的错误,要切实分析中断程序中是否使用了当前的寄存器,如果有一定要加以保护,否则很可能会出现程序的错误甚至导致系统崩溃。

在调试中就曾经出现过乱码现象,刚开始没有意识到是保护问题出现了差错,经过使用DEBUG程序才找到了问题的所在;还多次出现死机现象,大大影响了工作的效率。

相关主题