科技学院课程设计报告

(2010–20xx年度第一学期)

名 称: 微机原理与接口技术

题 目: 院 系: 动力系自动化专业

班 级: 08K2

学 号:

学生姓名: 指导教师: 设计周数: 1 周

成 绩:

日期: 2011 年 1 月 7日

微机原理课程设计报告

《微机原理及应用》课程设计

任 务 书

一、 目的与要求

1. 通过对微机系统分析和具体设计,使学生加深对所学课程的理解。

2. 掌握汇编语言程序设计的基本方法和典型接口电路的基本设计方法。

3. 培养学生分析问题、解决问题的能力。

4. 培养学生对微型计算机应用系统的基本设计能力。

5. 提高学生的实践动手能力和创新能力。

二、 主要内容

1. A.字符串压缩程序;B.显示姓名字样的程序。

2. 针对所选择的设计题目进行硬件设计,合理选用所需元器件,绘制系统结构框图、硬件接线图,并在实验系统上完成电路的连接和调试。

3. 根据所选题目的要求对微机系统进行程序设计,绘制程序总体流程图并编写源程序上机调试。

4. 写出课程设计报告,对整个设计过程进行归纳和综合,对设计中所存在的问题和不足进行分析和总结,提出解决的方法、措施、建议和对这次设计实践的认识和收获。

三、 进度计划

微机原理课程设计报告

四、 设计成果要求

1. 系统硬件设计合理,软件编程达到设计要求。

2. 系统硬件结构图和软件流程图绘制清楚规范。

3. 设计报告完整规范。

五、 考核方式

根据设计任务的完成情况、课程设计报告撰写情况及演示答辩情况采用五级记分制评定成绩。 学生姓名:

指导教师: 年 月 日

一、课程设计目的与要求

1. 通过对微机系统分析和具体设计,使学生加深对所学课程的理解。

2. 掌握汇编语言程序设计的基本方法和典型接口电路的基本设计方法。

3. 培养学生分析问题、解决问题的能力。

4. 培养学生对微型计算机应用系统的基本设计能力。

5. 提高学生的实践动手能力和创新能力

二、课程设计正文

A.字符串压缩程序

1.实验题目:在数据段中有一个数据区,该存储区中存有若干个字节数据,存储的是10个阿拉伯数 字字符。要求编写程序实现数据串的压缩,具体目的是:

1.1对于连续出现的数字字符压缩成3个字节,第一个字节存储E5H,第二个字节存储该字符的值, 第三个字节存储这个字符出现的次数。

1.2字符仅连续出现一次,则不压缩,直接放在压缩数据区中相应的位置。

1.3开辟新的数据缓存区存放压缩后的数据。

2.设计思路

2.1选择合适的算法,搜索字符串,并能计算出字符出现的次数

2.2确定寻找字符串使用的指令

2.3确定操作过程中使用的数据指针

2.4确定双重循环程序的结构

3.小组成员分工:编写源程序(赵亮)

添加注释 (赵亮)

上机调试 (尹幸)

报告完成 ( 赵亮 尹幸)

4.试验程序流程图

微机原理课程设计报告

5.程序源文件

DATA1 SEGMENT

BUF DB ‘11111111111111111111111111111111111111111111’ CN EQU $-BUF

SEC DB CN DUP(?)

DATA1 ENDS

DATA2 SEGMENT

DATA2 ENDS

STACK SEGMENT

DB 100 DUP (?)

STACK ENDS

CODE SEGMENT

MAIN PROC FAR

ASSUME CS:CODE,DS:DATA1,SS:STACK,ES:DATA2

START: MOV AX,DATA1

MOV DS,AX

MOV AX,DATA2

MOV ES,AX

MOV CX,CN

MOV DI,OFFSET BUF

MOV SI,OFFSET SEC

CLD

LP1: MOV AL,[DI]

INC DI

MOV BX,CX

REPZ SCASB

SUB BX,CX

CMP BX,1

JZ NEXT

MOV DL,0E5H

MOV [SI],DL

INC SI

MOV [SI],AL

INC SI

MOV [SI],BL

INC SI

JMP EXIT

NEXT: MOV [SI],AL

EXIT: DEC DI

CMP CX,0

JNZ LP1

MOV AH,4CH

INT 21H

CODE ENDS

END START

B.显示姓名字样的程序

1.方案比较及认证说明

仔细分析设计内容及要求可以找到两种基本的方法,第一种方法为:利用坐标的方法,第二种方法为:利用文本的方法即利用汉字取模软件对姓名进行数字编码,笔画经过的方格用1表示,没有经过的方格用0表示,然后逐列逐行的进行扫描,最终显示出自己的姓名。

仔细分析这两种方法可以看出第一种方法比较好,也比较容易实现,因为第二种方法较复杂,自己姓名的汉字的笔画比较多,无法应用循环的方法使程序简化,这样会给编程带来巨大的困难和麻烦。而第一种方法就可以应用循环的方法,它的每一列每一行都是相同的,在编程的时候只改变一些变量就可以了,这样可以大大减少工作量而且程序也比较清晰易懂。

2.系统原理阐述

2.1编写一个主程序和若干个子程序(延时子程序、提示信息子程序、清屏子程序、显示姓名子程序)来完成设计任务所要求的功能,主程序完成的功能为:首先要确定初始时刻的光标位置,然后在该位置处分别调用提示信息子程序和显示姓名子程序,为了使我们能够看到自己的名字必须调用延时子程序以增加显示的时间,然后清屏,再次调用提示信息子程序和显示姓名子程序,每循环一次显示姓名子程序的光标位置必须增加一行。延时子程序的原理为通过设计循环来增加程序执行的次数,从而达到增加时间的目的,提示信息子程序的原理为通过int 21h的09h功能来完成提示信息的显示,每清完一次屏必须马上调用提示信息子程序,这样才可以使提示信息总是显示在那里,清屏子程序的原理为通过int 10h的06h的屏幕上卷功能来完成清屏通过AL可以设计一次清屏的行数。

2.2软件思想:

根据设计任务及要求,可以得到汇编语言的基本思想为编写一个主程序和若干个子程序,各子程序分别为:延时子程序、提示信息子程序、清屏子程序、显示姓名子程序,在程序运行时用主程序分别调用各个子程序,即可完成汇编语言程序的编制。

3.小组成员分工:编写源程序(尹幸)

添加注释,流程图(尹幸 赵亮)

上机调试(尹幸)

编写报告(赵亮)

4.流程图

微机原理课程设计报告

图1 软件流程图

5.主程序及其功能说明

data segment

car db 146 db 03h,156,0,0 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,4,-8 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,4,-8 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,0 db 03h,156,0,0 db 03h,156,0,0 db 03h,156,0,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,15,-12 db 03h,156,-1,3 db 03h,156,-1,2

db 03h,156,-1,2 db 03h,156,-1,1 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,160,0,10 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,3,-8 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,1,-8 db 03h,160,1,1 db 03h,160,1,1 db 03h,160,-2,4 db 03h,160,1,-1 db 03h,160,1,-1 db 03h,160,1,-4 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,2,-8 db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,-10,-5

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,4,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

char_cnt dw ?

pointer dw ?

line_on db ?

col_on db ?

data ends

stack segment

db 2000 dup (0)

stack ends

code segment

assume cs:code,ds:data

main proc far

push ds

sub ax,ax

push ax

mov ax,data ;初始化DS

mov ds,ax

mov ah,0 ;设置300*200彩色图形方式 mov al,3

int 10h

mov ah,0bh ;设置背景颜色

mov bh,0

mov bl,2

int 10h

mov ah,0bh ;设置彩色调板

mov bh,01

mov bl,00

int 10h

call clear_screen ;清屏

lea di,car ;di指向字符图形表

mov dh,5 ;从第5行第5列位置开始

mov dl,5

call move_shape

mov ah,01h ;从键盘输入字符

int 21h

cmp al,0dh

je exit

exit:mov ah,4ch

int 21h

ret

main endp

此程序为整个程序的主程序在数据段通过,在运行时通过分别调用各个子程序(延时子程序、提示信息子程序、清屏子程序、显示汉字子程序)来完成设计任务的功能,在程序执行过程中首先调用提示信息子程序和显示姓名子程序,为了使汉字在屏幕上从左往右逐渐显示必须调用清屏子程序,然后使光标往下移动,然后在调用提示信息子程序和显示姓名子程序,并判断是否有Q输入,如果有则终止程序,如果没有则继续循环程序的执行,一直到光标位置到达屏幕底部。

5.1延时子程序及其功能说明

dly_qrtr proc near ;延时子程序

push cx

push dx

mov dx,50000

d11:mov cx,8000

d12:loop d12

dec dx

jnz d11

pop dx

pop cx

ret

dly_qrtr endp

code ends

end main

此子程序为延迟子程序,实现延迟是通过在此子程序执行过程中通过增加循环的次数来增加程序执行的时间,从而达到延迟的目的,改变此子程序的循环次数可以改变延迟时间的长短,从而可以改变姓名的出现速度的快慢。

5.2擦除子程序及其功能说明

erase proc near ;擦除子程序 mov cx,char_cnt

mov di,pointer

mov dh,line_on

mov dl,col_on

erase_next:

add dh,[di+2]

add dl,[di+3]

mov ah,2

int 10h

mov al,[di]

mov bl,0

push cx

mov cx,1

mov ah,9

int 10h

pop cx

add di,4

loop erase_next

mov cx,char_cnt

mov di,pointer

mov dh,line_on

inc col_on

mov dl,col_on

ret

erase endp

此程序为擦除子程序。

5.3清屏子程序及其功能说明

clear_screen proc near ;清屏子程序 push ax ;保护寄存器 push bx

push cx

push dx

mov ah,6 ;屏幕上卷功能 mov al,6

mov ch,0 ;左上角行号 mov cl,0 ;左上角列号 mov dh,250 ;右下角行号 mov dl,200 ;右下角列号 mov bh,7 ;卷入行属性 int 10h ;调用显示功能 pop dx ;恢复寄存器 pop cx

pop bx

pop ax

ret

clear_screen endp

此程序为清屏子程序,通过调用int 10h 06号屏幕上卷功能来达到清屏的目的,通过设置设置上卷的行数及其属性可以改变屏幕的显示状态。

5.4返回主程序

move_shape proc near ;返回主程序

push ax

push bx

push cx

push dx

push di

mov ah,0fh ;

int 10h

sub ch,ch ;

mov cl,[di] ;CL

inc di ;di

mov char_cnt,cx ;

mov pointer,di

mov line_on,dh

mov col_on,dl

plot_next:

add dh,[di+2] ;

add dl,[di+3]

cmp dl,150 ;

jb mov_crsr

call erase

pop di

pop dx

pop cx

pop bx

pop ax

ret

mov_crsr:

mov ah,2 ;

int 10h

mov al,[di]

mov bl,[di+1] ;

push cx

mov cx,1

mov ah,09 ;

int 10h 取当前显示方式 清除寄存器CX的高字节 放循环次数 指向字符表的第一个字符 保存循环次数 改变行列指针 出屏否? 移动光标位置 取字符值及属性 显示字符

pop cx

add di,4 ;di指向下一个字符

loop plot_next

call dly_qrtr ;调用延时子程序

call erase ;调用擦除子程序

jmp short plot_next

move_shape endp

此程序为显示姓名的返回程序,通过循环和指针编程,这样如此循环的执行,一直到光标到达屏幕的底部,即可完成姓名的显示过程。

三、课程设计总结

通过这次课程设计使我更深刻的理解并掌握了《微机原理及应用》这门课程,遇到问题时经过查阅资料,使问题得到解决,培养了自己搜索信息的能力,并从中掌握了大量的课外知识,在课程设计当中遇到了许多问题,自己认真的思考并查阅相关的资料,使问题得到了解决,虽然在这当中遇到了许多困难,但从中也锻炼了自己,在和自己的同学商量问题的时候培养了自己的团队精神,使我更深刻的理解了团队的力量,经过自己的努力完成了任务,对汇编语言也有了更深的了解。

在课程设计过程中,我们遇到了很多困难,在指导老师的耐心指导下,我们克服了困难,在这我们要感谢我们的指导老师。经过这周的课程设计我们不仅学会了很多知识,同时还锻炼了团队的协作能力,一个团队的协作能力很重要,这为我们今后的学习,工作打下了坚实的基础。

四、参考文献

【1】周佩玲等.《微机原理与接口技术》(基于16位机).北京:电子工业出版社,2005

【2】姚燕南.《微型计算机原理与接口技术》.北京:高等教育出版社,2004

【3】邹逢兴.《计算机硬件技术及应用基础.下册:接口与应用》.北京:国防科技大学出版社,2001

【4】刘乐善.《微型计算机接口技术及应用》.武汉:华中科技大学出版社2000

【5】沈美明、温冬婵.《IBM PC汇编语言程序设计》.北京:清华大学出版社2001

附录(设计流程图、程序、表格、数据等)

A.字符串压缩:

流程图:

微机原理课程设计报告

源程序:

DATA1 SEGMENT

BUF DB ‘11111111111111111111111111111111111111111111’ CN EQU $-BUF

SEC DB CN DUP(?)

DATA1 ENDS

DATA2 SEGMENT

DATA2 ENDS

STACK SEGMENT

DB 100 DUP (?)

STACK ENDS

CODE SEGMENT

MAIN PROC FAR

ASSUME CS:CODE,DS:DATA1,SS:STACK,ES:DATA2

START: MOV AX,DATA1

MOV DS,AX

MOV AX,DATA2

MOV ES,AX

MOV CX,CN

MOV DI,OFFSET BUF

MOV SI,OFFSET SEC

CLD

LP1: MOV AL,[DI]

INC DI

MOV BX,CX

REPZ SCASB

SUB BX,CX

CMP BX,1

JZ NEXT

MOV DL,0E5H

MOV [SI],DL

INC SI

MOV [SI],AL

INC SI

MOV [SI],BL

INC SI

JMP EXIT

NEXT: MOV [SI],AL

EXIT: DEC DI

CMP CX,0

JNZ LP1

MOV AH,4CH

INT 21H

CODE ENDS

END START

表格,数据:

微机原理课程设计报告

B.显示姓名字样的程序

流程图:

微机原理课程设计报告

源程序:

data segment

car db 146 db 03h,156,0,0 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,4,-8 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,4,-8 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,1 db 03h,156,0,0 db 03h,156,0,0 db 03h,156,0,0 db 03h,156,0,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,15,-12 db 03h,156,-1,3 db 03h,156,-1,2 db 03h,156,-1,2 db 03h,156,-1,1

db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,156,-1,0 db 03h,160,0,10 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,3,-8 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,1,-8 db 03h,160,1,1 db 03h,160,1,1 db 03h,160,-2,4 db 03h,160,1,-1 db 03h,160,1,-1 db 03h,160,1,-4 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,2,-8 db 03h,160,0,1 db 03h,160,0,1 db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,0,1

db 03h,160,-10,-5

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,4,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

db 03h,160,1,0

char_cnt dw ?

pointer dw ?

line_on db ?

col_on db ?

data ends

stack segment

db 2000 dup (0)

stack ends

code segment

assume cs:code,ds:data

main proc far

push ds

sub ax,ax

push ax

mov ax,data ;初始化DS

mov ds,ax

mov ah,0 ;设置300*200彩色图形方式 mov al,3

int 10h

mov ah,0bh ;设置背景颜色

mov bh,0

mov bl,2

int 10h

mov ah,0bh ;设置彩色调板

mov bh,01

mov bl,00

int 10h

call clear_screen ;清屏

lea di,car ;di指向字符图形表

mov dh,5 ;从第5行第5列位置开始 mov dl,5 ;显示汽车

call move_shape

mov ah,01h ;从键盘输入字符

int 21h

cmp al,0dh

je exit

exit:mov ah,4ch

int 21h

ret

main endp

clear_screen proc near ;清屏子程序 push ax ;保护寄存器

push bx

push cx

push dx

mov ah,6 ;屏幕上卷功能

mov al,6

mov ch,0 ;左上角行号

mov cl,0 ;左上角列号

mov dh,250 ;右下角行号

mov dl,200 ;右下角列号

mov bh,7 ;卷入行属性

int 10h ;调用显示功能

pop dx ;恢复寄存器

pop cx

pop bx

pop ax

ret

clear_screen endp

move_shape proc near ;返回主程序

push ax

push bx

push cx

push dx

push di

mov ah,0fh ;取当前显示方式

int 10h

sub ch,ch ;清除寄存器CX的高字节 mov cl,[di] ;CL放循环次数

inc di ;di指向字符表的第一个字符 mov char_cnt,cx ;保存循环次数

mov pointer,di

mov line_on,dh

mov col_on,dl

plot_next:

add dh,[di+2] ;改变行列指针 add dl,[di+3]

cmp dl,150 ;出屏否?

jb mov_crsr

call erase

pop di

pop dx

pop cx

pop bx

pop ax

ret

mov_crsr:

mov ah,2 ;

int 10h

mov al,[di]

mov bl,[di+1] ;

push cx

mov cx,1

mov ah,09 ;

int 10h

pop cx

add di,4 ;di

loop plot_next

call dly_qrtr ;

call erase ;

jmp short plot_next

move_shape endp

erase proc near ;

mov cx,char_cnt

mov di,pointer

mov dh,line_on

mov dl,col_on

erase_next:

add dh,[di+2]

add dl,[di+3]

mov ah,2

int 10h

mov al,[di]

mov bl,0

push cx

mov cx,1 移动光标位置 取字符值及属性 显示字符 指向下一个字符调用延时子程序 调用擦除子程序 擦除子程序

mov ah,9

int 10h

pop cx

add di,4

loop erase_next

mov cx,char_cnt

mov di,pointer

mov dh,line_on

inc col_on

mov dl,col_on

ret

erase endp

dly_qrtr proc near ;延时子程序

push cx

push dx

mov dx,50000

d11:mov cx,8000

d12:loop d12

dec dx

jnz d11

pop dx

pop cx

ret

dly_qrtr endp

code ends

end main

表格,数据:

微机原理课程设计报告

类似文章