微机原理课程设计
设计报告
姓名: 朱文斋
班级: 自动化0902
学号: 3090502040
教师: 张荣标
2012 年 1月 5 日
一、目的:
结合微型计算机原理课程的学习,进一步巩固已学的知识,同时针对计算机原理知识的具体应用,学会对系统中DOS和BIOS的使用。学会使用屏幕编辑程序——EDIT,弄懂汇编程序的上级过程以及如何运用DEBUG软件进行汇编程序的调试。
二、内容与要求:
1、字符串匹配设计
为掌握提示信息的设置方法及读取键入信息的方法,编写程序实现两个字符串比较,如相同则显示“MATCH”,否则显示“NO MATCH”。
2、从键盘输入数据并显示的设计
为掌握键盘接受数据的方法,并了解将键盘数据显示时必须转换为ASCII码的原理,编写程序,将键盘接受到的四位十六进制数据转换为等值的二进制数显示。
3、字符和数据的显示设计
为掌握字符和数据的显示方法。编写程序,先显示信息:INPUT STRING,THE END FLAG IS $,再接收字符。如为0-9,则计数器加一,并显示数据;如为非数字,则直接显示,但不计数。
4、将键盘输入的小写字母转换成大写字母的设计
为了解小写字母和大写字母在计算机内的表示方法,并学习如何进行转换,编写程序,接受键盘字符,并将其中的小写字母转变为大写字母,然后显示在屏幕上。
5、学生成绩名次表设计
为进一步熟悉排序方法,编写程序,将100以内的30个成绩存入首址为1000H的存储区中。1000H+i表示学号为i的学生成绩。编写程序使得在2000H开始的区域排出名次表,2000H+i为学号i的学生的名次。
三、示例程序
下面着重介绍程序5——学生成绩名次表设计:
流程图:
主程序流程图 SCAN子函数程序流程图
程序代码及注释:
CRLF MACRO ;宏定义,回车换行
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
ENDM
DATA SEGMENT
STUNUM EQU 30 ;学生数
MESS1 DB 'Please input 30 score:',0DH,0AH,'$' ;提示信息
ERROR DB 'Input error,try again',0DH,0AH,'$' ;报错信息
MESS2 DB 'The order is:',0DH,0AH,'$'
EMARK DB ? ;报错标志
ORG 1000H ;存放成绩地址
SCORE DB 30 DUP(?) ;成绩表
ORG 2000H ;存放名次地址
SEQU DB 30 DUP(?) ;名次表
DATA ENDS
STACK SEGMENT
STA DW 32 DUP(?)
TOP DW ?
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV SP,TOP
MOV AH,09H ;显示提示信息
MOV DX,OFFSET MESS1
INT 21H
MOV SI,OFFSET SCORE ;成绩表首址
MOV CX,STUNUM
MOV EMARK,0 ;报错标志清0
UUU: CALL GETNUM ;调用子函数读取成绩
CMP EMARK,01H ;判断是否出错
JE START ;出错则重新开始
MOV [SI],DL ;没出错则存入成绩
INC SI ;指向下一个成绩单元地址
LOOP UUU ;判断30个成绩是否读取完
MOV CX,STUNUM
MOV DI,OFFSET SEQU ;名次表首址
VVV: CALL SCAN ;调用扫描子程序
MOV AL,STUNUM ;学生总数
SUB AL,CL ;计算名次
INC AL
MOV BX,DX ;学号
PUSH AX ;将名次转换成压缩BCD码方便显示
PUSH BX
PUSH CX
XOR AH,AH
MOV BH,0AH
DIV BH
MOV CL,4
SHL AL,CL
ADD AL,AH
MOV DH,AL
POP CX
POP BX
POP AX
MOV [DI+BX],DH ;存入名次
LOOP VVV ;判断是否存完
MOV AH,09H ;显示名次提示信息
LEA DX,MESS2
INT 21H
MOV CX,STUNUM
MOV SI,OFFSET SEQU
WWW: MOV AL,[SI]
CALL DISPI ;调用子函数显示名次
PUSH DX
PUSH AX
MOV AH,02 ;显示空格
MOV DL,20H
INT 21H
POP AX
POP DX
INC SI ;指向名次表的下一个地址
LOOP WWW ;判断是否输出所有名次
MOV AH,4CH ;返回DOS
INT 21H
SCAN PROC NEAR ;扫面子函数,每调用一遍,找出成绩表
;中最高成绩,记录其学号,并将此成绩
;清0
PUSH CX
MOV CX,STUNUM
MOV AL,00H
MOV BX,OFFSET SCORE
MOV SI,BX
CCC: CMP AL,[SI]
JAE JJJ
MOV AL,[SI]
MOV DX,SI
SUB DX,BX
JJJ: INC SI
LOOP CCC
ADD BX,DX
MOV BYTE PTR [BX],00H
POP CX
RET
SCAN ENDP
DISPI PROC NEAR ;显示子程序
PUSH CX
MOV BL,AL ;显示高4位
MOV DL,BL
MOV CL,04
ROL DL,CL
AND DL,0FH
CALL DISPL
MOV DL,BL ;显示低4位
AND DL,0FH
CALL DISPL
POP CX
RET
DISPI ENDP
DISPL PROC NEAR ;将名次转换成对应的ASCII码值并显示
ADD DL,30H
MOV AH,02H
INT 21H
RET
DISPL ENDP
GETNUM PROC NEAR ;读取成绩子函数
PUSH CX
XOR DX,DX ;清0,用于存放成绩
GGG: MOV AH,01H
INT 21H ;键盘字符输入
CMP AL,0DH
JZ RRR ;如果是回车则结束
SUB AL,30H
JB ERR ;小于0则报错
CMP AL,09H
JBE GETS ;如果在0—9之间则存成绩至DX
JMP ERR ;否则报错
GETS: MOV CL,04
SHL DX,CL ;将DX中已有数值左移四位
XOR AH,AH
ADD DX,AX ;紧接着将数据存在DX中低四位
JMP GGG ;跳转继续读取数据
ERR: MOV AH,09H ;显示报错信息
MOV DX,OFFSET ERROR
INT 21H
MOV EMARK,01H ;报错标志置1
RRR: PUSH DX
CRLF ;回车换行
POP DX
POP CX
RET
GETNUM ENDP
CODE ENDS
END START
四、心得体会:
做过很多课程设计,但完成了微机原理的课程设计后,我才感觉这门还是真正需要些技术含量的。需要我们同学深入的去思考,去学习查资料,我在这一周的时间里收获也是很大的,对汇编语言由略知皮毛到能运用它独立做一些小程序。这种技能都是课堂上学不到的,但对未来却有很大的帮助。当我面对一个难题,从一筹莫展到逐渐清晰明朗,调试调试再调试,而后最终完成任务。只有亲身经历过,才能感受其中的艰辛与快乐。更重要的是我们对汇编有了更进一步的理解。有了实际应用的体会,知识更加的融会贯通了。不管是从知识上还是从思维方式上,我们都得到了很大的进步。下面便是我在这一星期的实践中遇到的问题以及解决的过程。望给予评价
第一天的任务便是熟悉编程环境,掌握编程的步骤,然后编写一个范例小程序。当天便遇到了问题,怎样正确运用DOS的各个功能调用,因为课堂上讲的关于这方面的知识都很不系统,只是勉强记住其对应的功能而却不知道实际运用的方法。然后我就对照着书上的例子和指导书上的范例程序,把各个功能都调试运行了一遍。并且着重学习了一下经常用到的几个功能,像09号功能、0A号功能等。其中我发现了以前编程只知道往上写却不知道起作用的语句都在调试的过程中慢慢清晰了。这让我狠狠地高兴了一把。这天的内容很基础也很简单,但其却是为接下来的任务做铺垫的。
从第二天开始到第四天,我们便开始了课程设计的主体部分:设计程序。我们的任务共有十三个程序题,我们需从中选出5个进行汇编。刚开始时,我曾信誓旦旦的要把十三个全部做了,但后来发现工作量着实不小,于是我放弃了自己的想法,还是好好钻透五个程序,争取做得更好一点吧!我在设计过程中遇到了不少的麻烦,前面两天一直在做几个小程序,字符串匹配设计、从键盘输入数据并显示的设计、字符数据的显示设计、大小写字母转换的设计。其中做第一个时有一个很纠结的问题就是输入的第二个字符串如包含第一个字符串是,就算不一样还是会输出显示‘MATCH’。后来我请教了老师,知道需要对所有字符进行比较,第一个字符串的结束字符跟第二个字符串的对应字符比较近可以了。最后一天我便在编写一个稍微复杂一些的程序,便是上面这个程序:学生成绩名次表设计。因为我看到它几乎包含了前面程序里所有的要点,如:单字符、字符串的输入输出,回车换行实现合理的现实,寄存器保护,宏定义及子程序调用,循环嵌套等等。但是大程序自然会有很多麻烦的问题,以前上新课时我并没有仔细地研究过宏定义和子程序调用及功能调用,也没认真注意过条件跳转。程序大,跳转语句,功能调用语句的要求就很高。经过讨论和查资料,我知道了条件跳转的范围只能在-128---+127之间,而无条件跳转JMP却不受此约束。还有,回车是回到行首,换行是换到下一行的同列处;DOS功能调用的时候会改变寄存器AX的值,故需保护;利用堆栈保护(PUSH,POP)可实现寄存器释放再利用。后来又遇到了一个问题,为什么十六进制书转换为二进制显示字母部分为什么要减“37H”而不是“31H”。差不多就那么多问题吧。
两天的课程设计结束后,我总有种意犹未尽的感觉,感觉学的知识还是不足,汇编语言的博大精深,我还是无法很清楚的把握,但我相信本次课程设计会给我带来更大的学习动力,让我在以后的学习中更有一些方向感吧!
参考文献:
1.张荣标,机械工业出版社,《微型计算机原理与接口技术 第二版》
2.张荣标,《微型计算机原理课程设计指导书》
3.李干林,李升等,北京大学出版社《微机原理及接口技术试验指导书》
第二篇:微机原理课程设计报告2
《微机原理与接口技术》课程设计报告
一、课程设计题目:数字控制系统在加热器中的应用
1)设计内容
当把物品放入加热器中,首先要启动加热器和电机工作,设定加热时间为3
(5)分钟,为使物品均匀加热,每隔20(30)秒电机要反转一次,(正转→反转、反转→正转),加热时间到后,停止加热器和电机工作,并发声,告知加热结束。
2)设计提示
① 注意加热器和电机起停,正反转的规律;
② 用8253控制时间;用8255完成起停加热器,起停电机及电机正、反转,发声报告的控制;用8259A管理可屏蔽中断。
3)设计及报告要求
① 写出设计思路;
② 画硬件线路图;
③ 画程序流程图,并用8086/8088汇编语言完成全部程序的设计,要有适当的注释;
④ 写出设计认识,包括心得、不足之处和应注意的问题;
⑤ 列写相关参考文献。
二、设计思路:
1、 首先分析设计所用到的芯片的原理及使用方法:
⑴8259A的使用方法:
8259A的命令共有7个,一类是初始化命令字,另一类是操作 命令。8259A的编程就是根据应用需要将初始化命令字ICW1-ICW4 和操作命令字OCW1- OCW3分别写入初始化命令寄存器组和操作 命令寄存器组。ICW1-ICW4各命令字格式如图11-2所示,
OCW1-OCW3各命令字格式如图11-3所示,其中OCW1用于设置中 断屏蔽操作字,OCW2用于设置优先级循环方式和中断结束方式的8 操作命令字,OCW3用于设置和撤销特殊屏蔽方式、设置中断查询 方式以及设置对8259内部寄存器的读出命令。
⑵8255的使用方法:
方式0 — 基本输入/出方式;
方式1 — 选通输入/出方式;
方式2 — 双向选通工作方式。
⑶8253的使用方法:
(1) 方式0:计数到0结束输出正跃变信号方式。
(2) 方式1:硬件可重触发单稳方式。
(3) 方式2:频率发生器方式。
(4) 方式3:方波发生器。
(5) 方式4:软件触发选通方式。
(6) 方式5:硬件触发选通方式。
2、通过分析控制系统所要求实现的功能,综合考虑各芯片的功能,决定各芯片在系统中所起的作用,以及它们之间的组合方式,大体上画出系统的框架图,然后对框架图的细节部分进行填充。
3、画程序流程图:结合各芯片的使用方法、系统的功能要求画出程序的实现过程。
4、编写代码
5、调试试运行
6、修改并系统最终定型
设计题目中的加热器控制系统,由CPU、8259A、8253、8255四个芯片组成,使用8255的A口输出,PA0、PA1、PA2、PA3分别控制加热器的起停、电机的起停、电机的正反转、发声报告。8259A的输出与系统的INTR相连用于提供中断申请,8253的OUT0与8259A的IR0相连用于提供中断信号。由CPU协调控制其它三个芯片的工作,由8253提供计时功能,输入系统时钟信号,计数器0输出周期为50毫秒的方波,即每隔50毫秒,8255向8259提供一个中断脉冲,通过对CX、SI的设置循环判断,每20秒对8255的A口的PA2进行数据改变,即电机反转一次,当到达加热时间,通过写8255的A口的数据,实现电机和加热器的停止工作,警告报告。
三、硬件线路图:
8253的输入时钟频率为系统时钟频率1.1932MHZ
四、程序流程图
程序代码:
DATA SEGMENT
INTR_IVADD EQU 01CCH ;INTR对应的中断矢量地址
INTR_OCW1 EQU 0A1H ;INTR对应PC机内部8259的OCW1地址 INTR_OCW2 EQU 0A0H ;INTR对应PC机内部8259的OCW2地址 INTR_IM EQU 0F7H ;INTR对应的中断屏蔽字
PCI_INTCSR EQU 9438H ;PCI卡中断控制寄存器地址
IOY0 EQU 9C00H ;片选IOY0对应的端口始地址
MY8259_ICW1 EQU IOY0+00H ;实验系统中8259的ICW1端口地址 MY8259_ICW2 EQU IOY0+04H ;实验系统中8259的ICW2端口地址 MY8259_ICW3 EQU IOY0+04H ;实验系统中8259的ICW3端口地址 MY8259_ICW4 EQU IOY0+04H ;实验系统中8259的ICW4端口地址 MY8259_OCW1 EQU IOY0+04H ;实验系统中8259的OCW1端口地址 MY8259_OCW2 EQU IOY0+00H ;实验系统中8259的OCW2端口地址 MY8259_OCW3 EQU IOY0+00H ;实验系统中8259的OCW3端口地址
MY8255_A EQU IOY0+00H*4 ;8255的A口地址
MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址
MY8253_COUNT0 EQU IOY0+00H*4 ;8253的计数器0端口地址 MY8253_COUNT2 EQU IOY0+02H*4 ;8253的计数器2端口地址 MY8253_MODE EQU IOY0+03H*4 ;8253的控制寄存器地址
MES DB 'Press any key to exit!',0AH,0DH,0AH,0DH,'$'
CS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量 IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量 IM_BAK DB ? ;保存INTR原中断屏蔽字的变量
DATA ENDS
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MES ;显示退出提示
MOV AH,09H
INT 21H
CLI
MOV DX,PCI_INTCSR
SUB DX,19H
IN AL,DX
MOV DX,PCI_INTCSR ;初始化PCI卡中断控制寄存器
MOV AX,1F00H ;向PCI_INTCSR中写入003F1F00H
OUT DX,AX
ADD DX,2
MOV AX,003FH
OUT DX,AX
MOV AX,0000H ;替换INTR的中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,ES:[DI]
MOV IP_BAK,AX ;保存INTR原中断处理程序入口偏移地址
MOV AX,OFFSET MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口偏移地址
ADD DI,2
MOV AX,ES:[DI]
MOV CS_BAK,AX ;保存INTR原中断处理程序入口段地址
MOV AX,SEG MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口段地址
MOV DX,INTR_OCW1 ;设置中断屏蔽寄存器,打开INTR的屏蔽位 IN AL,DX
MOV IM_BAK,AL ;保存INTR原中断屏蔽字
AND AL,INTR_IM
OUT DX,AL
MOV DX,MY8259_ICW1 ;初始化实验系统中8259的ICW1 MOV AL,13H ;边沿触发、单片8259、需要ICW4
OUT DX,AL
MOV DX,MY8259_ICW2 ;初始化实验系统中8259的ICW2 MOV AL,08H
OUT DX,AL
MOV DX,MY8259_ICW4 ;初始化实验系统中8259的ICW4 MOV AL,01H ;非自动结束EOI
OUT DX,AL
MOV DX,MY8259_OCW1 ;初始化实验系统中8259的OCW1 MOV AL,0FEH ;打开IR0的屏蔽位
OUT DX,AL
MOV DX,MY8255_MODE ;定义8255工作方式
MOV AL,80H ;工作方式0,A口为输出
OUT DX,AL
MOV
MOV
OUT
MOV
MOV
OUT
MOV
MOV
OUT
MOV
OUT
MOV
MOV
STI
WAIT1: MOV
INT
JZ
QUIT: CLI
MOV
MOV
OUT
MOV
MOV
MOV DX,MY8255_A ;写A口发出的起始数据 AL,07H DX,AL DX,MY8253_MODE ;定义8253工作方式 AL,36H ;工作方式3,计数器0 DX,AL DX,MY8253_COUNT0 AL,9CH ;送计数初值,产生周期50ms的方波 DX,AL AL,2EH DX,AL CX,600 SI,6000 AH,1 ;判断是否有按键按下 16H WAIT1 ;无按键则跳回继续等待,有则退出 DX,PCI_INTCSR ;恢复PCI卡中断控制寄存器 AX,0000H DX,AX AX,0000H ;恢复INTR原中断矢量 ES,AX DI,INTR_IVADD
MOV AX,IP_BAK ;恢复INTR原中断处理程序入口偏移地址
MOV ES:[DI],AX
ADD DI,2
MOV AX,CS_BAK ;恢复INTR原中断处理程序入口段地址
MOV ES:[DI],AX
MOV DX,INTR_OCW1 ;恢复INTR原中断屏蔽寄存器的屏蔽字 MOV AL,IM_BAK
OUT DX,AL
STI
MOV
INT
MYISR PROC
QUERY: MOV
MOV
OUT
IN
TEST
JZ
DEC
DEC
CMP
JZ
CMP
JNZ
MOV
IN
AND
CMP
JE
JNE
STOP: MOV
MOV
OUT
CALL
DELAY: LOOP
DEC
JNZ
CALL AX,4C00H ;返回到DOS 21H NEAR ;中断处理程序MYISR DX,MY8259_OCW3 ;向8259的OCW3发送查询命令 AL,0CH DX,AL AL,DX ;读出查询字 AL,80H ;判断中断是否已响应 QUERY ;没有响应则继续查询 CX SI SI,0 STOP CX,0 EOI DX,MY8255_A AL,DX AL,04H AL,00H FZ1 FZ2 DX,MY8255_A AL,08H DX,AL SPEAKER DELAY BX DELAY SPEAKOFF
JMP EOI
SPEAKER PROC ;扬声器子程 MOV AX,0533H
PUSH AX
MOV BX,1
MOV DX,MY8253_MODE MOV AL,0B6H
OUT DX,AL ;写入控制字 POP AX
MOV
OUT
MOV
OUT
RET
SPEAKER ENDP
SPEAKOFF PROC
MOV
MOV
OUT
RET
SPEAKOFF ENDP
FZ1: MOV
MOV
OUT
MOV
JMP
FZ2: MOV
MOV
OUT
MOV
JMP
EOI: MOV
MOV
OUT
OVER: MOV
SUB
IN
MOV DX,MY8253_COUNT2 DX,AL ;写入低8位计数值 AL,AH DX,AL ;写入高8位计数值 DX,MY8255_A AL,00H DX,AL DX,MY8255_A AL,07H DX,AL CX,600 EOI DX,MY8255_A AL,03H DX,AL CX,600 EOI DX,MY8259_OCW2 ;向实验系统中8259发送中断结束命令 AL,20H DX,AL DX,PCI_INTCSR DX,19H AL,DX DX,PCI_INTCSR ;清PCI卡中断控制寄存器标志位
ADD DX,2
MOV AX,003FH
OUT DX,AX
MOV DX,INTR_OCW2 ;向PC机内部8259发送中断结束命令 MOV AL,20H
OUT DX,AL
MOV AL,20H
OUT 20H,AL
IRET
MYISR ENDP
CODE ENDS
END START
五、设计心得
六、参考文献
《微机原理与应用》王忠民 西安电子科技大学出版社