微机原理实验报告讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《微机原理实验》
课程实验研究性学习手册
姓名
学号
班级
微机教师
微机实验老师
时间2014年12月
上课时间10-13周
实验一:I/O地址译码与交通灯控制实验
一、实验目的
1、掌握并行接口8255的基本原理
2、掌握8255的编程方法
3、掌握利用X86 汇编语言技巧
二、实验内容
如图,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东
西路口的交通灯与PC2、PC1、PC0相连。

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

三、编程提示
1、8255 控制寄存器端口地址 28BH
A 口的地址 288H
C 口的地址 28AH
2、十字路口交通灯的变化规律要求:
(1)南北路口的绿灯、东西路口的红灯同时亮3秒左右。

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

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

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

(5)转(1)重复。

四、参考流程图
五、实验源程序
CODE SEGMENT
ASSUME CS:CODE
START: MOV DX, 0EC0BH ;8255初始化,写控制寄存器
MOV AL,10010000B ;
OUT DX,AL
FIRST: MOV DX, 0EC0AH ;C口地址
MOV AL,00100100B
OUT DX,AL ;南北绿,东西红,写入C口 MOV CX,0 ;送入初值65536(FFFF+1)
MOV AX,4000H ;软件长延时
DELAY1: DEC AX
JNZ DELAY1
LOOP DELAY1 ;双重循环
MOV BL,5 ;黄灯闪5次
SECOND:MOV DX, 0EC0AH
MOV AL,01000100B
OUT DX,AL ;南北黄,东西红,写入C口 MOV CX,3000H ;写入初值
MOV AX,0100H ;延时
LI1:
DEC AX
JNZ LI1
LOOP LI1 ;双循环
MOV DX, 0EC0AH
MOV AL,00000100B ;南北黄灭,写入C口
OUT DX,AL
MOV CX,3000H ;写入初值
MOV AX,0100H ;延时
WEN1: DEC AX
JNZ WEN1 ;软件短延时
LOOP WEN1
DEC BL
JNZ SECOND ;黄灯闪5次
THIRD: MOV DX, 0EC0AH ;写入C口
MOV AL,10000001B
OUT DX,AL ;南北红,东西绿,写入C口 MOV CX,0 ;送初值65536
MOV AX,4000H ;软件长延时
DELAY2: DEC AX
JNZ DELAY2
LOOP DELAY2
MOV BL,5 ;黄灯闪5次
FORTH: MOV DX, 0EC0AH ;写入C口
MOV AL,10000010B
OUT DX,AL ;南北红,东西黄,写入C口
MOV CX,3000H ;送初值
MOV AX,0100H ;短延时
LI2:
DEC AX
JNZ LI2 ;软件短延时
LOOP LI2
MOV DX, 0EC0AH ;C口
MOV AL,10000000B
OUT DX,AL ;东西黄灭,写入C口
MOV CX,3000H ;送初值
MOV AX,0100H ;短延时
WEN2: DEC AX
JNZ WEN2
LOOP WEN2
DEC BL
JNZ FORTH ;黄灯闪5次
MOV DL,0FFH
MOV AH,06H
INT 21H ;执行键盘输入操作
JZ FIRST ;若没有输入,继续循环;若有输入,返回操作系统
MOV AH,4CH
INT 21H ;返回操作系统
CODE ENDS
六、实验遇到的问题和解决方法
问题:绿灯灭后黄灯没有出现闪烁的效果,一直保持常亮
解决方法:修改程序,通过利用异或和循环指令使绿灯灭、红灯亮后,黄灯口的状态从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
五、实验程序源代码
实验一:
DATA SEGMENT
CHL DB 0AH,0DH,'$' ;换行指令
DATA ENDS
STACK1 SEGMENT STACK
DW 100 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK1,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,10H ;设置控制字00010000B(计数器0,方式0,写两个字节,二进制计数)
MOV DX,0EC03H ;写计数器0控制字
OUT DX,AL
MOV DX,0EC00H ;将计数初值0FH写入计数器0
MOV AL,0FH
OUT DX,AL
MOV CL,0FH ;给参考变量附初值0FH
LP1: MOV AL,00H ;将当前AL中存储的计数值锁存
MOV DX,0EC03H
OUT DX,AL
MOV DX,0EC00H ;读计数值
IN AL,DX
CMP CL,AL ;执行一次循环后,CL减1。

而AL中计数值变换的速度由人手按键的速度决定。

所以,为了避免在该段时间里,在1MHz时钟作用下不断重复输出同一计数值,我们利用CL与锁存的AL值进行比较的方法,是每个计数值在屏幕上只显示一次
JNZ LP1
DEC CL
CALL DISP ;调用DISP子程序
PUSH DX ;将DX内容保存到堆栈段(因为DX装有端口地址所对应的值,在后续程序中要用到DX,所以先将值放入堆栈保存)
MOV DL,0FFH ;执行按键输入操作
MOV AH,06H
INT 21H
MOV DX,OFFSET CHL;输出换行
MOV AH,09H
INT 21H
POP DX ;将DX的内容推出栈段
IN AL,DX
CMP AL,0
JNZ LP1 ;如果DX的内容是0,就跳转到LP1
MOV AH,4CH ;返回操作系统
INT 21H
DISP PROC NEAR ;定义一个名为DISP的子程序
PUSH DX ;把DX的内容保存到堆栈段中
AND AL,0FH ;将AL寄存器的内容与0FH进行“与”运算,再把结果存入AL中
MOV DL,AL ;将AL的值送入DL寄存器
CMP DL,9 ;比较DL中的值与9的大小
JLE NUM ;如果DL的值小于或等于9时,则跳转到NUM
ADD DL,7 ;将DL的值与7进行相加后,再送入DL中(在十六进制条件下,从10到15分别由A到F表示)
NUM: ADD DL,30H ;将DL的值与30H进行相加后,再送入DL中MOV AH,02H ;将02H存入AH
INT 21H ;调用DOS21中断
POP DX ;将DX的内容推出栈段
RET ;子程序在功能完成后返回调用程序继续执行
DISP ENDP
CODE ENDS
END START
实验二:
DATA SEGMENT
X DB ?
DATA ENDS
STACK1 SEGMENT STACK
DW 100 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START:
MOV AX,DATA
MOV DS,AX
MOV DX,0EC03H
MOV AL,36H ;计时器0控制字(计数器0,方式3,写两个字节,二进制计数)
OUT DX,AL ;将AL的值送入DX端口
MOV AX,1000 ;写初值
MOV DX,0EC00H
OUT DX,AL
MOV AL,AH ;将AX的高8位存入AL寄存器中
OUT DX,AL
MOV DX,0EC03H
MOV AL,76H ;计数器1控制字(计数器1,方式3,写两个字节,二进制计数)
OUT DX,AL ;将AL的值送入DX端口
MOV AX,1000
MOV DX,0EC01H
OUT DX,AL ;写入计数器1低字节
MOV AL,AH ;写入计数器1高字节
OUT DX,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
六、总结
有了第一次微机实验的经验之后,我这次在实验前做了充足的预习工作,已经将程序写好,检查无误,只需要在实验室连接外部电路,调试程序即可,因此实验进行得很顺利。

这次实验是针对可编程定时时钟/计数器(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.自发自收程序:
DATA SEGMENT
CHL DB 0AH,0DH,'$' ;换行字符串
DATA ENDS
STACK1 SEGMENT STACK ;定义堆栈段
DW 100 DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA
MOV DS,AX
;--------------INIT---------------- MOV DX,3FBH ;8250初始化
MOV AL,80H ;DLAB=1
OUT DX,AL
MOV AX,0CH ;N=12 BAUD=9600bps
MOV DX,3F8H ;写除数寄存器,低位
OUT DX,AL
MOV AL,AH;写除数寄存器,高位
INC DX
OUT DX,AL
MOV AL,03H ;八位数据,1停止,无校验
MOV DX,3FBH ;线路控制REG
OUT DX,AL
MOV AL,0 ;屏蔽全部中断
MOV DX,3F9H
OUT DX,AL
WAIT1: MOV DX,3FDH ;读线路状态寄存器IN AL,DX
TEST AL,1EH ;判断是否有错
JNZ ERROR
TEST AL,01H ;判断是否收到
JNZ RECEIVE
TEST AL,20H ;判断发送端是否空
JZ WAIT1
MOV DL,0FFH ;六号功能调用读入待发送数据MOV AH,06H
INT 21H
JZ WAIT1
MOV DX,3F8H ;写发送REG
OUT DX,AL
JMP WAIT1 ;返回 WAIT1
CHAR: PUSH AX
MOV DL,AL ;显示接收
MOV AH,02H
INT 21H
POP AX
JMP WAIT1
ERROR: MOV DX,3FDH
IN AL,DX
MOV DL,'?' ;对于错误显示'?"
MOV AH,02H
INT 21H
JMP WAIT1
RECEIVE:MOV DX,3F8H
IN AL,DX ;读数据接收寄存器
CMP AL,'!' ;判断是否结束
JNE CHAR
;------------------------------
MOV AH,4CH
INT 21H
CODE ENDS
END START
2. 两台PC机间RS-232串口通信:
(1)发送端:
CODE SEGMENT
ASSUME CS:CODE
START: MOV AL,80H ;8250初始化,设DLAB=1 MOV DX,3FBH
OUT DX,AL
MOV AX,30H
MOV DX,3F8H
OUT DX,AL ;写入除数低字节
MOV AL,AH
INC DX
OUT DX,AL ;写入除数高字节
MOV AL,0AH ;7位数据,1位停止,奇校验 MOV DX,3FBH
OUT DX,AL ;写入线路控制寄存器
MOV AL,03H ;请求发送、数据终端就绪:0000 0011 MOV DX,3FCH
OUT DX,AL ;写入Modem控制寄存器
MOV AL,0
MOV DX,3F9H
OUT DX,AL ;写中断允许寄存器,屏蔽所有中断
WAIT1: MOV DX,3FDH ;读线路状态寄存器
IN AL,DX
TEST AL,1EH ;出错否
JNZ ERROR
TEST AL,01H ;接收数据就绪否
JNZ SEND ;发送
TEST AL,20H ;发送寄存器空否,不空,返回等待
JZ WAIT1
SEND: MOV AH,1
INT 21H ;读键盘
CMP AL,21H ;是'!'?
JZ EXIT ;是,返回操作系统
MOV DX,3F8H ;不是,则发送
OUT DX,AL
JMP WAIT1 ;返回等待
ERROR: MOV DX,3FDH ;出错则清除线路状态寄存器
IN AL,DX
MOV DL,'?' ;显示'?'
MOV AH,02H
INT 21H
JMP WAIT1
EXIT: MOV DX,3F8H
OUT DX,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
(2)接收端:
CODE SEGMENT
ASSUME CS:CODE
START: MOV AL,80H ;8250初始化
MOV DX,3FBH
OUT DX,AL
MOV AX,30H ;写除数
MOV DX,3F8H
OUT DX,AL ;写入除数低字节 MOV AL,AH
INC DX
MOV DX,3F9H
OUT DX,AL ;写入除数高字节
MOV AL,0AH
MOV DX,3FBH
OUT DX,AL ;写入线路控制寄存器
MOV AL,03H
MOV DX,3FCH
OUT DX,AL ;写入Modem控制寄存器
MOV AL,0
MOV DX,3F9H
OUT DX,AL ;写中断允许寄存器,屏蔽所有中断
WAIT1: MOV DX,3FDH ;读线路状态寄存器
IN AL,DX
TEST AL,1EH ;出错否
JNZ ERROR
TEST AL,01H ;接收数据就绪否
JNZ RECEIVE ;转接收
TEST AL,20H ;发送寄存器空否,不空,返回等待
JZ WAIT1
JMP WAIT1 ;均返回等待
RECEIVE: MOV DX,3F8H ;读接收数据
IN AL,DX
AND AL,01111111B ;保留位数据
CMP AL,21H ;是'!'?
JNZ CHAR
MOV AH,4CH ;返回操作系统
INT 21H
CHAR: PUSH AX
MOV DL,AL
MOV AH,2 ;显示接受字符
INT 21H
POP AX
JMP WAIT1 ;返回等待
ERROR: MOV DX,3FDH ;出错则清除线路状态寄存器
IN AL,DX
MOV DL,'?' ;显示'?'
MOV AH,02H
INT 21H
JMP WAIT1
CODE ENDS
END START
五、实验总结
在这次实验中,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 功能调用:
MOV DL, 7 ; 响铃 ASCII 码为 07 MOV AH ,2
INT 21H
二、实验流程图
四、实验源代码
DATA SEGMENT
LIST DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;共阴极数码管的0~9的LED 显示器七段显示代码
DATA ENDS
STACK1 SEGMENT STACK
DW 100H DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START: MOV AX,DATA
MOV DS,AX ;数据段段基值送入DS寄存器
MOV DX,0EC0BH
MOV AL,89H ;10001001B,即A口方式0,A口输出,C口输入
OUT DX,AL ;对8255进行初始化
L0: MOV DX,0EC0AH
IN AL,DX ;读C口状态
CMP AL,0 ;如果为0则循环
JZ L0
;如果开关K0~K8状态发生改变,那么便跳出上述循环,进入如下程序
MOV BL,0
L1: INC BL
SHR AL,1 ;将AL逻辑右移
JNC L1
DEC BL
MOV AL,BL ;求出开关号码
MOV BX,OFFSET LIST ; 七段显示代码表的首址送BX
AND AX,00FFH ; 屏蔽AX高字节,组号
ADD BX,AX ; 形成显示字符的地址
MOV AL,[BX] ; 取出字符送AL
MOV DX,0EC08H
OUT DX,AL ; 送到A口输出显示
MOV DL,7
MOV AH,2
INT 21H ;响铃功能调用
MOV AH,01H
INT 21H
CMP AL,20H ;当为空格时跳到CLOSE
JZ CLOSE
MOV AH,4CH
INT 21H
CLOSE: MOV AL,0
MOV DX,0EC08H
OUT DX,AL ;数码管关闭显示,等待下一循环 JMP L0
CODE ENDS
END START
五、实验总结。

相关文档
最新文档