微机原理与接口实验报告

《微机原理与接口实验》实验报告

第一部分 软件实验

实验一、实验二

1. 实验目的:熟悉软件环境,能够在Dos系统下编写汇编语言程序和汇编的全过程。

2. 实验内容:DOS环境下汇编的快速入门

3. 实验步骤:

C:\D:〈Enter〉建议大家的文件都建立在最后一个盘,如D盘,如果建在C:, 1)进入DOS环境(启动菜单中选择),然后进入最后一个盘中,如D盘: 计算机重启后会被系统自动删除。

3)编辑汇编源文件:d:\Edit xxx.asm

4)编译:d:\Tasm xxx.asm

5)链接:D:\tlink xxx.obj

6)运行.exe:D:\xxx.exe

7)调试:D:\TD xxx.exe

4. 实验代码:在屏幕上显示Hello World!

Stack segment stack

Dw 32 dup(0)

Stack ends

Data

Data

Code

Begin segment OBUF DB ‘Hello World! $’ endp segment Assume ss:stack,ds:data,cs:code proc far

Push ds

Sub ax,ax

Push ax

Mov ax,data

Mov ds,ax

MOV DX,OFFSET OBUF

MOV AH,9

INT 21H

Ret

Begin endp

Code ends 2)运行鼠标驱动程序D:\mouse

End begin

5. 实验结果:屏幕上显示‘Hello World !’

6. 上机试题

1)从键盘输入一个2位无符号的16进制数(00H~FFH),然后在显示器上同时以二 进制和十进制形式显示出来。例如:

Please input N(00H-FFH): 9B N = 9Bh = 10011011B = 155

segment stack dw 32 dup(0) ends segment DB 0DH,0AH,'$'

DB 3,0,3 DUP(0)

DB 10 DUP('$')

DB 4 DUP('$')

DB 'N = $'

DB ' = $' ;回车换行 实验代码: stack data ENDL stack IBUF_HEX OBUF_BIN OBUF_BCD STR_OUT1 STR_OUT2

data

code segment

begin proc far

STR_IN_HEX DB 'Please input N (00H~FFH):$' ends assume ss:stack, cs:code, ds:data push ds sub ax,ax push ax ;保存psp地址 mov ax,data mov ds,ax MOV DX,OFFSET STR_IN_HEX ;提示用户输入十六进制数,如9B MOV AH,9 INT 21H MOV AH,10 MOV DX,OFFSET IBUF_HEX ;接收输入的十六进制数

INT 21H MOV DX,OFFSET ENDL ;回车换行 MOV AH,9 INT 21H MOV AH,9 INT 21H MOV SI,OFFSET IBUF_HEX+2 MOV CL,IBUF_HEX+1 MOV CH,0 ;保存字符串的首地址 ADD POP SI MOV DX,SI MOV AH,9 INT 21H MOV DL,'H' MOV AH,2 INT 21H MOV DX,OFFSET STR_OUT2 MOV AH,9 INT 21H CALL hex2bin; 调用子函数,将输入的十六进制数转为二进制值 PUSH AX ;AL压栈,留给指令CALL bcdout使用 ;输出' = ' CALL binout ;把AL二进制值按二进制格式输出 MOV DX,OFFSET STR_OUT2 MOV AH,9 INT 21H POP AX CALL bcdout ;把AL二进制值按十进制格式输出 MOV DX,OFFSET ENDL MOV AH,9 INT 21H ret ;回车换行 ;输出' = ' ;输出输入的十六进制数,如9BH SI,CX ;输出'N = ' MOV DX,OFFSET STR_OUT1 PUSH SI MOV BYTE PTR [SI],'$' ;在输入的字符串末尾加上结束符 begin endp

;十六进制数--->二进制数 如:

输入:FF hex2bin proc 处理:AL=FFH ;保存输入字符个数 MOV CL,IBUF_HEX+1 MOV CH,0 MOV SI,OFFSET IBUF_HEX+2 MOV AX,0 MOV DL,16 MUL DL MOV BL,[SI] CMP BL,'A' JB hex2bin_SMALLER SUB BL,07H ;乘数为16 hex2bin_AGAIN: 乘积保存在AX中 hex2bin_SMALLER: SUB BL,30H

binout

INC DI LOOP binout_NEXT ;cx值为8,循环8次 ;输出处理结果 MOV DX,OFFSET OBUF_BIN MOV AH,9 INT 21H proc ; ;二进制数 --->二进制格式输出 ;设置LOOP循环次数 MOV BYTE PTR OBUF_BIN+8,'B' MOV DI,OFFSET OBUF_BIN MOV AH,0 MOV CX,8 MOV DL,0 SHL AL,1 ADC DL,30H MOV [DI],DL ;将每一位转为ASCII码 ;保存转换后的ASCII码 ADD AL,BL INC SI LOOP hex2bin_AGAIN ret endp hex2bin binout_NEXT:

ret endp

;返回调用

binout bcdout

proc ;二进制数 MOV AH,0 MOV CX,10 MOV DX,0 DIV CX ADD DL,30H MOV [DI],DL DEC DI OR AX,AX

JNE bcdout_AGAIN INC DI MOV DX,DI MOV AH,9 ret endp ends

begin

--->十进制数输出

MOV DI,OFFSET OBUF_BCD+2

bcdout_AGAIN:

;无符号数16位扩展为32位 ;余数DX,商AX

INT 21H bcdout code

2) 输入一个十进制的个位数,求出这个数的平方值,显示其十进制结果,要求有如下 提示信息。

Please input a number : The result is :

例如 please input a number: 8 the result is: 64

实验代码: stack

stack data ENDL IBUF

segment stack dw 32 dup(0) ends segment

;定义数据段

;回车换行 ;定义输入缓冲区

DB 0DH,0AH,'$' DB 2,0,2 DUP(0)

;定义堆栈段 ;分配64字节栈空间

end

STR_IN DB 'Please input a number (0-9): $'

STR_OUT

data

code DB 'The result is: $' ;定义平方表 ends SQUARE_TABLE DB ' 0$ 1$ 4$ 9$16$25$36$49$64$81$' segment ;定义代码段 begin

RUNTEST:

NEXT:

proc far assume ss:stck,cs:code,ds:data push ds sub ax,ax push ax ;保存psp地址 mov ax,data mov ds,ax MOV DX,OFFSET STR_IN ;提示用户输入 MOV AH,9 INT 21H MOV DX,OFFSET IBUF ;接收用户输入 MOV AH,10 INT 21H MOV DX,OFFSET ENDL ;回车换行 MOV AH,9 INT 21H MOV AL,IBUF+2 SUB AL,30H ;得到实际数值 MOV CL,3 MUL CL MOV DI,OFFSET SQUARE_TABLE ;指向自定义的平方表 ADD DI,AX PUSH AX MOV DX,OFFSET STR_OUT MOV AH,9 INT 21H POP AX CMP AX,12 JB NEXT MOV DL,20H MOV AH,2 INT 21H MOV DX,DI MOV AH,9

INT 21H MOV DX,OFFSET ENDL MOV AH,9 INT 21H JMP RUNTEST ret endp ;程序主函数入口 ;不限次数测试 ;返回调用 ;回车换行 begin code end begin

7.

ends Hello.exe实验运行过程中的内存映像图如下: DS

微机原理与接口实验报告

0b540h

SS 0b640h

CS:IP 0B690h

堆栈段 SS = DS + 100H/10H

数据段 DS = SS + 堆栈段长度/10H

代码段 CS = 用户DS + 数据段长度/10H SP 0b680h

使用debug可以进行调试

Debug hello.asm

-u

0b69:0100 1e push ds

0b69:0102 28c0 sub ax,ax

0b69:0103 50 push ax

...... .... ....... .......

可以看到以上是代码段的初始化工作

-r

查看寄存器的内容

ds=b540 cs=b690 ip=0100........

TD也是用于调试的工具,可以单步走,查看内存映像图,是调试程序的重要 方法。

8. 实验心得:汇编语言与C语言有着很大区别,汇编语言用助记符表示所执行的操作,

代码写起来较C语言复杂很多。而且汇编语言的调试也比较麻烦,没有C语言那样强大的编译软件。

学习汇编语言得不断上机实践,只有通过不断的练习,才能熟悉这门语言。在 不断的练习中也能够发现各种问题,培养解决问题的能力。特别是汇编语言得调试, 的一步一步来,调试不过关对汇编语言得学习会造成很大障碍。

汇编语言的学习对于我理解程序在内存中的执行过程以及一个源文件怎么变成计算可以执行的文件有了很大帮助。我对程序的分段,物理地址以及虚地址也有了更好的理解。

第二部分 硬件实验

实验三 实验装置的检测

1. 实验内容:运行检测程序,进行接口检测,获取PCI设备配置资源。

2. 检测程序代码:

stack segment

dw 32dup(?)

stack ends

code segment

begin proc far

assume ss:stck,cs:code

push ds

sub ax,ax

push ax

Ag: mov dx,0e008h//送端口地址

In al,dx

Mov al,0fh

Out dx,al

Mov ah,0bh

Int 21h

Cmp al,0

Jz ag

Ret

begin endp

code ends

end begin

3. 注意事项: 每台机器所分配的端口地址有所不同,要根据实际情况选通端口, 所以需要查看各自的I/O地址,查看I/O地址方法:

D:CHECK

当时做这个实验时,查看本机得到:

IOYO:E000-E03F

I0Y1:E040-E07F

IOY2:E080-E0BF

I0Y3:E0C0-E0FF

当我们检查IOYO、I0Y1、IOY2、I0Y3是否能够正常工作时,秩序 选通其中的一个端口,例如在上面的源程序中我选通的端口是0e008h, 就是在检测IOYO的输出是不是正常的。还需要检测IOW 、IOR 、 XD0-XD7主要检测在示波器中是否有负脉冲输出

实验四 基本输入输出混合接口

1. 实验目的:1)掌握基本输入接口的设计方法。 2)掌握基本输出接口的设计方法。 3)掌握I/O地址译码的方法

2. 实验原理:当用74LS244、74LS273组成一个I/O接口电路时,输入端口地址和输出 端口地址可以为同一个地址。为了区别数据时输入还是输出,可以用

IOR 、IOW和IOY3信号共同控制。由IOY3和IOR产生读选通信号, 有IOY3和IOW产生写选通信号。 3. 实验内容:要求编制一个循环程序,用74LS244和74LS273设计一个输入输出接口, 将从74LS244的输入数据从74LS273的输出发光二极管上对应显示出来。 改变输入,输出立即跟着改变,按下键盘上的任一键,立即停止输入和 输出。 4. 实验电路图:

微机原理与接口实验报告

IOY0

74LS32

5. 实验代码:

stack segment stack 'stack' dw 32 dup (0) stack ends code segment begin proc far

assume ss:stack,cs:code push ds sub ax,ax

push ax

AGAIN: MOV DX,0d800H

IN AL,DX

Mov dx,0d801h

Out dx,al

Mov ah,0bh

Int 21h

Cmp al,0

Jz AGAIN

Ret

Begin endp

code ends

end begin

6. 实验结果和总结:

改变开关状态,发光二极管会作出相应的亮灭,实验正确。实验过程中,若Y0-Y7所有端口均无选通信号,一般可能是74LS138译码器电源未接好,或不符合译码器使能条件,或是74LS138损坏。若选通信号与Y0、Y1端口不对应,则是C、

B、A端输入地址线错接或开路、或短路。C、B、A三端输入地址线应有脉冲信号输出,

若全为0或全为1,则不正常。

实验五 模数转换器ADC0809

1. 实验目的:掌握模/数转换的原理及接口设计

掌握8为A/D转换芯片ADC0808/0809的使用方法。 掌握延时、查询和中断数据传送方式。 2. 实验原理:

各种型号的ADC芯片都具有数据输出信号,启动A/D转换信号和转换结束信 号。首先,计算机启动A/D转换;待转换结束后,ADC送出转换结束信号通知计算 机;计算机用输出指令从ADC的数据输出引线读取转换数据。 由于ADC0808/0809芯片内部集成了数据锁存三态缓冲器,其数据输出线D7~D0 可以直接和计算机的数据总线相连,所以ADC0808/0809与微机的接口的设计主要是 对模拟通道的选择、转换启动的控制和读转换结果的控制等方面的设计。 ADC0808/0809于微机的接口可分为三种方式:延时方式、中断方式、查询方式。 本次实验只用到延时方式:启动转换后等待100us(ADC0808/0809转换时间), 再读取转换结果。 3. 实验内容:用延时的方式分别采集+5V、0V各点的电压数据,并将采集的数据(FFH、

00H)送显示器显示。 4. 实验电路图: 5.

微机原理与接口实验报告

IOY0

6. 实验代码:

stack segment stack 'stack' dw 32 dup(0) stack ends data segment OBUF DB 2 DUP(0),'H','$' data ends

code segment begin proc far assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax LOP : MOV DX,0e060H//送端口号地址 OUT DX,AL MOV BX,1000H //调整BX的赋值可调整延时时间长短 MOV CX,0 Call ag IN al,dx Mov ah,0bh ;1号功能调用,检测键盘上有无输入,如果 ;有输入,就中断程序 Int 21h Cmp al,0 Jz LOP RET begin endp AG proc LOOP $ DEC BX JNZ AG IN AL,DX MOV BX,OFFSET OBUF MOV CL,4 MOV AH,0 SHL AX,CL SHR AL,CL CMP AH,0AH JB SD ADD AH,7 SD : ADD AH,30H MOV [BX],AH INC BX CMP AL,0AH JB LNADD7 ADD AL,7 LNADD7: ADD AL,30H

MOV [BX],AL

MOV DX,OFFSET OBUF

MOV AH,9

INT 21H

ret

code ends

end begin

7. 实验结果和总结:

实验现象:当IN0接高电平时,运行程序,CRT显示FFH,当IN0接低电平时,运行程序,CRT显示00H,实验正确。

连ADC0809芯片引脚接线时一定要注意REF-与GND接地,REF+与ACC接电源。Start和ALE引脚要接到一起,实验书上给的图有错误。我们没有发74LS02或非门,可以用74LS32或门加非门代替,实验效果一样。

实验中注意等待时间的选取,书中给出CLK时钟输入的最高频率为640KHz,且ADC0809启动转换后延时时间为100us。故等待时间需选择大于100us,可以选择500us左右。

实验六 数模转换器DAC0832

1. 实验目的:掌握A/D转换原理。

熟悉A/D芯片接口设计方法。

掌握DAC0832芯片的使用方法。

2. 实验原理:

DAC0832是具有20条引线的双列直插式CMOS器件,内部具有两级数据寄存 器,可完成8为D/A转换,电流输出。其结构和引脚入下图所示。

由于DAC0832内部有输入寄存器和DAC寄存器,所以它不需要外加其他电路 便可以与微机的数据总线直接相连。根据DAC0832的5个控制信号的不同连接方式, 可知它有三种工作方式:直通工作方式、单缓冲工作方式、双缓冲工作方式。 本次实验只用到单缓冲工作方式:令其中一个寄存器工作在直通方式,另一个处于受控锁存状态。

微机原理与接口实验报告

3. 实验内容:用DAC0832设计一个D/A转换接口电路,采用单缓冲工作方式,产生锯 齿波(方波和三角波类似故未写出)。

4. 实验原理图:

微机原理与接口实验报告

5. 实验代码:

stack segment stack 'stack'

dw 32 dup(0)

stack ends

code segment

begin proc far

assume ss:stack,cs:code

push ds

sub ax,ax

push ax

MOV DX,0D860H

AGAIN: OUT DX,AL

INC AL

PUSH AX

MOV AH,0BH

INT 21H

CMP AL,0

POP AX

JZ AGAIN

ret

begin endp

code ends

end begin

6. 实验结果和总结:

实验现象:从示波器上观察,可看到相应的波形。

程序每循环一次DAC0832的输入数字量增1.,因此实际上锯齿波的上升是由 256个小阶梯构成的,但由于小阶梯很小,所以宏观上看就是线性增长的锯齿波。

可通过循环程序段的机器周期计算出锯齿波的周期。并可根据需要,通过延时 的办法来改变锯齿波的周期。当延时时间较短时,可用指令LOOP $来实现:当延时 较长时,可以使用一个延时子程序,也可以使用定时器来定时。

程序中的数字量的变化范围是从0-255,因此得到的锯齿波是满幅的。如果要 得到非满幅的锯齿波,可通过计算求得的数字量的初值和终值,然后在程序中通过 置初值潘终值的办法即可实现。

实验七 PCI 中断实验

1. 实验目的:掌握PCI中断的设计方法。

掌握可编程中断控制器8259A的使用方法。

2. 实验原理:

本实验使用TD-PIT实验装置提供的中断请求信号IRQ(下降沿有效),用KK1的负脉冲作为中断源,在进入中断前、中断过程中和完成中断后分别在屏幕上显示不同的提示字符串。使用实验装置提供的IRQ信号,除了要操作PC的可编程中断控制器8259A外,还需要操作实验装置PCI扩展卡上的与PCI中断有关的寄存器。通过操作上述寄存器,才可以实现中断的初始化和中断清楚等。

3. 实验内容:用KK1的负脉冲作为中断源,经过十次中断后结束程序,每次中断都应 在显示器上显示。

4. 实验代码:

Satck segment stack ‘stack’ ;注意单引号在DOS环境下可能会是乱码。

Dw 32 dup(?)

Satck ends

Data segment

Hh db 0dh,0ah,’$’

Ic db ‘interrupt count=’,’$’

S db 2 dup(‘$’)

Obuf db ‘wait int’,0dh,0ah,’$’

Data ends

Code segment

Begin proc far

Assume ss:stck,ds:data,cs:code

Cli

Push ds

Sub ax,ax

Push ax

Mov es,ax

Mov ax, data

Mov ds,ax

Mov dx,0e438h

Mov al,00h

Out dx,al

Mov dx,0e439h

Mov al,1fh

Out dx,al

Mov dx,0e43ah

Mov al,3fh

Out dx,al

Mov dx,0e43bh Mov al,00h Out dx,al

Mov ax,offset adc_int Mov es:02ch,ax Mov ax,seg adc_int Mov es:02eh,ax In al,021h And al,0f7h Out 021h,al

Mov dx,offset obuf Mov ah,9 Int 21h

Sti

Mov cx,0 Again: cmp cx,10 Jne again

In al,021h Or al,8

Out 021h,al Ret

Begin endp Adc_int proc near

Mov dx,offset hh Mov ah,9 Int 21h

Mov dx,offset ic Mov ah,9 Int 21h

Inc cx

Push cx

Cmp cx,10 Jb agn

Add cx,07h Agn: add cx,30h Mov s[0],cl Pop cx

Mov dx,offset s Mov ah,9

Int 21h

mov dx,0d01fh in al,dx

mov dx,0e43ah mov al,03fh

out dx,al

mov al,62h

out 0a0h,al

mov al,20h

out 20h,al

iret

endp

ends

end begin

5. 实验结果和总结:

实验现象:按下开关KK1十次后程序结束,退出中断。并且每次按下开关时显示屏上均有显示。

PCI的中断初始化的过程包括初始化PCI办卡中断控制寄存器和8259A的中断初始化,前者需要向4个不同端口写入不同的数值。初始化过程一步也不能少,否则得不到正确的实验结果。

Adc_int code

实验八 8255实验

1. 实验目的:熟悉并行接口芯片8255的引脚及其功能。

了解8255的三种工作方式。

掌握8255方式0、方式1的工作原理与编程方法。

2. 实验原理:

8255芯片的结构

端口A、B、C(为8位)都可以被选择作为输入输出,一般将A、B作为输入输出的数据端口,C分为两组,配合A、B使用,作为控制信号或者状态信号。A组和B组控制电路分别控制C的上半部分(PC7-PC4)和下半部分(PC3-PC0)数据总线缓冲器,与系统数据总线(D7-D0)相连读写控制逻辑,包括A0A1(端口选择)、CS(片选信号)、RD(读信号)、WR(写信号)、RESET(复位信号) 8255的控制字

方式选择控制字和按位复位/置位控制字

8255的工作方式

方式0:三个端口都可以作为输入输出,输出锁存,输入不能锁存

方式1:选通I/O工作方式,PC5-PC3和A一组,PC2-PC0和B一组,PC6和PC7作为输入和输出使用。由D3来决定C的某些位作为控制状态信号。 方式2:为方式1的输入和输出的叠加。

硬件电路

由于本次实验是基本I/O方式(即方式0),则可以设定A、B为输入,C为输出, 片选地址采用IOY3得到,地址选为0D860H-0D87FH(不唯一),使用C的按位置 位/复位功能(8位二极管轮流亮灭)

3. 实验内容:1)端口C接的8个发光二极管的流水灯

2)开关控制8个发光二极管亮灭

4. 实验原理图:

5. 实验代码:

1)端口C接的8个发光二极管的流水灯

Satck segment stack ‘stack’

Dw 32 dup(?)

Stck ends

Code segment

Begin proc far

Assume ss:stck,cs:code

Push ds

Sub ax,ax

Push ax

Mov al,80h

Mov dx,0d803h ;ioy0 0d800~0d83fh

Out dx, al

Mov dx,0d802h ;pc输出

Mov al,0feh ;0位发光

Again: Out dx,al

Mov bx,1000h ;延时

Mov cx,0

Ag: Loop $

Dec bx

Jnz ag

Push ax ;检测输入 Mov ah,0bh

Int 21h

Inc al

Pop ax

Jnz cont

Ret

Cont: Rol al,1 ;位移控制方向 Jmp again

Ret

Begin endp

Code ends

end begin

2) 开关控制8个发光二极管亮灭。 Satck segment stack ‘stack’

Dw 32 dup(?)

Stck ends

Code segment

Begin proc far

Assume ss:stck,cs:code

Push ds

Sub ax,ax

Push ax

Mov dx,0d803h

Mov al,90h

Out dx,al

Up: Mov dx,0d800h

In al,dx

Inc dx

Out dx,al

Inc dx

Out dx,al

Mov ah,0bh

Int 21h

Cmp al,0

Je up

Ret

Begin endp

Code ends

End begin

6. 实验结果和总结:

本实验中我们选择的是8255最简单的工作方式0,实验中先得写方式选择 控制字,指定各端口的输入输出方式及工作方式。然后再依次对各个端口写数 据或从各个端口读数据,方式控制字只写入一次。

实验中为了简化硬件电路的搭建,可以省去138译码器,将IOY3直接接入CS端,A2-A4可以不用接。

第三部分 实验心得

通过微机原理实验,熟悉了部分常用微机指令和部分常用芯片的使用,加强了代码的编写能力,进一步理解了程序的执行过程,同时加深了对接口的理解,增强了动手解决问题的能力。

相关推荐