微机原理实验报告讲解Word下载.docx
《微机原理实验报告讲解Word下载.docx》由会员分享,可在线阅读,更多相关《微机原理实验报告讲解Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
南北绿,东西红,写入C口
MOVCX,0;
送入初值65536(FFFF+1)
MOVAX,4000H;
软件长延时
DELAY1:
DECAX
JNZDELAY1
LOOPDELAY1;
双重循环
MOVBL,5;
黄灯闪5次
SECOND:
MOVDX,0EC0AH
MOVAL,01000100B
南北黄,东西红,写入C口
MOVCX,3000H;
写入初值
MOVAX,0100H;
延时
LI1:
DECAX
JNZLI1
LOOPLI1;
双循环
MOVDX,0EC0AH
MOVAL,00000100B;
南北黄灭,写入C口
WEN1:
JNZWEN1;
软件短延时
LOOPWEN1
DECBL
JNZSECOND;
THIRD:
写入C口
MOVAL,10000001B
南北红,东西绿,写入C口
MOVCX,0;
送初值65536
DELAY2:
JNZDELAY2
LOOPDELAY2
FORTH:
MOVAL,10000010B
南北红,东西黄,写入C口
送初值
短延时
LI2:
JNZLI2;
LOOPLI2
C口
MOVAL,10000000B
东西黄灭,写入C口
WEN2:
JNZWEN2
LOOPWEN2
JNZFORTH;
MOVDL,0FFH
MOVAH,06H
INT21H;
执行键盘输入操作
JZFIRST;
若没有输入,继续循环;
若有输入,返回操作系统
MOVAH,4CH
返回操作系统
CODEENDS
六、实验遇到的问题和解决方法
问题:
绿灯灭后黄灯没有出现闪烁的效果,一直保持常亮
解决方法:
修改程序,通过利用异或和循环指令使绿灯灭、红灯亮后,黄灯口的状态从0到1循环变换,并通过调用延迟子程序,从而实现人眼可辨的黄灯闪的效果。
七、总结
这是第一次的微机原理实验,实验内容是I/O地址译码与交通灯控制实验。
以前的实验譬如数电实验,模电实验,信号系统研学,都是要么是硬件实验,要么是软件实验,这样又要连接电路,又要编写程序的实验这还是第一次做,因此这次实验对我来说是一次全新的体验。
通过这次实验使我更加深入地了解微机接口和汇编语言,对8255的芯片了解以及编程的学习不仅停留在书本上,自己的动手能力也得到了很大的提升,在实践的同时也进一步巩固了微机原理的基础知识。
实验二:
可编程定时器/计数器
掌握8253的基本工作原理和编程方法。
1.按图中虚线连接电路,将计数器0设置为方式0,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。
2.按图5-2连接电图,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率1HZ)。
1.8253控制寄存器地址283H
计数器0地址280H
计数器1地址281H
CLK0连接时钟1MHZ。
2.参考流程图:
四、实验原理
8253具有3个独立的计数通道,采用减1计数方式。
在门控信号有效时,每输入1个计数脉冲,通道作1次计数操作。
当计数脉冲是已知周期的时钟信号时,计数就成为定时。
作计数器时,要求计数的次数可直接作为计数器的初值预置到减“1”计数器中。
8253中各通道可有6种可供选择的工作方式,以完成定时、计数或脉冲发生器等多种功能。
本实验用到的是方式0—计数结束中断。
在写入计数值N之后的第一个CLK的下降沿将N装入计数执行单元,待下一个CLK的下降沿到来且门控信号GATE为高电平时,通道开始启动计数。
在计数过程中,OUT一直保持低电平,直到计数达“0”时,OUT输出由低电平变为高电平,并且保持高电平。
8253动态分配地址:
控制寄存器:
0C403H
计数器0地址:
0C400H
计数器1地址:
0C401H
五、实验程序源代码
DATASEGMENT
CHLDB0AH,0DH,'
$'
;
换行指令
DATAENDS
STACK1SEGMENTSTACK
DW100DUP(?
)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,SS:
STACK1,DS:
DATA
MOVAX,DATA
MOVDS,AX
MOVAL,10H;
设置控制字00010000B(计数器0,方式0,写两个字节,二进制计数)
MOVDX,0EC03H;
写计数器0控制字
OUTDX,AL
MOVDX,0EC00H;
将计数初值0FH写入计数器0
MOVAL,0FH
MOVCL,0FH;
给参考变量附初值0FH
LP1:
MOVAL,00H;
将当前AL中存储的计数值锁存
MOVDX,0EC03H
读计数值
INAL,DX
CMPCL,AL;
执行一次循环后,CL减1。
而AL中计数值变换的速度由人手按键的速度决定。
所以,为了避免在该段时间里,在1MHz时钟作用下不断重复输出同一计数值,我们利用CL与锁存的AL值进行比较的方法,是每个计数值在屏幕上只显示一次
JNZLP1
DECCL
CALLDISP;
调用DISP子程序
PUSHDX;
将DX内容保存到堆栈段(因为DX装有端口地址所对应的值,在后续程序中要用到DX,所以先将值放入堆栈保存)
MOVDL,0FFH;
执行按键输入操作
MOVAH,06H
INT21H
MOVDX,OFFSETCHL;
输出换行
MOVAH,09H
INT21H
POPDX;
将DX的内容推出栈段
INAL,DX
CMPAL,0
JNZLP1;
如果DX的内容是0,就跳转到LP1
MOVAH,4CH;
DISPPROCNEAR;
定义一个名为DISP的子程序
把DX的内容保存到堆栈段中
ANDAL,0FH;
将AL寄存器的内容与0FH进行“与”运算,再把结果存入AL中
MOVDL,AL;
将AL的值送入DL寄存器
CMPDL,9;
比较DL中的值与9的大小
JLENUM;
如果DL的值小于或等于9时,则跳转到NUM
ADDDL,7;
将DL的值与7进行相加后,再送入DL中(在十六进制条件下,从10到15分别由A到F表示)
NUM:
ADDDL,30H;
将DL的值与30H进行相加后,再送入DL中
MOVAH,02H;
将02H存入AH
调用DOS21中断
RET;
子程序在功能完成后返回调用程序继续执行
DISPENDP
CODEENDS
ENDSTART
实验二:
XDB?
STACK1SEGMENTSTACK
CODE,DS:
DATA,SS:
STACK1
MOVDX,0EC03H
MOVAL,36H;
计时器0控制字(计数器0,方式3,写两个字节,二进制计数)
将AL的值送入DX端口
MOVAX,1000;
写初值
MOVDX,0EC00H
MOVAL,AH;
将AX的高8位存入AL寄存器中
MOVAL,76H;
计数器1控制字(计数器1,方式3,写两个字节,二进制计数)
MOVAX,1000
MOVDX,0EC01H
写入计数器1低字节
写入计数器1高字节
MOVAH,4CH
ENDSTART
六、总结
有了第一次微机实验的经验之后,我这次在实验前做了充足的预习工作,已经将程序写好,检查无误,只需要在实验室连接外部电路,调试程序即可,因此实验进行得很顺利。
这次实验是针对可编程定时时钟/计数器(8253),8253有六种工作方式,我在实验中主要用到了8253的工作方式0和工作方式3,此外调用了02号功能单字符输出显示,以及09号功能输出显示字符串,我在做宏汇编研究性学习的时候就已经研究过这两个功能的使用方法,所以这次使用得心应手,要注意的是:
执行02号功能必须进行ASSIC码转换,执行09号功能必须在字符串结尾写一个符号'
,表示字符串结束。
此外,在实验老师的指导下,我进一步熟悉了调试的方法,之前只会F8单步调试,但是在遇到很长的循环程序时,就不能单步调试的了,通过这次实验我学会了如何使用F4让程序进行到任意指定位置,这样就可以跳过循环继续执行代码。
实验三、PC机串行通信
1、进一步了解串行通信的基本原理。
2、掌握串行接口芯片8250的工作原理和编程方法。
3、熟悉PC机串行口的基本连接方法
1、PC机RS-232串口自发自收。
按照PC机串口自发自收的连接方法连线。
编写PC机自发自收串行通信程序,要求:
从键盘输入一个字符,将字符通过串口发送出去,再由此串口将字符接收回来并在屏幕上显示,实现自发自收。
2、两台PC机间RS-232串口通信。
按照PC机RS-232串口直接互连的方法连接两台PC机。
编写PC机直接互连串行通信程序;
要求:
由甲机键盘键入字符经串口发送给乙机,再由乙机通过串口接收字符并显示在屏幕上。
当键入感叹号“!
”,结束收发过程。
三、实验原理及提示
1.连线图
2.8250寄存器地址
PC机自带两个串口,分为COM1和COM2,地址分别在3F8-3FFH,2F8-2FFH,接口芯片选用8250。
8250片内有10个寄存器,其中有几个是共用地址的,其识别由线路控制寄存器(LCR)的最高位DLAB来决定。
各寄存器的地址和格式如下所示:
四、程序源代码
1.自发自收程序:
CHLDB0AH,0DH,'
换行字符串
STACK1SEGMENTSTACK;
定义堆栈段
DW100DUP(0)
MOVDS,AX
;
--------------INIT----------------
MOVDX,3FBH;
8250初始化
MOVAL,80H;
DLAB=1
OUTDX,AL
MOVAX,0CH;
N=12BAUD=9600bps
MOVDX,3F8H;
写除数寄存器,低位
MOVAL,AH;
写除数寄存器,高位
INCDX
MOVAL,03H;
八位数据,1停止,无校验
线路控制REG
MOVAL,0;
屏蔽全部中断
MOVDX,3F9H
WAIT1:
MOVDX,3FDH;
读线路状态寄存器
TESTAL,1EH;
判断是否有错
JNZERROR
TESTAL,01H;
判断是否收到
JNZRECEIVE
TESTAL,20H;
判断发送端是否空
JZWAIT1
六号功能调用读入待发送数据
写发送REG
JMPWAIT1;
返回WAIT1
CHAR:
PUSHAX
显示接收
MOVAH,02H
POPAX
JMPWAIT1
ERROR:
MOVDX,3FDH
MOVDL,'
?
'
对于错误显示'
"
RECEIVE:
MOVDX,3F8H
INAL,DX;
读数据接收寄存器
CMPAL,'
!
判断是否结束
JNECHAR
------------------------------
MOVAH,4CH
INT21H
2.两台PC机间RS-232串口通信:
(1)发送端:
CODESEGMENT
CODE
8250初始化,设DLAB=1
MOVDX,3FBH
MOVAX,30H
MOVDX,3F8H
写入除数低字节
MOVAL,AH
写入除数高字节
MOVAL,0AH;
7位数据,1位停止,奇校验
写入线路控制寄存器
请求发送、数据终端就绪:
00000011
MOVDX,3FCH
写入Modem控制寄存器
MOVAL,0
MOVDX,3F9H
写中断允许寄存器,屏蔽所有中断
出错否
JNZERROR
接收数据就绪否
JNZSEND;
发送
发送寄存器空否,不空,返回等待
JZWAIT1
SEND:
MOVAH,1
读键盘
CMPAL,21H;
是'
JZEXIT;
是,返回操作系统
MOVDX,3F8H;
不是,则发送
OUTDX,AL
返回等待
出错则清除线路状态寄存器
显示'
JMPWAIT1
EXIT:
MOVDX,3F8H
(2)接收端:
MOVAX,30H;
写除数
MOVAL,0AH
MOVDX,3FBH
写入线路控制寄存器
MOVAL,03H
写中断允许寄存器,屏蔽所有中断
JNZRECEIVE;
转接收
均返回等待
读接收数据
ANDAL,01111111B;
保留位数据
JNZCHAR
MOVDL,AL
MOVAH,2;
显示接受字符
五、实验总结
在这次实验中,PC机RS-232串口自发自收实验进行得比较顺利,但是在两台PC机间RS-232串口通信时,遇到了问题:
实验题目要求从键盘输入“!
”时,结束双机通信,可是我作为发送端可以在输入感叹号时立即结束通信并返回DOS,而对方接收端确认就处于等待接收的状态。
一开始,我认为一定是接收端的程序有漏洞,反复检查与调试运行都没有发现问题,然后冷静下来重新审查全部程序,发现竟然是发送端的错误,当判断出此刻输入的是感叹号时,没有将感叹号发送给对方,就立即结束了发送程序,接收方一直接收不到代表终止通信命令的感叹号,所以一直在等待接收。
由此我认识到排查错误时一定要全面考虑,错误的发生点不一定是错因的根节点,某一环节出现错误或是有所遗漏,即使不会对当前部分有影响,也会埋下隐患,对其他环节造成不利影响,尤其是通信过程每一环节都要做到面面俱到,万无一失,才能保证提供可靠的通信质量。
实验四:
竞赛抢答器
通过本实验锻炼接口技术完成一个较大的综合设计,学会综合使用本课程中的接口芯片、中断、定时、DOS功能调用等知识,学会多种接口的配合使用,掌握软件、硬件协同工作,掌握微机原理与接口技术的综合应用。
(1)了解微机化竞赛抢答器的基本原理。
(2)掌握微机通过8255A控制七段数码管的原理。
(3)掌握并行接口8255、中断、定时、D0S功能综合应用。
图为竞赛抢答器(模拟)的原理图,逻辑开关K0~K7代表竞赛抢答按钮0~7号,当某个逻辑电平开关置“1”时,相当某组抢答按钮按下。
在七段数码管上将其组号(0~7)显示出来,并使喇叭响一下。
从键盘上按空格键开始下一轮抢
答,按其它键程序退出。
设置8255为C口输入、A口输出,读取C口数据,若为0表示无人抢答,若不为0则有人抢答。
根据读取数据可判断其组号。
从键盘上按空格键开始下一轮抢答,按其它键程序退出。
响铃的DOS功能调用:
MOVDL,7;
响铃ASCII码为07
MOVAH,2
INT21H
二、实验流程图
四、实验源代码
LISTDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H;
共阴极数码管的0~9的LED显示器七段显示代码
DW100HDUP(0)
MOVDS,AX;
数据段段基值送入DS寄存器
MOVDX,0EC0BH
MOVAL,89H;
10001001B,即A口方式0,A口输出,C口输入
对8255进行初始化
L0:
MOVDX,0EC0AH
读C口状态
CMPAL,0;
如果为0则循环
JZL0
如果开关K0~K8状态发生改变,那么便跳出上述循环,进入如下程序
MOVBL,0
L1:
INCBL
SHRAL,1;
将AL逻辑右移
JNCL1
DECBL
MOVAL,BL;
求出开关号码
MOV