微机原理与接口实验报告.docx
《微机原理与接口实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理与接口实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
![微机原理与接口实验报告.docx](https://file1.bdocx.com/fileroot1/2023-6/14/e359fa8d-0dc6-4526-8d27-c232f16d3b9e/e359fa8d-0dc6-4526-8d27-c232f16d3b9e1.gif)
微机原理与接口实验报告
(此文档为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