微机原理与接口技术实验
报告
姓名: 学号: 班级: 指导老师:
实验一交通灯控制实验
一、 实验目的
通过并行接口8255实现交通灯的模拟控制,进一步掌握对并行口的使用。 二、 实验内容
如图所示,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东西路口的交通灯与PC2、PC1、PC0相连。编程使六个灯按交通变化规律燃灭。
三、 编程提示
1、8255地址分析:控制寄存器地址: 0EC0BH A口地址: 04EC08H C口地址: 04EC0AH 2、十字路口交通灯的变化规律要求
(1) 南北路口的绿灯、东西路口的红灯同时亮三秒; (2) 南北路口的黄灯闪烁三次,同时东西路口的红灯继续亮; (3) 南北路口的红灯、东西路口的绿灯同时亮三秒;
(4) 南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁三次; (5) 转(1)重复。
3、程序设计流程图: 开始
设置8255C口输出
南北路口的绿灯、东西路口的红灯亮 长延时 南北路口的黄灯闪烁,东西路口红灯亮 南北路口的红灯、东西路口的绿灯亮 长延时 南北路口红灯亮、东西路口黄灯亮闪烁
有键按下吗? Y 返回DOS
四、汇编语言程序清单 STACK SEGMENT DB 100 DUP(0) STACK ENDS CODE SEGMENT
ASSUME CS:CODE,SS:STACK START: MOV DX,0EC0BH
MOV AL,10010000B ;A口方式0输入 OUT DX,AL
FIRST: MOV DX,0EC0AH MOV AL,00100100B
OUT DX,AL ;南北绿,东西红 MOV CX,0
MOV AX,0 ;软件延时
LO: DEC AX ;延时64K*64K个TCP JNZ LO LOOP LO MOV BL,6
N
SECOND:MOV DX,0EC0AH MOV AL,01000100B
OUT DX,AL ;南北黄,东西红 MOV CX,0
MOV AX,1FFFH LP1: LOOP LP1 DEC AX JNZ LP1
MOV DX,0EC0AH ;延时64k*8K个Tcp MOV AL,00000100B OUT DX,AL MOV CX,0
MOV AX,1FFFH LP2: LOOP LP2 DEC AX
JNZ LP2 DEC BL
JNZ SECOND THIRD: MOV DX,0EC0AH MOV AL,10000001B
OUT DX,AL MOV CX,0
MOV AX,0 LI: DEC AX JNZ LI
LOOP LI
MOV BL,6 FORTH: MOV DX,0EC0AH MOV AL,10000010B
OUT DX,AL MOV CX,0
MOV AX,1FFFH
LY1: LOOP LY1 DEC AX
JNZ LY1 MOV DX,0EC0AH MOV AL,10000000B
OUT DX,AL MOV CX,0
MOV AX,1FFFH LY2: LOOP LY2 DEC AX JNZ LY2 DEC BL
;南北黄灭 ;延时64k*8K个Tcp ;黄灯闪烁6次 ;南北红,东西绿 ;软件延时
;延时64K*64K个TCP ;南北红,东西黄 ;延时64k*8K个Tcp ;东西黄灭
JNZ FORTH ;黄灯闪烁6次
MOV DL,0FFH ;DOS 6号功能调用,按任意键返回
MOV AH,06H INT 21H JZ FIRST
MOV AH,4CH
INT 21H ;返回操作系统 CODE ENDS END START 五、实验现象
(1)南北路口的绿灯、东西路口的红灯同时亮三秒;
(2)南北路口的黄灯闪烁六次,同时东西路口的红灯继续亮; (3)南北路口的红灯、东西路口的绿灯同时亮三秒;
(4)南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁六次; (5)转(1)重复。
六、主要问题及解决办法和心得体会
主要困扰我们的是黄灯的闪烁问题。刚开始只能实现红黄绿灯之间的转换,并不能实现黄灯闪烁,在参考了大神的建议之后,我们加了一个循环,每次循环覆盖黄灯的值,从而实现了闪烁。
实验二可编程定时器/计数器(8253)
一、 实验目的
掌握8253的基本工作原理和编程方法 二、 实验内容
1、按图虚线连接电路,将计数器0设置为工作方式0,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0遍高电平)。
2、按图连接电路,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率1Hz)。
三、 编程提示
1、8253地址分析:控制寄存器地址: 0EC03H 计数器0地址: 04EC00H 计数器1地址: 04EC01H CLK0连接时钟:1MHz。 2、程序参考流程图
开始 开始 设置计数器0为工作方式0 计数器0位工作方式3 送计数器初值 向计数器0送初值1000 先送低字节后送高字节 读计数器值 设计数器1为工作方式3 显示计数值 向计数器1送初值1000 先送低字节后送高字节 调用延时子程序 N 有键按下吗? Y 结束 结束 (1)
四、汇编语言程序清单 1、实验内容一程序: CODE SEGMENT ASSUME CS:CODE
START:MOV DX,0EC03H ;计数器0,方式0 MOV AL,00010000B OUT DX,AL
MOV DX,0EC00H
MOV AL,0EH ;送初值E OUT DX,AL MOV CL,1
READ: INC CL ;自加1 CMP CL,0 JZ START
MOV DX,0EC00H ;读计数器0口 IN AL,DX MOV DL,AL MOV CL,AL
(2)
CMP AL,9 JG BIG
ADD DL,30H ;0到9,显示ASCII数字 MOV AH,02H INT 21H
MOV DL,0DH INT 21H JMP JUDGE
BIG: ADD DL,37H ;大于9,显示ASCII字母 MOV AH,02H INT 21H
MOV DL,0DH ;加回车符,只显示一个符号 INT 21H JMP JUDGE
JUDGE:MOV DL,0FFH ;有键按下回DOS MOV AH,06H INT 21H JZ READ
MOV AH,4CH INT 21H CODE ENDS END START
2、实验内容二程序: CODE SEGMENT ASSUME CS:CODE
START: MOV DX,0EC03H ;计数器0置控制字为工作方式3 MOV AL,00110110B OUT DX,AL
MOV DX,0EC00H MOV AX,1000 ;向计数器0送初值 OUT DX,AL ;先送低字节后送高字节 MOV AL,AH OUT DX,AL
MOV DX,0EC03H ;计数器1置控制字为工作方式3 MOV AL,01110110B OUT DX,AL
MOV DX,0EC01H ;向计数器1送初值 MOV AX,1000 ;先送低字节后送高字节 OUT DX,AL MOV AL,AH OUT DX,AL NEXT: MOV DL,0FFH ;DOS 6号功能调用,按任意键返回 MOV AH,06H INT 21H
MOV AH,4CH INT 21H CODE ENDS END START 五、实验现象 1、实验内容一:
;返回系统
用手动逐个输入单脉冲,在屏幕上从计数器初值E开始显示,此时逻辑笔显示为低电平,单脉冲每输入一个,计数器值将会减1,同时在屏幕上显示,当计数器值减到0时,逻辑笔显示为高电平。如果键盘上有键按下回到DOS系统。如果没有的话,再输入单脉冲会重复以上现象。 2、实验内容二:
接通电路后,逻辑笔交替显示高低电平。变化频率约为1Hz。 六、主要问题及解决办法和心得体会
主要问题就是显示问题,刚开始设计程序的时候只能正确显示0-9,以后的就会出错,后来我们发现需要加不同的数字来表示ASCLL码。而且往端口送数只能用固定格式OUT DX,AL;因此要分高位和低位来送。
实验三 PC机串行通讯实验
一、实验目的
1、进一步了解串行通信的基本原理
2、掌握串行接口芯片8250的基本原理和编程方法 3、熟悉PC机串行口的基本连接方法 二、实验内容
1、PC机RS-232串口自发自收
按照PC机串口自发自收的连接方法(将RS232C的DB9的电缆插头第2脚和第3脚短接)连线。编写PC机自发自收串行通信程序,要求:从键盘输入一个字符,将字符通过串口发送出去,再由此串口将字符接收回来并在屏幕上显示,实现自发自收。 2、2台PC间RS-232串口通信:
按照PC机RS-232串口直接互连的方法连接两台PC机。编写PC机直接互连串行通信程序;要求:由甲机键盘键入字符经串口发送给乙机,再由乙机通过串口接收字符并显示在屏幕上。当键入感叹号“!”,结束收发过程。
三、编程提示
1、地址分析:PC机自带两个串口,分别为COM1和COM2,本实验选用COM1,地址为3F8H-3FFH。 2、程序设计流程图: 自发自收:
开始 初始化8250 读线路状态寄存器 出错否 发送数据就绪否 发送数据 接收数据 显示数据 N 有!按下吗? Y 返回DOS Y 显示? N
双机通信:发送程序: 开始 初始化8250
接收程序:
读线路状态寄存器 出错否 Y 显示? 读发送寄存器 N 是否为空 读键盘 发送 N 有!按下吗? Y 返回DOS 开始 初始化8250 读线路状态寄存器 出错否 Y 显示? 接收数据就绪否 接收 N 读接收数据 显示接收字符 结束 返回DOS
四、 汇编语言程序 程序1——自发自收: CODE SEGMENT ASSUME CS:CODE
START :MOV AL,80H MOV DX,3FBH OUT DX,AL MOV AX,30H MOV DX,3F8H
OUT DX,AL MOV AL,AH MOV DX,3F9H
OUT DX,AL MOV AL,0AH MOV DX,3FBH
OUT DX,AL MOV AL,0FH MOV DX,3FCH
OUT DX,AL MOV AL,0 MOV DX,3F9H OUT DX,AL WAIT_FOR:MOV DX,3FDH IN AL,DX
TEST AL,00011110B JNZ ERROR TEST AL,00000001B JNZ RECEIVE
TEST AL,01000000B JZ WAIT_FOR MOV AH,1
INT 21H MOV DX,3F8H OUT DX,AL
JMP WAIT_FOR RECEIVE: MOV DX,3F8H IN AL,DX
AND AL,01111111B
;初始化 ;写入除数低字节 ;写入除数高字节
;7位数据,1位停止,奇数校验 ;写入线路控制寄存器 ;写入Modem控制寄存器 ;屏蔽全部中断 ;写中断允许寄存器 ;读线路状态寄存器 ;出错否
;不为零转ERROR ;接收数据就绪否 ;发送寄存器空否,不空,返回等待读键盘 ;发送 ;返回等待 ;读接收数据 ;保留7位数据
;
CMP AL,21H ;是否'!' JNZ CHAR
MOV AH,4CH ;返回DOS INT 21H CHAR: PUSH AX MOV DL,AL
MOV AH,02H ;显示接收字符 INT 21H POP AX
JMP WAIT_FOR ;返回等待
ERROR: MOV DX,3FDH ;出错则清除线路状态寄存器 IN AL,DX
MOV DL,'?' ;显示'?' MOV AH,02H INT 21H
JMP WAIT_FOR CODE ENDS END START
程序2——双机通信: 发送部分:
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 MOV DX,3F9H
OUT DX,AL ;写入除数高字节
MOV AL,0AH ;7位数据位,1位停止位,奇校验
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 ;写中断允许寄存器,屏蔽中断 WAIT_FOR:MOV DX,3FDH
IN AL,DX ;读线路状态寄存器 TEST AL,00011110B ;出错否
JNZ ERROR
TEST AL,01000000B ;发送寄存器空否,不空,返回等待
JZ WAIT_FOR
MOV AH,01H ;读键盘的字符 INT 21H
MOV DX,3F8H
OUT DX,AL ;发送
CMP AL,21H ;是不是叹号 JNZ WAIT_FOR MOV AH,4CH INT 21H
ERROR:MOV DX,3FDH IN AL,DX
MOV DL,'?' MOV AH,02H INT 21H
JMP WAIT_FOR CODE ENDS
END START 接收部分:
CODE SEGMENT ASSUME CS:CODE
START: MOV AL,80H MOV DX,3FBH OUT DX,AL MOV AX,30H MOV DX,3F8H
OUT DX,AL MOV AL,AH MOV DX,3F9H
OUT DX,AL MOV AL,0AH 验
MOV DX,3FBH
OUT DX,AL MOV AL,03H MOV DX,3FCH
OUT DX,AL MOV AL,0 MOV DX,3F9H
OUT DX,AL WAIT_FOR: MOV DX,3FDH
IN AL,DX 出错则显示问号 ;8250初始化,设DLAB=1 ;写入除数低字节 ;写入除数高字节
;7位数据位,1位停止位,奇校 ;写入线路控制寄存器 ;写入modem控制寄存器 ;写中断允许寄存器,屏蔽中断 ;读线路状态寄存器
;
TEST AL,00011110B ;出错否 JNZ ERROR
TEST AL,00000001B ;接收数据就绪否 JNZ RECEIVE ;转接收 JMP WAIT_FOR
RECEIVE: MOV DX,3F8H IN AL,DX
CMP AL,21H ;读接收的数据 JNE CHAR
MOV AX,4CH ;返回DOS INT 21H CHAR: PUSH AX MOV DL,AL
MOV AH,02H ;显示接受的字符 INT 21H POP AX
JMP WAIT_FOR ERROR: MOV DX ,3FDH IN AL,DX
MOV DL,'?' ;出错则显示问号 MOV AH,02H INT 21H
JMP WAIT_FOR CODE ENDS END START 五、 实验现象:
自发自收:在屏幕上输入一个字符,屏幕显示输入字符,还将显示自行接收回来的字符,即每个字符显示两次,如果断开将RS232C的DB9的电缆插头第2脚和第3脚短接的连线,那么不再显示自行接收回来的字符,每输入一个字符只显示一次。
双机通信:将两台计算机RS-232串口用交叉线连接起来,同时运行接收和发送程序。在发送机输入一个字符,在接收机中显示该字符。
六、主要问题及解决办法和心得体会
在我写完程序的时候,助教看了其中关于出错的处理,让我想办法让运行的程序出错。但无论我按照什么格式敲什么字母,都无法error。虽然我的程序是正确的,也研究了很久,但水平有限,还是没有弄清楚为什么无法出错。
实验四抢答器
一、实验目的
1、了解微机化竞赛抢答器的基本原理。 2、进一步学习使用并行接口。
二、实验内容
图5-4为竞赛抢答器(模拟)的原理图,逻辑开关K0~K7代表竞赛抢答按钮0~7号,当某个逻辑电平开关置“1”时,相当某组抢答按钮按下。在七段数码管上将其组号(0~7)显示出来,并使喇叭响一下。从键盘上按空格键开始下一轮抢答,按其它键程序退出。
图5-4
8255动态分配地址: 控制寄存器: 0EC0BH
A口地址: 0EC08H C口地址: 0EC0AH
三.程序流程图和程序清单
四、程序
DATA SEGMENT
LIST DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H 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
;-------------------------------------------------- MOV DX,0EC0BH MOV AL,89H
OUT DX,AL ;对8255进行初始化 L0: MOV DX,0EC0AH
IN AL,DX ;读C口状态 CMP AL,0 ;如果为0则循环 JZ L0
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
五.实验遇到的问题和解决方法
第一个问题就是我的实验箱总是显示数字8,不随抢答组号的变化,后来发现竟然是没有接8255的cs片选,细节很重要啊。第二个问题就是助教提出的,怎么把原来的组号顺序翻转。仔细研究了之后,我发现只要把原来的通过循环右移AL,变为循环左移就可以了。
因篇幅问题不能全部显示,请点此查看更多更全内容