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