科技学院课程设计报告
(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
表格,数据: