微机原理实验报告

目录

实验一 汇编语言编程实验

一、 实验目的

二、 实验所用仪器

三、 实验内容及基本原理

四、 实验数据记录

五、 实验结果分析及回答问题(或测试环境及测试结果)

实验二 数码转换实验

一、 实验目的

二、 实验所用仪器

三、 实验内容及基本原理

扫描二维码关注公众号,回复: 10813958 查看本文章

四、 实验数据记录

五、 实验结果分析及回答问题

实验三 基本 IO 口扩展实验

一、 实验目的

二、 实验所用仪器

三、 实验内容及基本原理

四、 实验数据记录

五、 实验结果分析及回答问题

实验四 可编程并行接口实验

一、 实验目的

二、 实验所用仪器

三、实验内容及基本原理

四、 实验原理图

五、实验结果分析及回答问题


实验一 汇编语言编程实验

一、 实验目的

1. 掌握汇编语言的编程方法

2. 掌握 DOS 功能调用的使用方法

3. 掌握汇编语言程序的调试运行过程

二、 实验所用仪器

Masm for windows 集成环境

三、 实验内容及基本原理

1. 将指定数据区的字符串数据以 ASCII 码形式显示在屏幕上,并通过 DOS 功能调用完 成必要提示信息的显示。

2. 在屏幕上显示自己的学号姓名信息。

3. 循环从键盘读入字符并回显在屏幕上,然后显示出对应字符的 ASCII 码,直到输 入”Q”或“q”时结束。

字节码转 ASCII 码流程图

 

 

四、 实验数据记录

 学号姓名题目源码:

字符转 ASCII 源码:

五、 实验结果分析及回答问题(或测试环境及测试结果)

学号与姓名的输入输出测试结果:

字符转 ASCII 测试结果:

实验二 数码转换实验

一、 实验目的

1. 掌握不同进制数及编码相互转换的程序设计方法。

2. 掌握运算类指令编程及调试方法。

3. 掌握循环程序的设计方法。

二、 实验所用仪器

Masm for windows 集成环境 QTHPCI 软件

三、 实验内容及基本原理

实验内容:

1. 重复从键盘输入不超过 5 位的十进制数,按回车键结束输入;

2. 将该十进制数转换成二进制数;结果以 2 进制数的形式显示在屏幕上;

3. 如果输入非数字字符,则报告出错信息,重新输入;

4. 直到输入“Q”或‘q’时程序运行结束。

5. 键盘输入一字符串,以空格结束,统计其中数字字符的个数,在屏幕显示

实验原理:

四、 实验数据记录

 

十进制(不超过五位数)转二进制源码

 

字符串中数字的个数

五、 实验结果分析及回答问题

十进制数转二进制测试结果:

 

字符串中数字个数测试结果:

实验三 基本 IO 口扩展实验

一、 实验目的

1. 了解 TTL 芯片扩展简单 I/O 口的方法。

2. 掌握数据输入输出程序编制的方法。

二、 实验所用仪器

QTHPCI 软件,74LS244 缓冲驱动器,74LS273 触发器

三、 实验内容及基本原理

实验内容:

本实验要求用 74LS244 作为输入口,读取开关状态,并将此状态通过 74LS273 连到发光 二极管显示。具体实验内容如下:

    1.开关 Yi 为低电平时对应的发光二极管亮,Yi 为高电平时对应的发光二极管灭。

    2.当开关 Yi 全为高电平时,发光二极管 Qi 从左至右轮流点亮。

    3.当开关 Yi 全为低电平时,发光二极管 Qi 从右至左轮流点亮。

    4.自主设计控制及显示模式,完成编程调试,演示实验结果。

实验原理:

74LS244 是一种三态输出的 8 总线缓冲驱动器,无锁存功能,当 G 为低电平,Ai 信号传 送到 Yi,当为高电平时,Yi 处于禁止高阻状态;

74LS273 是一种带清除功能的 8D 触发器, 1D~8D 为数据输入端,1Q~8Q 为数据输出 端,正脉冲触发,低电平清除,常用作 8 位地址锁存器。

 

 

 

四、 实验数据记录

1. 按照实验连线图连接:

244 的 CS 接到 ISA 总线接口模块的 0000H,Y7—Y0——开关 K1—K8

273 的 CS 接到 ISA 总线接口模块的 0020H,Q7—Q0——发光二极管 L1—L8 该模块的 WR、RD 分别连到 ISA 总线接口模块的 IOWR、IORD。 该模块的数据(AD0~AD7)连到 ISA 总线接口模块的数据(LD0~LD7)。 2.编写实验程序,编译链接,运行程序

3. 拨动开关,观察发光二极管的变化。

五、 实验结果分析及回答问题

 1.开关 Yi 为低电平时对应的发光二极管亮,Yi 为高电平时对应的发光二极管灭。

 2.当开关 Yi 全为高电平时,发光二极管 Qi 从左至右轮流点亮。

 3.当开关 Yi 全为低电平时,发光二极管 Qi 从右至左轮流点亮。

 

实验四 可编程并行接口实验

一、 实验目的

 1. 了解可编程并行接口 8255 的内部结构,

 2. 掌握工作方式、初始化编程及应用。

二、 实验所用仪器

QTHPCI 软件,8255 可编程并行接口电路

三、实验内容及基本原理

实验内容:

1.流水灯实验:利用 8255 的 A 口、B 口循环点亮发光二极管。

2.交通灯实验:利用 8255 的 A 口模拟交通信号灯。

3.I/O 输入输出实验:利用 8255 的 A 口读取开关状态,8255 的 B 口把状态送发光二极 管显示。

4.在完成(1)基础上,增加通过读取开关控制流水灯的循环方向和循环方式。

5.在完成(2)基础上,增加通过读取开关控制交通红绿灯的亮灭时间。

实验原理:

8255 是一个通用可编程并行接口电路。它具有 A、B、C 三个 8 位并行口。其中 C 口也可 用作 A、B 口的联络信号及中断申请信号。通过编程,它可以被设置为基本输入输出、 选通输入输出以及双向传送方式。对于 C 口还具有按位置 0、1 的功能。

8255 控制字

D7

D6

D5

D4

D3

D2

D1

D0

1

 

(特征位)

A 组方式

 

00=方式 0 01=方式 1

 

1X=方式 2

A 口 0=输出

1=输入

C 口高 4 位 0=输出

1=输入

B 组方式 0=方式 0

1=方式 1

B 口 0=输出

1=输入

C 口低 4 位 0=输出

1=输入

0

 

(特征位)

 

不用

位选择

 

000=C 口 0 位……111=C 口 7 位

0=复位

 

1=置位

四、 实验原理图

流水灯                                 交通灯

 

 

五、实验结果分析及回答问题

I/O 输入输出实验

;交通灯源码
MY_STACK	SEGMENT PARA 'STACK'
DB	100 DUP(?)
MY_STACK	ENDS

MY_DATA    SEGMENT PARA 'DATA'
IO_9054base_address DB 4 DUP(0)	;PCI 卡 9054 芯片 I/O 基地址暂存空间
IO_base_address    DB 4 DUP(0)	;PCI 卡 I/O 基地址暂存空间
pcicardnotfind	DB 0DH,0AH,'pci card not find or address/interrupt error !!!',0DH,0AH,'$'
GOOD	DB 0DH,0AH,'The Program is Executing !',0DH,0AH,'$'

P8255_A     DW    0000H
P8255_B     DW    0001H
P8255_C     DW    0002H
P8255_MODE DW 0003H DELAY_SET EQU 5fffH DELAY_SET1  EQU    18ffH

MES2	DB '	PCI CONFIG READ ERROR!	$' MY_DATA		ENDs
MY_CODE    SEGMENT PARA 'CODE'

MY_PROC    PROC    FAR
ASSUME  CS:MY_CODE, DS:MY_DATA, SS:MY_STACK

START:
.386   ;386 模式编译
MOV	AX,MY_DATA
MOV	DS,AX
MOV	ES,AX
 
MOV	AX,MY_STACK
MOV	SS,AX
CALL	FINDPCI	;自动查找 PCI 卡资源及 IO 口基址

;	MOV
MOV	CX,word ptr IO_base_address
CX,0E800H	;直接加入(E800:本机 PCI 卡 IO 口基址)
	ADD	P8255_A,CX	;PCI 卡 IO 基址+偏移
	ADD	P8255_B,CX
	ADD	P8255_C,CX
	ADD	P8255_MODE,CX
	MOV MOV	DX,P8255_MODE
AL,80H	;3 个口全部为输出
	OUT	DX,AL
	MOV	DX,P8255_A
	CALL	ST0	;全为红灯
TRAFFIC1:	CALL
CALL	ST1
ST5	;南北为绿灯,东西为红灯
	CALL	ST2	;南北红灯闪烁,东西为红灯
	CALL	ST3
CALL	ST6	;南北为红灯,东西为绿灯
	CALL	ST4	;南北为红灯,东西黄灯闪烁
	CALL	BREAK
	JMP	TRAFFIC1
MY_PROC	ENDp	
ST0	PROC	NEAR
	MOV	AL,1BH
	OUT	DX,AL
	CALL	DELAY
	RET	
ST0	ENDp	
ST1	PROC	NEAR
	MOV	DX,P8255_A
	MOV	AL,0EDH
	OUT	DX,AL
	CALL	DELAY
	CALL	DELAY
	CALL	DELAY
	RET	
ST1	ENDp	
ST5	PROC	NEAR
	MOV	DX,P8255_A
	MOV	AL,0EBH
	OUT	DX,AL
	CALL	DELAY
	RET	
ST5	ENDp	
ST2	PROC	NEAR
	MOV	CX,5H
ST20:	MOV	AL,0EBH
	OUT	DX,AL
	CALL	DELAY1
	MOV	AL,0EFH
	OUT	DX,Al
	CALL	DELAY1
	LOOP	ST20
	RET	
ST2	ENDp	
ST3	PROC	NEAR
	MOV	AL,0DEH
	OUT	DX,AL
	CALL	DELAY
	CALL	DELAY
	CALL	DELAY
	RET	
ST3	ENDp	
ST6	PROC	NEAR
	MOV	DX,P8255_A
	MOV	AL,0BEH
 

	OUT	DX,AL
	CALL	DELAY
	RET	
ST6	ENDp	
ST4	PROC	NEAR
	MOV	CX,5H
ST40:	MOV	AL,0BEH
	OUT	DX,AL
	CALL	DELAY1
	MOV	AL,0FEH
	OUT	DX,AL
	CALL	DELAY1
	LOOP	ST40
	RET	
ST4	ENDp	
;
;*****************************************************************************
;	/* 延时子程序 */
;*****************************************************************************
;
DELAY	PROC	NEAR	;延时程序
PUSHF PUSH	DX
PUSH	CX
MOV	DX,DELAY_SET
D1:	MOV	CX,-1
D2:	DEC	CX
JNZ	D2
DEC	DX
JNZ	D1
POP	CX
POP	DX POPF
RET
DELAY	ENDp
DELAY1	PROC	NEAR	;延时程序
PUSHF PUSH	DX
PUSH	CX
MOV	DX,DELAY_SET1
D3:	MOV	CX,-1
D4:	DEC	CX
JNZ	D4
DEC	DX
JNZ	D3
POP	CX
POP	DX POPF
RET
DELAY1	ENDp
;
;*****************************************************************************
;	/* 按任意键退出子程序 */
;*****************************************************************************
;
BREAK	PROC	NEAR	;按任意键退出
PUSHF PUSH	AX
PUSH	DX
MOV	AH,06H
MOV	DL,0FFH
INT	21H
JE	RETURN
MOV	AX,4C00H
INT	21H
RETURN:	POP	DX
POP	AX POPF
RET
BREAK	ENDP
;
;*****************************************************************************
;	/* 找卡子程序 */
 
;*****************************************************************************
;
;FUNCTION CODE
IO_port_addre	EQU 0CF8H	;32 位配置地址端口
IO_port_data	EQU 0CFCH	;32 位配置数据端口
IO_PLX_ID	EQU 200810B5H	;PCI 卡设备及厂商 ID
BADR0	=	10H	;基地址寄存器 0
BADR1	=	14H	;基地址寄存器 1
BADR2	=	18H	;基地址寄存器 2
BADR3	=	1CH	;基地址寄存器 3
FINDPCI	PROC	NEAR	;查找 PCI 卡资源并显示
PUSHAD PUSHFD
MOV	EBX,080000000H
FINDPCI_next:
ADD	EBX,100H
CMP	EBX,081000000H
JNZ	findpci_continue
MOV	DX,offset pcicardnotfind	;显示未找到 PCI 卡提示信息
MOV	AH,09H
INT	21H
MOV	AH,4CH
INT	21H	;退出
findpci_continue:
MOV
MOV	DX,IO_port_addre
EAX,EBX	
OUT	DX,EAX	;写地址口
MOV	DX,IO_port_data	
IN	EAX,DX	;读数据口
CMP	EAX,IO_PLX_ID	
JNZ	findpci_next	;检查是否发现 PCI 卡
MOV	DX,IO_port_addre	
MOV	EAX,EBX	
ADD
OUT	EAX,BADR1
DX,EAX	;写地址口
MOV	DX,IO_port_data	
IN	EAX,DX	;读数据口
MOV	dword ptr IO_9054base_address,EAX	
AND	EAX,1	
JZ	findPCI_next	;检查是否为 i/o 基址信息
MOV	EAX,dword ptr IO_9054base_address	
AND	EAX,0fffffffeh	
MOV	dword ptr IO_9054base_address,EAX	;去除 i/o 指示位并保存
MOV	DX,IO_port_addre	
MOV	EAX,EBX	
ADD	EAX,BADR2	
OUT	DX,EAX	;写地址口
MOV
IN	DX,IO_port_data
EAX,DX	;读数据口
MOV	dword ptr IO_base_address,EAX	
AND
JZ	EAX,1
findPCI_next	;检查是否为 i/o 基址信息
MOV	EAX,dword ptr IO_base_address	
AND
MOV	EAX,0fffffffeh
dword ptr IO_base_address,EAX	;去除 i/o 指示位并保存
	MOV	DX,offset good	;显示开始执行程序信息
	MOV	AH,09H
	INT	21H
	POPfd	
	POPad	
	RET	
findPCI	ENDP	
MY_CODE	ENDS	
END START
;I/O 实验源码
DATA	SEGMENT DELAY_SET	EQU	0FFFH L_TO_R DB ?
R_TO_L DB ?
 
DATA	ENDs

CODE	SEGMENT
ASSUME DS : DATA, CS : CODE START:
MOV AX, DATA
MOV DS, AX
MOV L_TO_R, 07FH MOV R_TO_L, 0FEH MOV DX, 0ec03h MOV AL, 89h
OUT  DX, AL
X:
MOV DX, 0ec02h IN  AL,  DX  CMP AL, 0h
JE FLOW_1 CMP AL, 00fh JE FLOW_2
MOV DX, 0ec00h OUT DX, AL CALL  DELAY  JMP START

FLOW_1:
MOV AL, L_TO_R MOV AH, R_TO_L ROR AL, 1
MOV L_TO_R, AL ROL AH, 1
MOV R_TO_L, AH JMP SHOW_1

FLOW_2:
MOV AL, R_TO_L MOV AH, L_TO_R ROR AL, 1
MOV L_TO_R, AL ROL AH, 1
MOV R_TO_L, AH JMP SHOW_2

SHOW_1:
MOV DX, 0ec00h OUT  DX, AL  MOV  AL, AH  MOV DX, 0ec01h OUT DX, AL CALL  DELAY  JMP X

SHOW_2:
MOV DX, 0ec01h OUT  DX, AL  MOV  AL, AH  MOV DX, 0ec00h OUT DX, AL CALL  DELAY  JMP X

DELAY	PROC	NEAR
	PUSHF	
	PUSH	DX
	PUSH	CX
	MOV	DX,DELAY_SET
D1:	MOV	CX,-1
D2:	DEC	CX
	JNZ	D2
	DEC	DX
	JNZ	D1
	POP	CX
	POP	DX
	POPF	
	RET	
DELAY	ENDp
 
CODE	ENDs END START
 
 
;流水灯源码
MY_STACK	SEGMENT PARA 'STACK'
DB	100 DUP(?)
MY_STACK	ENDS

MY_DATA	SEGMENT PARA 'DATA'
IO_9054base_address DB 4 DUP(0)	;PCI 卡 9054 芯片 I/O 基地址暂存空间
IO_base_address	DB 4 DUP(0)	;PCI 卡 I/O 基地址暂存空间
pcicardnotfind	DB 0DH,0AH,'pci card not find or address/interrupt error !!!',0DH,0AH,'$'
GOOD	DB 0DH,0AH,'The Program is Executing !',0DH,0AH,'$'
LA	DB	?
LB	DB	?
P8255_A	DW	0000H
P8255_B	DW	0001H
P8255_C	DW	0002H
P8255_MODE DW	0003H DELAY_SET	EQU	11FFH
MES2	DB '	PCI CONFIG READ ERROR!	$' MY_DATA	ENDs
MY_CODE	SEGMENT PARA 'CODE' MY_PROC	PROC	FAR
ASSUME  CS:MY_CODE, DS:MY_DATA, SS:MY_STACK

START:
.386	;386 模式编译
MOV	AX,MY_DATA
MOV	DS,AX
MOV	ES,AX
MOV	AX,MY_STACK
MOV	SS,AX
CALL	FINDPCI	;自动查找 PCI 卡资源及 IO 口基址
	MOV
ADD	CX,word ptr IO_base_address
P8255_A,CX	;PCI 卡 IO 基址+偏移
	ADD	P8255_B,CX
	ADD	P8255_C,CX
	ADD	P8255_MODE,CX
	MOV	DX,P8255_MODE	;8255 初始化,三个口全为输出
	MOV	AL,80H
	OUT	DX,AL
	MOV	DX,P8255_A	;PA 口赋初值
	MOV	AL,7FH
	OUT	DX,AL
	MOV	LA,AL
	MOV	DX,P8255_B	;PB 口赋初值
	MOV	AL,0FEH
	OUT	DX,AL
	MOV	LB,AL
	CALL	DELAY
A1:	MOV	AL,LA	;PA 口数据右移一位
	ROL	AL,1
	MOV	LA,AL
	MOV	DX,P8255_A
	OUT	DX,AL
	MOV	AL,LB
	ROR	AL,1
	MOV	LB,AL
	MOV	DX,P8255_B	;PB 口数据右移一位
	OUT	DX,AL
	CALL	DELAY	;延时
	CALL	BREAK	;按任意键退出
	JMP	A1
MY_PROC	ENDp	
DELAY	PROC	NEAR	;延时程序
	PUSHF	
	PUSH	DX
 



D1:	PUSH MOV MOV	CX DX,DELAY_SET CX,-1
D2:






DELAY	DEC
JNZ DEC JNZ POP POP POPF RET ENDp	CX
D2 DX D1 CX DX
BREAK





RETURN:	PROC MOV MOV INT JE MOV INT RET	NEAR AH,06H DL,0FFH 21H RETURN AX,4C00H 21H
BREAK	ENDP	
;*****************************************************************************
;	/* 找卡子程序 */
;*****************************************************************************
IO_port_addre	EQU 0CF8H	;32 位配置地址端口
IO_port_data	EQU 0CFCH	;32 位配置数据端口
IO_PLX_ID	EQU 200810B5H	;PCI 卡设备及厂商 ID
BADR0	=	10H	;基地址寄存器 0
BADR1	=	14H	;基地址寄存器 1
BADR2	=	18H	;基地址寄存器 2
BADR3	=	1CH	;基地址寄存器 3
FINDPCI	PROC	NEAR	;查找 PCI 卡资源并显示
PUSHAD PUSHFD
MOV	EBX,080000000H
FINDPCI_next:
ADD	EBX,100H
CMP	EBX,081000000H
JNZ	findpci_continue
MOV	DX,offset pcicardnotfind	;显示未找到 PCI 卡提示信息
MOV	AH,09H
INT	21H
MOV	AH,4CH
INT	21H	;退出
findpci_continue:
MOV
MOV	DX,IO_port_addre
EAX,EBX	
OUT	DX,EAX	;写地址口
MOV	DX,IO_port_data	
IN	EAX,DX	;读数据口
CMP
JNZ	EAX,IO_PLX_ID
findpci_next	;检查是否发现 PCI 卡
MOV	DX,IO_port_addre	
MOV	EAX,EBX	
ADD	EAX,BADR1	
OUT	DX,EAX	;写地址口
MOV	DX,IO_port_data	
IN	EAX,DX	;读数据口
MOV	dword ptr IO_9054base_address,EAX	
AND	EAX,1	
JZ	findPCI_next	;检查是否为 i/o 基址信息
MOV	EAX,dword ptr IO_9054base_address	
AND	EAX,0fffffffeh	
MOV	dword ptr IO_9054base_address,EAX	;去除 i/o 指示位并保存
MOV	DX,IO_port_addre	
MOV	EAX,EBX	
ADD
OUT	EAX,BADR2
DX,EAX	;写地址口
MOV	DX,IO_port_data	
IN	EAX,DX	;读数据口
 

MOV AND	dword ptr IO_base_address,EAX EAX,1	
JZ	findPCI_next	;检查是否为 i/o 基址信息
MOV	EAX,dword ptr IO_base_address	
AND	EAX,0fffffffeh	
MOV	dword ptr IO_base_address,EAX	;去除 i/o 指示位并保存
MOV     DX,offset good	;显示开始执行程序信息
MOV    AH,09H
INT    21H
POPfd POPad RET
findPCI	ENDP
MY_CODE	ENDS END START
发布了61 篇原创文章 · 获赞 61 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42475914/article/details/103584469