微机原理与接口实验报告.docx

上传人:b****7 文档编号:25801559 上传时间:2023-06-14 格式:DOCX 页数:27 大小:105.24KB
下载 相关 举报
微机原理与接口实验报告.docx_第1页
第1页 / 共27页
微机原理与接口实验报告.docx_第2页
第2页 / 共27页
微机原理与接口实验报告.docx_第3页
第3页 / 共27页
微机原理与接口实验报告.docx_第4页
第4页 / 共27页
微机原理与接口实验报告.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

微机原理与接口实验报告.docx

《微机原理与接口实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理与接口实验报告.docx(27页珍藏版)》请在冰豆网上搜索。

微机原理与接口实验报告.docx

微机原理与接口实验报告

(此文档为word格式,下载后您可任意编辑修改!

 

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

 

第一部分软件实验

实验一、实验二

1.实验目的:

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

2.实验内容:

DOS环境下汇编的快速入门

3.实验步骤:

1)进入DOS环境(启动菜单中选择),然后进入最后一个盘中,如D盘:

C:

\D:

〈Enter〉建议大家的文件都建立在最后一个盘,如D盘,如果建在C:

,计算机重启后会被系统自动删除。

2)运行鼠标驱动程序D:

\mouse

3)编辑汇编源文件:

d:

\Editxxx.asm

4)编译:

d:

\Tasmxxx.asm

5)链接:

D:

\tlinkxxx.obj

6)运行.exe:

D:

\xxx.exe

7)调试:

D:

\TDxxx.exe

4.实验代码:

在屏幕上显示HelloWorld!

Stacksegmentstack

Dw32dup(0)

Stackends

Datasegment

OBUFDB‘HelloWorld!

$’

Dataendp

Codesegment

Assumess:

stack,ds:

data,cs:

code

Beginprocfar

Pushds

Subax,ax

Pushax

Movax,data

Movds,ax

MOVDX,OFFSETOBUF

MOVAH,9

INT21H

Ret

Beginendp

Codeends

Endbegin

5.实验结果:

屏幕上显示‘HelloWorld!

6.上机试题

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

例如:

PleaseinputN(00H-FFH):

9B

N=9Bh=B=155

实验代码:

stacksegmentstack

dw32dup(0)

stackends

datasegment

ENDLDB0DH,0AH,'$';回车换行

IBUF_HEXDB3,0,3DUP(0)

OBUF_BINDB10DUP('$')

OBUF_BCDDB4DUP('$')

STR_IN_HEXDB'PleaseinputN(00H~FFH):

$'

STR_OUT1DB'N=$'

STR_OUT2DB'=$'

dataends

codesegment

beginprocfar

assumess:

stack,cs:

code,ds:

data

pushds

subax,ax

pushax;保存psp地址

movax,data

movds,ax

MOVDX,OFFSETSTR_IN_HEX;提示用户输入十六进制数,如9B

MOVAH,9

INT21H

MOVDX,OFFSETIBUF_HEX;接收输入的十六进制数

MOVAH,10

INT21H

MOVDX,OFFSETENDL;回车换行

MOVAH,9

INT21H

MOVDX,OFFSETSTR_OUT1;输出'N='

MOVAH,9

INT21H

MOVSI,OFFSETIBUF_HEX+2

MOVCL,IBUF_HEX+1

MOVCH,0

PUSHSI;保存字符串的首地址

ADDSI,CX

MOVBYTEPTR[SI],'$';在输入的字符串末尾加上结束符

POPSI

MOVDX,SI;输出输入的十六进制数,如9BH

MOVAH,9

INT21H

MOVDL,'H'

MOVAH,2

INT21H

MOVDX,OFFSETSTR_OUT2;输出'='

MOVAH,9

INT21H

CALL;调用子函数,将输入的十六进制数转为二进制值

PUSHAX;AL压栈,留给指令CALLbcdout使用

CALLbinout;把AL二进制值按二进制格式输出

MOVDX,OFFSETSTR_OUT2;输出'='

MOVAH,9

INT21H

POPAX

CALLbcdout;把AL二进制值按十进制格式输出

MOVDX,OFFSETENDL

MOVAH,9

INT21H;回车换行

ret

beginendp

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

如:

输入:

FF处理:

AL=FFH

proc

MOVCL,IBUF_HEX+1;保存输入字符个数

MOVCH,0

MOVSI,OFFSETIBUF_HEX+2

MOVAX,0

_AGAIN:

MOVDL,16;乘数为16

MULDL乘积保存在AX中

MOVBL,[SI]

CMPBL,'A'

JB_SMALLER

SUBBL,07H

_SMALLER:

SUBBL,30H

ADDAL,BL

INCSI

LOOP_AGAIN

ret

endp

binoutproc;  ;二进制数--->二进制格式输出

MOVBYTEPTROBUF_BIN+8,'B'

MOVDI,OFFSETOBUF_BIN

MOVAH,0

MOVCX,8;设置LOOP循环次数

binout_NEXT:

MOVDL,0

SHLAL,1

ADCDL,30H;将每一位转为ASCII码

MOV[DI],DL;保存转换后的ASCII码

INCDI

LOOPbinout_NEXT;cx值为8,循环8次

MOVDX,OFFSETOBUF_BIN;输出处理结果

MOVAH,9

INT21H

ret;返回调用

binoutendp

bcdoutproc;二进制数--->十进制数输出

MOVDI,OFFSETOBUF_BCD+2

MOVAH,0

MOVCX,10

bcdout_AGAIN:

MOVDX,0;无符号数16位扩展为32位

DIVCX;余数DX,商AX

ADDDL,30H

MOV[DI],DL

DECDI

ORAX,AX

JNEbcdout_AGAIN

INCDI

MOVDX,DI

MOVAH,9

INT21H

ret

bcdoutendp

codeends

    endbegin

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

提示信息。

Pleaseinputanumber:

Theresultis:

例如pleaseinputanumber:

8

theresultis:

64

实验代码:

stacksegmentstack;定义堆栈段

dw32dup(0);分配64字节栈空间

stackends

datasegment;定义数据段

ENDLDB0DH,0AH,'$';回车换行

IBUFDB2,0,2DUP(0);定义输入缓冲区

STR_INDB'Pleaseinputanumber(0-9):

$'

STR_OUTDB'Theresultis:

$'

SQUARE_TABLEDB'0$1$4$9$16$25$36$49$64$81$';定义平方表

dataends

codesegment;定义代码段

beginprocfar

assumess:

stck,cs:

code,ds:

data

pushds

subax,ax

pushax;保存psp地址

movax,data

movds,ax

RUNTEST:

MOVDX,OFFSETSTR_IN;提示用户输入

MOVAH,9

INT21H

MOVDX,OFFSETIBUF;接收用户输入

MOVAH,10

INT21H

MOVDX,OFFSETENDL;回车换行

MOVAH,9

INT21H

MOVAL,IBUF+2

SUBAL,30H;得到实际数值

MOVCL,3

MULCL

MOVDI,OFFSETSQUARE_TABLE;指向自定义的平方表

ADDDI,AX

PUSHAX

MOVDX,OFFSETSTR_OUT

MOVAH,9

INT21H

POPAX

CMPAX,12JBNEXT

MOVDL,20H

MOVAH,2

INT21H

NEXT:

MOVDX,DI

MOVAH,9

INT21H

MOVDX,OFFSETENDL;回车换行

MOVAH,9

INT21H

JMPRUNTEST;不限次数测试

ret;返回调用

beginendp

codeends

endbegin;程序主函数入口

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

……

PSP(100HB)

堆栈段(40HB)

数据段(10HB)

代码段(20HB)

……

DS0b540h

SS0b640h

SP0b680h

CS:

IP0B690h

堆栈段SS=DS+100H10H

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

代码段CS=用户DS+数据段长度10H

使用debug可以进行调试

Debugprocfar

assumess:

stck,cs:

code

pushds

subax,ax

  pushax

Ag:

movdx,0e008h送端口地址

  Inal,dx

  Moval,0fh

  Outdx,al

  Movah,0bh

  Int21h

  Cmpal,0

  Jzag

  Ret

beginendp

codeends

endbegin

1.注意事项:

每台机器所分配的端口地址有所不同,要根据实际情况选通端口,

所以需要查看各自的IO地址,查看IO地址方法:

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)掌握IO地址译码的方法

2.实验原理:

当用74LS244、74LS273组成一个IO接口电路时,输入端口地址和输出

端口地址可以为同一个地址。

为了区别数据时输入还是输出,可以用

IOR、IOW和IOY3信号共同控制。

由IOY3和IOR产生读选通信号,

有IOY3和IOW产生写选通信号。

3.实验内容:

要求编制一个循环程序,用74LS244和74LS273设计一个输入输出接口,

将从74LS244的输入数据从74LS273的输出发光二极管上对应显示出来。

改变输入,输出立即跟着改变,按下键盘上的任一键,立即停止输入和输出。

4.实验电路图:

5.实验代码:

stacksegmentstack'stack'

dw32dup(0)

stackends

codesegment

beginprocfar

assumess:

stack,cs:

code

pushds

subax,ax

pushax

AGAIN:

MOVDX,0d800H

INAL,DX

Movdx,0d801h

Outdx,al

Movah,0bh

Int21h

Cmpal,0

JzAGAIN

Ret

Beginendp

codeends

endbegin

6.实验结果和总结:

改变开关状态,发光二极管会作出相应的亮灭,实验正确。

实验过程中,若Y0-Y7所有端口均无选通信号,一般可能是74LS138译码器电源未接好,或不符合译码器使能条件,或是74LS138损坏。

若选通信号与Y0、Y1端口不对应,则是C、B、A端输入地址线错接或开路、或短路。

C、B、A三端输入地址线应有脉冲信号输出,

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

实验五模数转换器ADC0809

1.实验目的:

掌握模数转换的原理及接口设计

掌握8为AD转换芯片ADC08080809的使用方法。

掌握延时、查询和中断数据传送方式。

2.实验原理:

  

 各种型号的ADC芯片都具有数据输出信号,启动AD转换信号和转换结束信号。

首先,计算机启动AD转换;待转换结束后,ADC送出转换结束信号通知计算机;计算机用输出指令从ADC的数据输出引线读取转换数据。

   由于ADC08080809芯片内部集成了数据锁存三态缓冲器,其数据输出线D7~D0可以直接和计算机的数据总线相连,所以ADC08080809与微机的接口的设计主要是对模拟通道的选择、转换启动的控制和读转换结果的控制等方面的设计。

ADC08080809于微机的接口可分为三种方式:

延时方式、中断方式、查询方式。

   本次实验只用到延时方式:

启动转换后等待100us(ADC08080809转换时间),再读取转换结果。

3.实验内容:

用延时的方式分别采集+5V、0V各点的电压数据,并将采集的数据(FFH、00H)送显示器显示。

4.实验电路图:

5.

6.实验代码:

stacksegmentstack'stack'

dw32dup(0)

stackends

datasegment

OBUFDB2DUP(0),'H','$'

dataends

codesegment

beginprocfar

assumess:

stack,cs:

code,ds:

data

pushds

subax,ax

pushax

movax,data

movds,ax

LOP:

MOVDX,0e060H送端口号地址

OUTDX,AL

MOVBX,1000H调整BX的赋值可调整延时时间长短

MOVCX,0

Callag

INal,dx

Movah,0bh;1号功能调用,检测键盘上有无输入,如果

;有输入,就中断程序

Int21h

Cmpal,0

JzLOP

RET

beginendp

AGproc

LOOP$

DECBX

JNZAG

INAL,DX

MOVBX,OFFSETOBUF

MOVCL,4

MOVAH,0

SHLAX,CL

SHRAL,CL

CMPAH,0AH

JBSD

ADDAH,7

SD:

ADDAH,30H

MOV[BX],AH

INCBX

CMPAL,0AH

JBLNADD7

ADDAL,7

LNADD7:

ADDAL,30H

MOV[BX],AL

MOVDX,OFFSETOBUF

MOVAH,9

INT21H

ret

codeends

endbegin

7.实验结果和总结:

 实验现象:

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

 连ADC0809芯片引脚接线时一定要注意REF-与GND接地,REF+与ACC接电源。

Start和ALE引脚要接到一起,实验书上给的图有错误。

我们没有发74LS02或非门,可以用74LS32或门加非门代替,实验效果一样。

 实验中注意等待时间的选取,书中给出CLK时钟输入的最高频率为640KHz,且ADC0809启动转换后延时时间为100us。

故等待时间需选择大于100us,可以选择500us左右。

实验六数模转换器DAC0832

1.实验目的:

掌握AD转换原理。

熟悉AD芯片接口设计方法。

掌握DAC0832芯片的使用方法。

2.实验原理:

  DAC0832是具有20条引线的双列直插式CMOS器件,内部具有两级数据寄存器,可完成8为DA转换,电流输出。

其结构和引脚入下图所示。

  由于DAC0832内部有输入寄存器和DAC寄存器,所以它不需要外加其他电路便可以与微机的数据总线直接相连。

根据DAC0832的5个控制信号的不同连接方式,可知它有三种工作方式:

直通工作方式、单缓冲工作方式、双缓冲工作方式。

   本次实验只用到单缓冲工作方式:

令其中一个寄存器工作在直通方式,另一个处于受控锁存状态。

3.实验内容:

用DAC0832设计一个DA转换接口电路,采用单缓冲工作方式,产生锯齿波(方波和三角波类似故未写出)。

4.实验原理图:

5.实验代码:

stacksegmentstack'stack'

dw32dup(0)

stackends

codesegment

beginprocfar

assumess:

stack,cs:

code

pushds

subax,ax

pushax

MOVDX,0D860H

AGAIN:

OUTDX,AL

INCAL

PUSHAX

MOVAH,0BH

INT21H

CMPAL,0

POPAX

JZAGAIN

ret

beginendp

codeends

endbegin

6.实验结果和总结:

 实验现象:

从示波器上观察,可看到相应的波形。

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

  可通过循环程序段的机器周期计算出锯齿波的周期。

并可根据需要,通过延时的办法来改变锯齿波的周期。

当延时时间较短时,可用指令LOOP$来实现:

当延时较长时,可以使用一个延时子程序,也可以使用定时器来定时。

程序中的数字量的变化范围是从0-255,因此得到的锯齿波是满幅的。

如果要得到非满幅的锯齿波,可通过计算求得的数字量的初值和终值,然后在程序中通过置初值潘终值的办法即可实现。

实验七PCI中断实验

1.实验目的:

掌握PCI中断的设计方法。

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

2.实验原理:

本实验使用TD-PIT实验装置提供的中断请求信号IRQ(下降沿有效),用KK1的负脉冲作为中断源,在进入中断前、中断过程中和完成中断后分别在屏幕上显示不同的提示字符串。

使用实验装置提供的IRQ信号,除了要操作PC的可编程中断控制器8259A外,还需要操作实验装置PCI扩展卡上的与PCI中断有关的寄存器。

通过操作上述寄存器,才可以实现中断的初始化和中断清楚等。

3.实验内容:

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

4.实验代码:

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

Dw32dup(?

Satckends

Datasegment

Hhdb0dh,0ah,’$’

Icdb‘interruptcount=’,’$’

Sdb2dup(‘$’)

Obufdb‘waitint’,0dh,0ah,’$’

Dataends

Codesegment

Beginprocfar

Assumess:

stck,ds:

data,cs:

code

Cli

Pushds

Subax,ax

Pushax

Moves,ax

Movax,data

Movds,ax

Movdx,0e438h

Moval,00h

Outdx,al

Movdx,0e439h

Moval,1fh

Outdx,al

Movdx,0e43ah

Moval,3fh

Outdx,al

Movdx,0e43bh

Moval,00h

Outdx,al

Movax,offsetadc_int

Moves:

02ch,ax

Movax,segadc_int

Moves:

02eh,ax

Inal,021h

Andal,0f7h

Out021h,al

Movdx,offsetobuf

Movah,9

Int21h

Sti

Movcx,0

Again:

cmpcx,10

Jneagain

Inal,021h

Oral,8

Out021h,al

Ret

Beginendp

Adc_intprocnear

Movdx,offset

Addcx,07h

Agn:

addcx,30h

Movs[0],cl

Popcx

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 畜牧兽医

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1