1、微机原理课程设计报告li大学微机原理课程设计报告学院: 电气学院 班级: : 学号: 指导老师: 时间: 2014年1月15日 一课程设计目的:1.结合微型计算机原理课程的学习,进一步巩固已学的知识,同时针对计算机原理知识的具体应用,学会对系统中DOS和BIOS的使用。学会使用屏幕编辑程序EDIT,弄懂汇编程序的上级过程以及如何运用DEBUG软件进行汇编程序的调试。 2. 学会将课本上的理论知识和实际有机的结合起来,锻炼自己分析解决实际问题的能力。提高适应实际,实践编程的能力。 3. 为了进一步巩固学习的理论知识,增强学生对所学知识的实际应用能力和运用所学的知识解决实际问题的能力,开始为期两周
2、的课程设计。通过设计使学生在巩固所学知识的基础之上具有初步的单片机系统设计与应用能力。二课程设计容: 1.接受年、月、日信息并显示的设计 为掌握响铃使用方法,并掌握年、月、日输入方法。编写程序,先显示“WHAT IS THE DATA (MM/DD/YY)?”并响铃一次,然后接受键盘输入的月/日/年信息,并显示。2. 字符串匹配设计为掌握提示信息的设置方法及读取键入信息的方法,编写程序实现两个字符串比较,如相同则显示“MATCH”,否则显示“NO MATCH”。3.从键盘输入数据并显示的设计为掌握键盘接受数据的方法,并了解将键盘数据显示时必须转换为ASCII码的原理,编写程序,将键盘接受到的四
3、位十六进制数据转换为等值的二进制数显示。4.字符和数据的显示设计为掌握字符和和数据的显示方法。编写程序,先显示信息:INPUT STRING,THE END FLAG IS$,再接受字符。如为0-9,则计数器加1,并显示数据;如为非数字,则直接显示,但不计数。三典型题目举例:1接收年月日信息并显示的设计为掌握响铃使用方法,并掌握年、月、日输入方法。编写程序,先显示“WHAT IS THE DATA (MM/DD/YY)?”并响铃一次,然后接受键盘输入的月/日/年信息,并显示。流程图:分3次输入月、日、年 分3次显示月、日、年 程序代码及注释:DATA SEGMENT S1 DB WHAT IS
4、 THE DATA (MM/DD/YY)? ,0DH,0AH,$ ;显示字符串S2 DB MONTH,0DH,0AH,$ ;月字符串S3 DB DAY,0DH,0AH,$ ;日字符串S4 DB YEAR,0DH,0AH,$ ;年字符串S5 DB 4 ;存放接受的月 DB ? DB 4 DUP($)S6 DB 4 ;存放接受的日 DB ? DB 4 DUP($)S7 DB 6 ;存放接受的年 DB ? DB 6 DUP($)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA ;段寄存器初始化START:MOV AX,DATA MOV DS,AX MOV DX,
5、OFFSET S1 ;显示提示信息 MOV AH,9 INT 21H MOV DL,07H ;响铃一次 MOV AH,2 INT 21H MOV CX,0FFFH ;延迟,用外双重循环实现L1:PUSH CX MOV CX,0FFFFHL2: LOOP L2 POP CX LOOP L1 MOV DX,OFFSET S5 ;接受月数据,放入变量 MOV AH,0AH INT 21H MOV DX,OFFSET S6 ;接受日数据,放入变量 MOV AH,0AH INT 21H MOV DX,OFFSET S7 ;接受年数据,放入变量 MOV AH,0AH INT 21H MOV DL,0DH
6、;显示回车 MOV AH,2 INT 21H MOV DL,0AH ;显示换行 MOV AH,2 INT 21H MOV DX,OFFSET S5 ;显示月数据 ADD DX,2 MOV AH,9 INT 21H MOV DX,OFFSET S2 ;显示月字符 MOV AH,9 INT 21H MOV DX,OFFSET S6 ;显示日数据 ADD DX,2 MOV AH,9 INT 21H MOV DX,OFFSET S3 ;显示日字符 MOV AH,9 INT 21H MOV DX,OFFSET S7 ;显示年数据 ADD DX,2 MOV AH,9 INT 21H MOV DX,OFFS
7、ET S4 ;显示年字符 MOV AH,9 INT 21H MOV AH,4CH ;返回DOS INT 21HCODE ENDS END START结果截图:2字符串的匹配设计为掌握提示信息的设置方法及读取键入信息的方法。编写程序实现两个字符串比较。如相同,则显示“MATCH”,否则,显示“NO MATCH”。程序清单:CRLF MACRO ;显示回车 MOV DL,0DH MOV AH,02H INT 21H MOV AH,02H MOV DL,0AH INT 21H ENDMDATA SEGMENTMESS1 DB MATCH,0DH,0AH,$MESS2 DB NO MATCH,0DH,
8、0AH,$MESS3 DB INPUT STRING1!,0DH,0AH,$MESS4 DB INPUT STRING2!,0DH,0AH,$MAXLEN1 DB 100STRING1 DB 100 DUP(?)MAXLEN2 DB 100STRING2 DB 100 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AH,09H MOV DX,OFFSET MESS3 INT 21H ;显示提示信息1 MOV AL,MAXLEN1 MOV BX
9、,OFFSET STRING1 MOV BX,AL ;最大字符缓冲 MOV AH,0AH MOV DX,OFFSET STRING1 INT 21H ;接收键入的字符串1 CRLF MOV AH,09H MOV DX,OFFSET MESS4 INT 21H ;显示提示信息2 MOV AL,MAXLEN2 MOV BX,OFFSET STRING2 MOV BX,AL ;最大字符缓冲设置 MOV AH,0AH MOV DX,OFFSET STRING2 INT 21H ;接收键入的字符串2 CRLFCLD LEA SI,STRING1 ;字符串1的地址送给SI MOV CL,SI+1 ;字符串
10、1的字符数送给CX MOV CH,0BEING: LEA DI,STRING2 ;字符串2的地址送给DI MOV DL,DI+1 ;字符串2的字符数送给DX MOV DH,0J1: MOV AL,SI+2 ;字符串1的第一个字符在字符串2中匹配 CMP DI+2,AL JE J3 ;匹配成功则跳转J2: INC DI ;指向字符串2下一个字符 DEC DX JZ NOMAT ;字符串2完,不匹配 JMP J1 ;字符串2没完,重新匹配J3: DEC CX JZ MATCH ;字符串1完,匹配 DEC DX JZ NOMAT ;字符串2完,不匹配 INC SI ;指向串1下一个字符 INC DI
11、 ;指向串2下一个字符 MOV AL,SI+2 CMP DI+2,AL JE J3 ;匹配,跳转 DEC DX JZ NOMAT ;字符串2完,不匹配 LEA SI,STRING1 ;重新从串1的第一个字符匹配 MOV CL,SI+1 MOV CH,0 JMP J1MATCH: MOV AH,09H ;输出匹配信息 MOV DX,OFFSET MESS1 INT 21H JMP NEXTNOMAT: MOV AH,09H ;输出不匹配信息 MOV DX,OFFSET MESS2 INT 21H NEXT: MOV AH,4CH ;程序终止 INT 21HCODE ENDS END START
12、3从键盘输入数据并显示的数据为掌握接收键盘数据的方法,并了解将键盘数据显示时须转换为ASCII码的原理。编写程序,将键盘接收到的四位十六进制数据转换为等值的二进制数,再显示在终端上。程序清单:DATA SEGMENTMSG1 DB Hex:, $MSG2 DB 0DH, 0AH, Binary:, $COUNT EQU 4BUF DB 4 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX, DATAMOV DS, AXLEA DX, MSG1MOV AH, 9INT 21HMOV CX, COUNTMOV SI, 0I
13、NPUT:MOV AH, 1 ;通过四次循环从键盘读入四位十六进制数INT 21H MOV BUFSI, ALDEC CXINC SICMP CX, 0JNZ INPUTNEXT3: LEA DX, MSG2MOV AH, 9INT 21HMOV CX, COUNTMOV SI, 0NEXT2: MOV BL, BUFSICMP BL , 9 JBE OK ;读入的字符9 转向 OKSUB BL, 7 ;读入字符= 9 减7 OK: PUSH CX MOV CL ,4 SHL BL, CL ; 逻辑左移4位,低4位高4位MOV CX, 4 ; 4次循环将当前处理字符的4位二进制输出NEXT1:
14、 MOV DL, 0SHL BL, 1JNC SKIP INC DLSKIP: MOV AH, 2INT 21HLOOP NEXT1POP CX ;INC SILOOP NEXT2 ; 4次循环将4位十六进制数每位转换为对应的4位二进制EXIT: MOV AH, 4CHINT 21HCODE ENDSEND START4字符和数据的显示程序为掌握字符和数据的显示方法。编写程序,先显示信息:INPUT STRING,THE END FLAG IS$,再接收字符。如为0-9,则计数器加1,并显示数据;如为非数字,则直接显示,但不技计数。程序清单:CRLF MACRO MOV AH,02H MOV
15、DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21HENDM DATA SEGMENTMESS1 DB INPUT$MESS2 DB zifu zongshu= $MESS3 DB no zifu zongshu= $MESS4 DB shuzi zifu zongshu= $TOTAL DW ?DATA ENDSSTACK SEGMENTSTA DW 32 DUP (?)TOP DW ?STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATA MOV DS
16、,AX MOV ES,AX MOV SP,TOP ;初始化 MOV BX,0000H ;计数值清0 MOV AH,09H MOV DX,OFFSET MESS1 INT 21H CRLFXXX: MOV AH,01H INT 21H ;接收键入字符 CMP AL,20H JZ UUU ;是空格键则转UUU CMP AL,0DH JNZ III CRLF ;是回车键则转UUU JMP UUUIII: CMP AL,30H JB YYY CMP AL,39H JBE VVV ;0-9转VVVYYY: INC BX ;计数值加1VVV: INC TOTAL JMP XXXUUU: CRLF MOV
17、AH,09H LEA DX,MESS2 ;显示字符总数 INT 21H MOV AX,TOTAL CALL DISP MOV AH,02H MOV DL,H INT 21H CRLF ;回车换行 MOV AH,09H MOV DX,OFFSET MESS3 INT 21H ;显示非数字字符总数 MOV AX,BX CALL DISP MOV AH,02H MOV DL,H INT 21H ;十六进制数标志 CRLF MOV AH,09H LEA DX,MESS4 ;显示数字字符总数 INT 21H MOV AX,BX SUB TOTAL,AX MOV AX,TOTAL CALL DISP MO
18、V AH,02H MOV DL,H INT 21H MOV AX,4C00H INT 21HDISPP PROC NEAR ;显示子程序,显示AL中的数按十六进制数方式 MOV BL,AL ;AL中数送BLKKK: MOV DL,BL MOV CL,04 ROL DL,CL AND DL,0FH CALL DISPL ;显示字节高位 MOV DL,BL AND DL,0FH CALL DISPL ;显示字节低位 RETDISPP ENDPDISPL PROC NEAR ADD DL,30H ;由数值转为参应字符的ASCII码 CMP DL,3AH JB DDD ;是0-9转DDD ADD DL
19、,27H ;是A-FDDD: MOV AH,02H INT 21H ;显示DL中字符 RET ;返回DISPL ENDP ;显示子程序,显示AX中的数按十六进制数方式DISP PROC NEAR PUSH BX PUSH CX PUSH DX PUSH AX ;入栈保存 MOV AL,AH CALL DISPP ;显示高字节 POP AX CALL DISPP POP DX POP CX POP BX RET ;出栈DISP ENDPCODE ENDS END START四心得体会: 经过这次课程设计,跟加深了对汇编语言的理解和认识,尤其是DOS系统的功能调用。这次一共做了4道题目,每一道题都
20、有其难点之处。在做第二道题字符串匹配时就遇到了一些问题。字符串的比较命令需用到DS与ES两个段,而DOS的0A功能只能给DS段,所以还需用到字符串的传送指令,这一点一开始确实忽略了,所以花了不少时间。在做第三个键盘输入数据的设计时,总的思路是不断的比较,一致时再跳入显示环节。遇到的难题是由于JZ指令的跳转围是-128127B,而对于输入的数比较的次数较多,导致超出了围,于是用JMP作为中转,才能实现功能。对于第三道题字符和数据的显示设计,要注意的是由于从键盘上接受的数据是以字符串形式的,所以对于数字的统计需用其对应的ASCII码。对于第一个接受年月日并显示的设计,对年月日的接受还是以字符串的形式。 总的来说,这次课程设计让我复习了平时忽略的问题,更进一步掌握了DOS以及其他指令的功能调用。编程之前用框图有利于理清思路。对于编程思路,我还是坚持自顶向下的编程方法。这样可以思路清晰,知道已经做到了哪里。还有就是编程需要细心、耐心,或许编程的时候可能比较快,但调试的可能需要更多的时间、和耐心。对于调试的技巧我觉得对于找不出的问题,可以试着将程序分割成几个模块,单独编程进行调试。或许就能找出其中的问题。这次课程设计既动脑又动手,收获很多。五参考文献:1荣标,机械工业,微型计算机原理与接口技术 第二版2荣标,微型计算机原理课程设计指导书
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2