微机原理与接口技术实验报告.docx
《微机原理与接口技术实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术实验报告.docx(42页珍藏版)》请在冰点文库上搜索。
微机原理与接口技术实验报告
微机原理与接口技术
实验报告
班级:
自动化(铁道信号)
姓名:
*****
学号:
1121****
授课教师:
福恩
1.实验一3
2.实验二8
3.实验三13
4.实验四22
5.实验五26
6.实验六33
7.参考文献38
实验一交通灯控制实验
一.实验目的
通过应用接口技术设计十字路口、复杂路口交通灯控制系统,学会应用“微机原理与接口技术”课程所学的X86汇编语言和接口技术掌握可编程并行接口芯片的硬件设计、软件编程,实现十字路口交通灯的模拟控制并思考计算机如何应用在各种控制系统中。
(1)掌握利用X86汇编语言技巧
(2)掌握X86微处理器与可编程并行接口芯片8255A硬件电路设计
(3)熟悉模拟交通灯控制的实现方法并思考如何应用在实际中。
二.实验容
设计一个交通控制系统,该控制系统工作后,交通灯按照如下规律变化:
(1)南北路口的绿灯、东西路口的红灯同时亮3秒左右。
(2)南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮。
(3)南北路口的红、东西路口的绿灯同时亮3秒。
(4)南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁若干次。
(5)返回
(1)依次循环。
三.实验电路
如下图,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东西路口的交通灯与PC2、PC1、PC0相连。
编程使六个灯按交通灯变化规律燃灭。
8255动态分配地址:
控制寄存器:
0EC0BH
A口地址:
0EC08H
C口地址:
0EC0AH
红黄绿红黄绿
图1-1交通灯实验电路图
四.程序流程图
五.源程序
CODESEGMENT
ASSUMECS:
CODE
;**********************************工作状态控制字设置
START:
MOVDX,0EC0BH;写控制端口,地址0EC0BH
MOVAL,10010000B;C口方式0输出
OUTDX,AL
;**********************************南北路口绿灯亮,东西路口红灯亮
FIRST:
MOVDX,0EC0AH;写PC口,地址0EC0AH
MOVAL,00100100B;南北绿,东西红,PC口写00100100
OUTDX,AL
;------------------------------两层嵌套实现长延时
MOVCX,0;外层循环送入初值65536
MOVAX,2000H;层循环送入初值2000H
DELAY1:
DECAX
JNZDELAY1
LOOPDELAY1
;**********************************南北路口黄灯闪烁,东西路口红灯亮
MOVBL,5;BL控制黄灯亮的次数5次
SECOND:
MOVDX,0EC0AH
MOVAL,01000100B
OUTDX,AL;南北黄,东西红
MOVCX,3000H
MOVAX,0100H
LI1:
DECAX
JNZLI1
LOOPLI1
MOVDX,0EC0AH;短延时
MOVAL,00000100B;南北路口黄灯先灭
OUTDX,AL
MOVCX,3000H
MOVAX,0100H
WEN1:
DECAX
JNZWEN1;短延时
LOOPWEN1
DECBL
JNZSECOND;南北路口黄灯再亮
;**********************************南北路口红灯亮,东西路口绿灯亮
THIRD:
MOVDX,0EC0AH;写入C口
MOVAL,10000001B
OUTDX,AL;南北红,东西绿
MOVCX,0;长延时
MOVAX,2000H
DELAY2:
DECAX
JNZDELAY2
LOOPDELAY2
MOVBL,4;控制黄灯亮的次数
FORTH:
MOVDX,0EC0AH;写入C口
MOVAL,10000010B
OUTDX,AL;南北红,东西黄
MOVCX,3000H
MOVAX,0100H
LI2:
DECAX
JNZLI2;短延时
LOOPLI2
;**********************************南北路口红灯亮,东西路口黄灯闪烁
MOVDX,0EC0AH
MOVAL,10000000B
OUTDX,AL;东西路口黄灯先灭
MOVCX,3000H
MOVAX,0100H
WEN2:
DECAX
JNZWEN2
LOOPWEN2
DECBL
JNZFORTH;东西路口黄灯再亮
MOVDL,0FFH
;**********************************检测是否有键按下,调用6号功能
MOVAH,06H
INT21H;执行键盘输入操作
JZFIRST
MOVAH,4CH
INT21H;返回操作系统
CODEENDS
ENDSTART
六.实验总结
这是我们的首个微机原理实验,对实验箱以及TPC-2003集成开发环境都比较陌生,也没有事先编写好程序,因此时间很紧,今后一定要在实验前做好充分的预习工作,现根据实验指导书上的要求,编写好程序。
这个实验主要是用8255的定时功能来定时,然后使用JZ、JNZ来实现闪烁和红绿灯转换等功能,运用循环进行延时,实验中还使用了6号功能来实现显示的功能。
通过这次实验使我对8255的工作原理、定时功能有了进一步的了解,同时也对汇编的程序结构和调试方法更加熟悉。
一开始,程序编译连接都没有错误,但是有一个红灯一直亮,其他功能均正常,我又去检查程序是否存在逻辑错误,并反调试运行,都不能解决问题,后来在别人的实验箱上就运行成功了,可靠的硬件保障是实验成功的首要条件。
实验二可编程定时器/计数器
一.实验目的
通过实验了解可编程定时器/计数器的本质是计数,学会再设计应用系统中如何用接口芯片实现计数和定时功能,通过实验思考并比较标准TTL集成电路实现计数和可编程定时器/计数器有什么不同,各有哪些特点?
思考计数器可以用哪些场合。
(1)掌握8253A与X86微机处理硬件连接原理。
(2)掌握8253A计数定时应用编程。
(3)熟悉掌握8253A在PC机系统中典型应用方法并思考如何应用在其他系统中。
二.实验容
(1)利用单脉冲发生器作为8253A可编程计数定时器时钟信号,实现N个脉冲后产生输出高电平信号。
(2)利用8253A可编程计数定时器实现产生1S钟定时输出程序设计,输入1MHZ。
三.实验电路
1.按图2.1虚线连接电路,将计数器0设置为方式0,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。
图2.1可编程计时器/计数器电路图一
2.按图2.2连接电路图,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率为1MHz)。
图2.2可编程定时器/计数器电路图二
四.实验原理
8253具有3个独立的计数通道,采用减1计数方式。
在门控信号有效时,每输入1个计数脉冲,通道作1次计数操作。
当计数脉冲是已知周期的时钟信号时,计数就成为定时。
作计数器时,要求计数的次数可直接作为计数器的初值预置到减“1”计数器中。
8253中各通道可有6种可供选择的工作方式,以完成定时、计数或脉冲发生器等多种功能。
方式0—计数结束终端:
在写入计数值N之后的第一个CLK的下降沿将N装入计数执行单元,待下一个CLK的下降沿到来且门控信号GATE为高电平时,通道开始启动计数。
在计数过程中,OUT一直保持低电平,直到计数达“0”时,OUT输出由低电平变为高电平,并且保持高电平。
方式3—方波发生器:
OUT输出低电平, 装入计数值后,OUT立即跳变为高电平。
如果当GATE为高电平, 则立即开始减“1”计数,OUT保持为高电平,若n为偶数,则当计数值减到n/2时,OUT跳变为低电平,一直保持到计数值为“0”,系统才自动重新置入计数值n,实现循环计数。
这时OUT端输出的周期为n×CLKi周期,占空比为1:
1的方波序列; 若n为奇数, 则OUTi端输出周期为n×CLK周期,占空比为((n+1)/2)/((n-1)/2)的近似方波序列。
8253动态分配地址:
控制寄存器:
0EC03H
计数器0地址:
0EC00H
计数器1地址:
0EC01H
CLK0连接时钟:
1MHZ
五.程序流程图
图2.3可编程定时器/计数器流程图
六.源程序
(1)
DATASEGMENT
NEQU0BH;定义计数器初值N,初值N在0到F之,便于字符显示简单
STRINGDB0AH,0DH,'$';定义STRING用来换行,0DH回车,0AH换行,$是字符串的结尾标志
DATAENDS
STACK1SEGMENTSTACK
DW100DUP(0)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
START:
MOVAX,DATA
MOVDS,AX
;*************************************************8253的初始化
MOVDX,0EC03H;控制寄存器地址0EC03H
MOVAL,10H;计数器0:
00,只读/写计数器的低字节:
01,方式0:
000,
;二进制计数:
0,所以控制字写00010000B
OUTDX,AL;写入控制字
MOVDX,0EC00H;计数器0地址0EC00H
MOVAL,N
OUTDX,AL;写入计数初值为N,即0BH,11
MOVCL,N;用CL控制计数N次
L00P:
MOVDX,0EC00H
INAL,DX;读取当前数值
CMPAL,CL
JNEL00P;若AL不等于CL,则继续到L00P循环
DECCL;更改CL值
;*****************************************************单字符输出程序,先转换成ASIIC
MOVDL,AL
CMPDL,09H;转换为ASIIC,0~9的数字加30,A到F加37
JLEADD30
ADDDL,07H;A~F先加7,下一步再加30
ADD30:
ADDDL,30H
MOVAH,02H;02号功能是单字符输出显示,显示计数器当前值
INT21H
;******************************************************
MOVDX,OFFSETSTRING;换行
MOVAH,09H;,
INT21H
CMPCL,0
JNLL00P;循环至CL等于0,即N次
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
(2)
DATASEGMENT
NDB07H
DATAENDS
STACK1SEGMENTPARASTACK
DB20DUP(0)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAL,36H;设置8253计数器0为工作方式3,十进制计数
MOVDX,0EC03H
OUTDX,AL;送方式控制字到控制口
MOVDX,0EC00H
MOVAX,1000;计数初值为1000
OUTDX,AL;送计数初值的低字节到计数器0的端口
MOVAL,AH
OUTDX,AL;送计数初值的高字节到计数器0的端口
MOVAL,76H;设置8253计数器1为工作方式3,十进制计数
MOVDX,0EC03H
OUTDX,AL;送方式控制字到控制口
MOVDX,0EC01H
MOVAX,1000;计数初值为1000
OUTDX,AL;送计数初值的低字节到计数器1的端口
MOVAL,AH
OUTDX,AL;送计数初值的高字节到计数器1的端口
MOVAH,4CH;返回DOS
INT21H
CODEENDS
ENDSTART
七.实验总结
经过第一次实验的教训后,我在实验前做了充足的预习工作,已经将程序写好,只需要在实验室连接外部电路,调试程序即可,因此实验进行得很顺利。
这次实验是针对可编程定时时钟/计数器(8253),8253有六种工作方式,我在实验中主要用到了8253的工作方式0和工作方式3,此外调用了02号功能单字符输出显示,以及09号功能输出显示字符串,我在做宏汇编研究性学习的时候就已经研究过这两个功能的使用方法,所以这次使用得心应手,要注意的是:
执行02号功能必须进行ASSIC码转换,执行09号功能必须在字符串结尾写一个符号'$',表示字符串结束。
此外,在实验老师的指导下,我进一步熟悉了调试的方法,之前只会F8单步调试,但是在遇到很长的循环程序时,就不能单步调试的了,通过这次实验我学会了如何使用F4让程序进行到任意指定位置,这样就可以跳过循环继续执行代码。
实验三、可编程中断控制器
一.实验目的
通过实验了解中断是计算机系统最重要的工作方式之一,理解中断能实现系统协调工作,了解中断在操作系统,工业控制中的应用。
通过实验可学会可编程中断控制器8259的结构、中断申请、中断响应、中断处理、中断返回等中断原理,掌握中断系统的编程与应用。
(1)掌握PC机8259A可编程中断控制器中断基本原理。
(2)掌握中断源、中断处理过程、中断向量表的建立、DOS的使用。
(3)熟悉主程序、中断服务程序编写,了解中断相应过程。
二.实验容
(1)学习PC机系统中断原理
(2)利用手动产单脉冲作为中断请求信号,要求每按一次开关产生一次中断在屏幕上显示一次“TPCpcicardInterrupt”中断10次后程序退出。
三.实验原理
PC机用户可使用的硬件中断只有可屏蔽中断由8259中断控制器管理中断控制器用于接收外部的中断请求信号经过优先级判别等处理后向CPU发出可屏蔽中断请求IBMPC、PC/XT机有一片8259中断控制器对外可以提供8个中断源
中断源中断类型号中断功能IRQ008H时钟
IRQ109H键盘
IRQ20AH保留
IRQ3OBH串行口2
IRQ40CH串行口1
IRQ50DH硬盘
IRQ60EH软盘
IRQ70FH并行打印机
8个中断源的中断请求信号线IRQ0IRQ7在主机的62线ISA总线插座中可以引出系统已设定中断请求信号为边沿触发普通结束方式对于PC/AT及286以上微机又扩展了一片8259中断控制IRQ2用于两片8259之间级连对外可以提供16个中断源
中断源中断类型号中断功能IRQ8070H实时时钟
IRQ9071H用户中断
IRQ10072H保留
IRQ11O73H保留
IRQ12074H保留
IRQ13075H协处理器
IRQ14076H硬盘
IRQ15077H保留
PCI总线中的中断线只有四根INTA#INTB#INTC#INTD#它们需要通过P&P的设置来和某一根中断相连接才能进行中断申请
四.编程提示
1.由于9054的驱动程序影响直写9054芯片的控制寄存器,中断实验需要在纯DOS的环境中才能正常运行。
这里指的纯DOS环境是指微机启动时按F8键进入的DOS环境。
WINDOWS重启进入MSDOS方式由于系统资源被重新规划过,所以也不能正常实验。
2.由于TPC卡使用PCI总线,所以分配的中断号每台微机可能都不同,编程时需要了解当前的微机使用那个中断号并进行设置,获取方法请参看汇编程序使用方法的介绍。
(也可使用自动获取资源分配的程序取得中断号)
3.在纯DOS环境下,有些微机的BIOS设置中有将资源保留给ISA总线使用的选项,致使在纯DOS环境(WINDOWS环境下不会出现此问题)下PCI总线无法获得系统资源,也就无法做实验,这时需要将此选项修改为使用即插即用。
4.在纯DOS环境下,有些微机的BIOS设置中有使用即插即用操作系统的选项,如果在使用即插即用操作系统状态下,BIOS将不会给TPC卡分配系统资源,致使在纯DOS环境(WINDOWS环境下不会出现此问题)下PCI总线无法获得系统资源,也就无法做实验,这时需要将此选项修改为不使用即插即用操作系统。
5.由于TPC卡使用9054芯片连接微机,所以在编程使用微机中断前需要使能9054的中断功能,代码如下:
movdx,ioport_cent+68h;设置tpc卡中9054芯片io口,使能中断
inax,dx
orax,0900h
outdx,ax
其中IOPORT_CENT是9054芯片寄存器组的I/O起始地址,每台微机可能都不同,编程时需要了解当前的微机使用哪段并进行设置,获取方法请参看本书结尾部分的介绍。
(也可使用自动获取资源分配的程序取得),+68H的偏移是关于中断使能的寄存器地址,设置含义如下:
设置INTCSR(68H)寄存器中断模式设置
BITS
功能
8
1:
能够产生PCI中断
0:
禁止产生PCI中断
11
1:
能够LOCAL端输入的中断送到PCI端
0:
禁止LOCAL端输入的中断送到PCI端
其它位为零即可更多容参看9054芯片数据手册
程序退出前还要关闭9054的中断,代码如下:
movdx,ioport_cent+68h;设置tpc卡中9054芯片io口,关闭中断
inax,dx
andax,0f7ffh
outdx,ax
6.PC机中断控制器8259的地址为20H、21H,编程时要根据中断类型号设置中断矢量,8259中断屏蔽寄存器IMR对应位要清零(允许中断),中断服务结束返回前要使用中断结束命令:
MOVAL,20H
OUT20H,AL
中断结束返回DOS时应将IMR对应位置1,以关闭中断。
五.实验电路
实验电路如图,直接用手动产单脉冲作为中断请求信号,只需连接一根导线。
图3.1中断实验电路图
六.流程图
图3.2中断实验流程图
五.源程序
;386以上微机适用
;纯dos下才能使用
;tasm4.1或以上编译
;*********************;
;*中断*;
;*********************;
datasegment
int_vectEQU073H;中断0-7的向量为:
08h-0fh,中断8-15的向量为:
70h-77h
irq_mask_2_7equ11111011b;中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零
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
movax,data
movds,ax
moves,ax
movax,stack
movss,ax
movdx,ioport_cent+68h;设置tpc卡中9054芯片io口,使能中断
inax,dx
orax,0900h
outdx,ax
moval,int_vect;调用35号功能,保存原中断向量int_vect
movah,35h
int21h
movax,es
movcsreg,ax
movipreg,bx;ipregcsreg是旧中断向量保存空间
movax,segint_proc;调用25号功能设置新中断向量
movds,ax;中断服务程序的的段基址送DX
movdx,offsetint_proc;中断服务程序的的偏移地址送DX
moval,int_vect
movah,25h
int21h
inal,21h;设置中断掩码
andal,irq_mask_2_7;主片端口地址21H,D2允许中断11111011b
out21h,al
inal,0a1h
andal,irq_mask_9_15;从片端口地址A1H,D3允许中断11110111b
out0a1h,al
movax,data
movds,ax
movdx,offsetmsg2
movah,09h;09号功能显示'Pressanykeytoexit!
'
int21h
movdx,offsetmsg3;显示'PressDMCtointerrupt10timesandexit!
'
movah,09h
int21h
movirq_times,0ah
sti;允许可屏蔽中断请求进入
loop1:
cmpirq_times,0;等待中断并判断中断10次后退出
jzexit
movah,1;BIOS功能调用int16hah=01H检测字符是否准备好
int16h;ZF=0,表示无字符可接收,ZF=1,表示有字符可接收
jnzexit;按任意键退出IF=1
jmploop1
exit:
cli
movbl,irq_mask_2_7;恢复中断掩码
notbl
inal,21h
oral,bl
out21