10211004 程煜钧 北京交通大学微机原理实验报告.docx

上传人:b****6 文档编号:7976851 上传时间:2023-01-27 格式:DOCX 页数:31 大小:434.30KB
下载 相关 举报
10211004 程煜钧 北京交通大学微机原理实验报告.docx_第1页
第1页 / 共31页
10211004 程煜钧 北京交通大学微机原理实验报告.docx_第2页
第2页 / 共31页
10211004 程煜钧 北京交通大学微机原理实验报告.docx_第3页
第3页 / 共31页
10211004 程煜钧 北京交通大学微机原理实验报告.docx_第4页
第4页 / 共31页
10211004 程煜钧 北京交通大学微机原理实验报告.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

10211004 程煜钧 北京交通大学微机原理实验报告.docx

《10211004 程煜钧 北京交通大学微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《10211004 程煜钧 北京交通大学微机原理实验报告.docx(31页珍藏版)》请在冰豆网上搜索。

10211004 程煜钧 北京交通大学微机原理实验报告.docx

10211004程煜钧北京交通大学微机原理实验报告

微机原理实验报告

 

姓名:

程煜钧

学号:

10211004

班级:

通信1001

实验一:

交通灯控制实验

一、实验目的

1、掌握并行接口8255的基本原理

2、掌握8255的编程方法

3、掌握利用X86汇编语言技巧

二、实验内容

如图,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东西路口的交通灯与PC2、PC1、PC0相连。

编程使六个灯按交通灯变化规律燃灭。

十字路口交通灯的变化规律要求:

(1)南北路口的绿灯、东西路口的红灯同时亮3秒左右。

(2)南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮。

(3)南北路口的红灯、东西路口的绿灯同时亮3秒左右。

(4)南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁若干次。

(5)转

(1)重复。

 

各地址分析:

8255控制寄存器端口地址28BH

A口的地址288H

C口的地址28AH

三、实验流程图

四、实验用源程序

CODESEGMENT

ASSUMECS:

CODE

START:

MOVDX,0EC0BH;8255初始化,写控制寄存器

MOVAL,10010000B;

OUTDX,AL

FIRST:

MOVDX,0EC0AH;C口地址

MOVAL,00100100B

OUTDX,AL;南北绿,东西红,写入C口

MOVCX,0;送入初值65536(FFFF+1)

MOVAX,4000H;软件长延时

DELAY1:

DECAX

JNZDELAY1

LOOPDELAY1;双重循环

MOVBL,5;黄灯闪5次

SECOND:

MOVDX,0EC0AH

MOVAL,01000100B

OUTDX,AL;南北黄,东西红,写入C口

MOVCX,3000H;写入初值

MOVAX,0100H;延时

LI1:

DECAX

JNZLI1

LOOPLI1;双循环

MOVDX,0EC0AH

MOVAL,00000100B;南北黄灭,写入C口

OUTDX,AL

MOVCX,3000H;写入初值

MOVAX,0100H;延时

WEN1:

DECAX

JNZWEN1;软件短延时

LOOPWEN1

DECBL

JNZSECOND;黄灯闪5次

THIRD:

MOVDX,0EC0AH;写入C口

MOVAL,10000001B

OUTDX,AL;南北红,东西绿,写入C口

MOVCX,0;送初值65536

MOVAX,4000H;软件长延时

DELAY2:

DECAX

JNZDELAY2

LOOPDELAY2

MOVBL,5;黄灯闪5次

FORTH:

MOVDX,0EC0AH;写入C口

MOVAL,10000010B

OUTDX,AL;南北红,东西黄,写入C口

MOVCX,3000H;送初值

MOVAX,0100H;短延时

LI2:

DECAX

JNZLI2;软件短延时

LOOPLI2

MOVDX,0EC0AH;C口

MOVAL,10000000B

OUTDX,AL;东西黄灭,写入C口

MOVCX,3000H;送初值

MOVAX,0100H;短延时

WEN2:

DECAX

JNZWEN2

LOOPWEN2

DECBL

JNZFORTH;黄灯闪5次

MOVDL,0FFH

MOVAH,06H

INT21H;执行键盘输入操作

JZFIRST;若没有输入,继续循环;若有输入,返回操作系统

MOVAH,4CH

INT21H;返回操作系统

CODEENDS

五、实验总结

这是我们微机实验的第一次实验,以前的实验都是要么是硬件实验,要么是软件实验,这样又要连接电路,又要编写程序的实验这还是我第一次做,因此这次实验对我来说是一次全新的体验。

这次实验我更加深入地了解了微机接口和汇编语言,对8255的芯片了解以及编程的学习不仅停留在书本上,自己的动手能力也得到了很大的提升。

实验二:

可编程定时器/计数器

一、实验目的

(1)掌握8253A与X86微处理硬件连接原理

(2)掌握8253A计数定时应用编程

(3)熟悉掌握8253A在PC机系统中典型应用方法并思考如何应用在其他系统中。

二、实验内容

1、按图虚线连接电路,将计数器0设置为工作方式0,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0遍高电平)。

2、按图连接电路,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率1Hz)。

 

8253控制寄存器地址283H动态分配地址0EC03H

计数器0地址280H动态分配地址0EC00H

计数器1地址281H动态分配地址0EC01H

CLK0连接时钟1MHZ。

三、实验流程图

四、实验源代码

实验1:

DATASEGMENT;定义数据段

ADB0A

DATAENDS

STACK1SEGMENTSTACK;定义堆栈段

DW100DUP(?

STACK1ENDS

CODESEGMENT;定义代码段

ASSUMECS:

CODE,DS:

DATA,SS:

STACK1

MOVAX,DATA

MOVDS,AX

MOVAL,10H;写入控制字

MOVDX,0EC03H

OUTDX,AL;初始化,写控制寄存器

MOVAL,10;写计数器初值

MOVDX,0EC00H

OUTDX,AL;写入计数器0

Lop1:

MOVDX,0EC00H

INAL,DX;读计数器0中数据

CMPAL,A;检测数值是否发生变化

JALOP1

CMPAL,9;转换ASCII码

JLELOP2

ADDAL,07H

LOP2:

ADDAL,30H

MOVDL,AL

MOVAH,02H;2号功能,显示计数器0的值

INT21H

DECA;初值减1,继续循环

JNSLOP1

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

 

实验2:

STACK1SEGMENTSTACK;定义堆栈段

STACK1ENDS

CODESEGMENT

ASSUMECS:

CODE,SS:

STACK1

START:

MOVAL,00110110B;计数器0,先读写低字节,再读写高字节,方波发生器,工作方式3

MOVDX,0EC03H;控制寄存器地址

OUTDX,AL;写入控制字

MOVDX,0EC00H;计数器0

MOVAX,1000;计数初值1000

OUTDX,AL;写入计数器0计数初值的低位

MOVAL,AH

OUTDX,AL;写入计数器0计数初值的高位

MOVAL,01110110B;计数器1,先读写低字节,再读写高字节,方波发生器,工作方式3

MOVDX,0EC03H;控制寄存器地址

OUTDX,AL;写入控制字

MOVDX,0EC01H

MOVAX,1000;写入计数器1计数初值的低位

OUTDX,AL

MOVAL,AH

OUTDX,AL;写入计数器1计数初值的高位

MOVAH,4CH;返回DOS程序

INT21H

CODEENDS

ENDSTART

五、实验总结

通过这次实验,我再一次巩固了8253的初始化、工作方式以及编程的方法等等。

在此次实验中我从前一次的实验的什么都不知道的状态中走了出来,能比较熟练地使用该调试软件。

而在硬件连接方面,我也能按照电路图熟悉地连接出来。

在实验过程中,一开始出现了输入程序,屏幕无反应的情况,之后检查才发现原来是我的程序的入口地址写错了。

因此这次实验同时也提醒我无论做什么事情都需要踏实认真,这样才能将事情做好。

 

实验三:

可编程中断控制器

一、实验目的

(1)掌握8259A可编程中断控制器中断基本原理。

(2)掌握中断源、中断处理过程、中断向量表建立、DOS的使用。

(3)熟悉主程序、中断服务程序编写,了解中断相应过程。

二、实验原理

PC机用户可使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。

中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU发出可屏蔽中断请求。

IBMPC、PC/XT机内有一片8259中断控制器对外可以提供8个中断源:

中断源中断类型号中断功能

IRQ008H时钟

IRQ109H键盘

IRQ20AH保留

IRQ3OBH串行口2

IRQ40CH串行口1

IRQ50DH硬盘

IRQ60EH软盘

IRQ70FH并行打印机

而此次实验的内容是利用手动产单脉冲作为中断请求信号,要求每按一次开关产生一次中断在屏幕上显示一次“TPCpcicardInterrupt”中断10次后程序退出

图3-1IRQ实验电路

实验电路如图3-1直接用手动产单脉冲作为中断请求信号,只需连接一根导线,要求每按一次开关产生一次中断。

三、实验流程图

四、实验源代码

datasegment

int_vectEQU073H;IRQ2的中断类型号为073H

irq_mask_2_7equ11111011b;中断掩码

irq_mask_9_15equ11110111b;中断0-7时全一,中断8-15时从低至高相应位为零

ioport_centequ0E800h;tpc卡中9054芯片的io地址

csregdw?

ipregdw?

;旧中断向量保存空间

irq_timesdw00h;中断计数

msg1db0dh,0ah,'TPCpcicardInterrupt',0dh,0ah,'$'

msg2db0dh,0ah,'Pressanykeytoexit!

',0dh,0ah,'$'

msg3db0dh,0ah,'PressDMCtointerrupt10timesandexit!

',0dh,0ah,'$'

dataends

stacksegmentstack;定义堆栈段

db100dup(?

stackends

codesegment

assumecs:

code,ds:

data,ss:

stack,es:

data

start:

;EnableLocalInterruptInput.386

cli;中断标志置0,IF=0,关中断

movax,data

movds,ax

moves,ax;ES指向AX

movax,stack;装入堆栈

movss,ax

movdx,ioport_cent+68h;设置tpc卡中9054芯片io口,使能中断

inax,dx

orax,0900h

outdx,ax

moval,int_vect;保存原中断向量,送AL

movah,35h;DOS35号功能调用

int21h

movax,es

movcsreg,ax;存入旧中断向量

movipreg,bx

movax,segint_proc;设置新中断向量

movds,ax;中断服务程序入口段基址送DS

movdx,offsetint_proc;中断服务程序入口偏移地址送DX

moval,int_vect;(AL)=073H,IRQ2的中断类型号送AL

movah,25h;DOS25号功能调用

int21h

inal,21h;设置中断掩码

andal,irq_mask_2_7;主片OCW1,主片IMR的D2置0

out21h,al

inal,0a1h

andal,irq_mask_9_15;从片OCW1,从片IMR的D3置0

out0a1h,al

 

movax,data

movds,ax

movdx,offsetmsg2

movah,09h;DOS9号功能调用,字符串输出

int21h

movdx,offsetmsg3

movah,09h;DOS9号功能调用,字符串输出

int21h

movirq_times,0ah;设置中断次数为10次

sti;IF=1,开中断

loop1:

cmpirq_times,0;等待中断并判断中断10次后退出

jzexit

movah,1;

int16h;

jnzexit;按任意键退出

jmploop1

exit:

cli;中断标志置0,IF=0,关中断

movbl,irq_mask_2_7;恢复中断掩码

notbl

inal,21h

oral,bl;恢复al

out21h,al;写主片OCW1

movbl,irq_mask_9_15

notbl;

inal,0a1h

oral,bl;

out0a1h,al;写从片OCW1

movdx,ipreg;恢复原中断向量

movax,csreg

movds,ax

movah,25h

moval,int_vect

int21h

movdx,ioport_cent+68h;设置tpc卡中9054芯片io口,关闭中断

inax,dx

andax,0f7ffh

outdx,ax

movax,4c00h;返回dos

int21h

int_procprocfar

pushax;保护现场

pushdx

pushds

decirq_times

movax,data;Interrupttodo

movds,ax

movdx,offsetmsg1;显示字符串

movah,09h

int21h

moval,20h;SendEOI,写OCW2

out0a0h,al;写从片

out20h,al;写主片

popds;恢复现场

popdx

popax

sti;开中断

iret;中断返回

int_procendp

codeends

endstart

 

五、总结

此次中断的实验,这次实验是在纯DOS的环境下操作的,因此这次实验我学会了可编程中断控制器8259的结构、中断申请、中断响应、中断处理、中断返回等中断原理,还学习到了一些在DOS操作系统下的指令和操作方法。

这次实验老师说比较难因此给了我们源程序,虽然一开始对这个很长的程序感到很头疼,不过最后还是硬着头皮把这段程序看完了,之中也请过助教学长学姐,也对程序的理解更深地理解了一层。

 

实验四:

模/数转换器ADC0809实验

一、实验目的

(1)掌握单通道模拟信号采集到数据处理方法

(2)掌握采集电路和计算机连接的硬件电路设计

(3)熟悉多通道模拟信号采集到数据处理方法

(4)了解模/数转换的基本原理,掌握ADC0809的使用方法。

二、实验内容

1.硬件电路原理

实验电路原理图如图。

通过实验台左下角电位器RW1输出0~5V直流电压送入ADC0809通道0(IN0),编程采集IN0输入的电压,在屏幕上显示出转换后的数据(用16进制数)

2.软件设计

(1)ADC0809的IN0口地址为298H,IN1口地址为299H。

(2)IN0单极性输入电压与转换后数字的关系为:

其中Ui为输入电压,UREF为参考电压,这里参考电压为PC的机+5V电源。

(3)一次A/D转换的程序可以为

MOVDX,口地址;启动转换

OUTDX,AL

;延时

INAL,DX;读取转换结果放在AL中

三、实验流程图

四、实验源代码

codesegment

assumecs:

code

start:

movdx,0EC18H;启动A/D转换器,写入A/D转换器

outdx,al

movcx,0;双重嵌套,起延时作用

MOVAX,4000H

delay:

DECAX

JNZDELAY

loopdelay

inal,dx;从A/D转换器读数据

movbl,al;将AL保存到BL

movcl,4

shral,cl;将AL右移四位

calldisp;调显示子程序显示其高四位

moval,bl;重新赋予al

andal,0fh;消除高四位

calldisp;调显示子程序显示其低四位

movah,02;显示回车符

movdl,20h;加回车符

int21h

movah,06h;判断是否有键按下

movdl,0ffh

int21h

JZstart;若没有转START

movah,4ch;若有,退出

int21h

dispprocnear;显示子程序

movdl,al

cmpdl,9;比较DL是否>9

jleddd;若不大于则为'0'-'9',加30h为其ASCII码

adddl,7;否则为'A'-'F',再加7

ddd:

adddl,30h

movah,02;显示功能

int21h

ret

dispendp

codeends

endstart

 

五、总结

有了前几次实验的经验,这次实验对我来说变得容易了很多。

这次数模转换实验硬件连接并不算难,程序也不算难,不过数模转换在实际的应用中是十分广泛的。

通过本次的AD实验,我学会了如何让A/D转换器与计算机连接,以及如何初始化等等。

实验五:

双机串行通讯

一、实验目的

(1)了解串行通信的基本原理、掌握异步通信协议

(2)掌握串行接口芯片8250的工作原理和编程方法。

(3)熟悉PC机串行口的基本连接方法

二、实验内容

1、PC机RS-232串口自发自收。

按照PC机串口自发自收的连接方法连线。

编写PC机自发自收串行通信程序,要求:

从键盘输入一个字符,将字符通过串口发送出去,再由此串口将字符接收回来并在屏幕上显示,实现自发自收。

2、两台PC机间RS-232串口通信。

按照PC机RS-232串口直接互连的方法连接两台PC机。

编写PC机直接互连串行通信程序;要求:

由甲机键盘键入字符经串口发送给乙机,再由乙机通过串口接收字符并显示在屏幕上。

当键入感叹号“!

”,结束收发过程。

三、实验源代码

自发自收程序:

DATASEGMENT

CHLDB0AH,0DH,'$';换行字符串

DATAENDS

STACK1SEGMENTSTACK;定义堆栈段

DW100DUP(0)

STACK1ENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK1

START:

MOVAX,DATA

MOVDS,AX

;--------------INIT----------------

MOVDX,3FBH;8250初始化

MOVAL,80H;DLAB=1

OUTDX,AL

MOVAX,0CH;N=12BAUD=9600bps

MOVDX,3F8H;写除数寄存器,低位

OUTDX,AL

MOVAL,AH;写除数寄存器,高位

INCDX

OUTDX,AL

MOVAL,03H;八位数据,1停止,无校验

MOVDX,3FBH;线路控制REG

OUTDX,AL

MOVAL,0;屏蔽全部中断

MOVDX,3F9H

OUTDX,AL

WAIT1:

MOVDX,3FDH;读线路状态寄存器

INAL,DX

TESTAL,1EH;判断是否有错

JNZERROR

TESTAL,01H;判断是否收到

JNZRECEIVE

TESTAL,20H;判断发送端是否空

JZWAIT1

MOVDL,0FFH;六号功能调用读入待发送数据

MOVAH,06H

INT21H

JZWAIT1

MOVDX,3F8H;写发送REG

OUTDX,AL

JMPWAIT1;返回WAIT1

CHAR:

PUSHAX

MOVDL,AL;显示接收

MOVAH,02H

INT21H

POPAX

JMPWAIT1

ERROR:

MOVDX,3FDH

INAL,DX

MOVDL,'?

';对于错误显示'?

"

MOVAH,02H

INT21H

JMPWAIT1

RECEIVE:

MOVDX,3F8H

INAL,DX;读数据接收寄存器

CMPAL,'!

';判断是否结束

JNECHAR

;------------------------------

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

 

双机通信发送端:

CODESEGMENT

ASSUMECS:

CODE

START:

MOVAL,80H;8250初始化,设DLAB=1

MOVDX,3FBH

OUTDX,AL

MOVAX,30H

MOVDX,3F8H

OUTDX,AL;写入除数低字节

MOVAL,AH

INCDX

OUTDX,AL;写入除数高字节

MOVAL,0AH;7位数据,1位停止,奇校验

MOVDX,3FBH

OUTDX,AL;写入线路控制寄存器

MOVAL,03H

MOVDX,3FCH

OUTDX,AL;写入Modem控制寄存器

MOVAL,0

MOVDX,3F9H

OUTDX,AL;写中断允许寄存器,屏蔽所有中断

WAIT1:

MOVDX,3FDH;读线路状态寄存器

INAL,DX

TESTAL,1EH;出错否

JNZERROR

TESTAL,01H;接收数据就绪否

JNZSEND;发送

TESTA

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

当前位置:首页 > 外语学习 > 法语学习

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

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