微机原理与接口技术实验报告
微机原理与接口技术
实验报告
班 级: 自动化(铁道信号) 姓 名: ***** 学 号: 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 交通灯实验电路图
四.程序流程图
五.源程序
CODE SEGMENT ASSUME CS:CODE
;********************************** 工作状态控制字设置 START: MOV DX,0EC0BH ;写控制端口,地址0EC0BH MOV AL,10010000B ;C口方式0输出 OUT DX,AL
;**********************************南北路口绿灯亮,东西路口红灯亮 FIRST: MOV DX,0EC0AH ;写PC口,地址0EC0AH MOV AL,00100100B ;南北绿,东西红,PC口写00100100 OUT DX,AL
;------------------------------两层嵌套实现长延时
MOV CX,0 ;外层循环送入初值65536 MOV AX,2000H ;内层循环送入初值2000H DELAY1: DEC AX JNZ DELAY1 LOOP DELAY1
;**********************************南北路口黄灯闪烁,东西路口红灯亮 MOV BL,5 ;BL控制黄灯亮的次数5次 SECOND:MOV DX,0EC0AH MOV AL,01000100B
OUT DX,AL ;南北黄,东西红 MOV CX,3000H MOV AX,0100H LI1:
DEC AX JNZ LI1 LOOP LI1
MOV DX,0EC0AH ;短延时
MOV AL,00000100B ;南北路口黄灯先灭 OUT DX,AL MOV CX,3000H MOV AX,0100H WEN1: DEC AX
;**********************************南北路口绿灯亮,东西路口红灯亮
FIRST: MOV DX,0EC0AH ;写PC口,地址0EC0AH
MOV AL,00100100B ;南北绿,东西红,PC口写00100100
OUT DX,AL
;------------------------------两层嵌套实现长延时
MOV CX,0 ;外层循环送入初值65536
MOV AX,2000H ;内层循环送入初值2000H
DELAY1: DEC AX
JNZ DELAY1
LOOP DELAY1
;**********************************南北路口黄灯闪烁,东西路口红灯亮
MOV BL,5 ;BL控制黄灯亮的次数5次
SECOND:MOV DX,0EC0AH
MOV AL,01000100B
OUT DX,AL ;南北黄,东西红
MOV CX,3000H
MOV AX,0100H
LI1:
DEC AX
JNZ LI1
LOOP LI1
MOV DX,0EC0AH ;短延时
MOV AL,00000100B ;南北路口黄灯先灭
OUT DX,AL
MOV CX,3000H
MOV AX,0100H
WEN1:
DEC AX
JNZ WEN1 ;短延时
LOOP WEN1
DEC BL
JNZ SECOND ;南北路口黄灯再亮
;**********************************南北路口红灯亮,东西路口绿灯亮
THIRD: MOV DX,0EC0AH ;写入C口
MOV AL,10000001B
OUT DX,AL ;南北红,东西绿
MOV CX,0 ;长延时
MOV AX,2000H
DELAY2: DEC AX
JNZ DELAY2
LOOP DELAY2
MOV BL,4 ;控制黄灯亮的次数
FORTH: MOV DX,0EC0AH ;写入C口
MOV AL,10000010B
OUT DX,AL ;南北红,东西黄
MOV CX,3000H
MOV AX,0100H
LI2:
DEC AX
JNZ LI2 ;短延时
LOOP LI2
;**********************************南北路口红灯亮,东西路口黄灯闪烁
MOV DX,0EC0AH
MOV AL,10000000B
OUT DX,AL ;东西路口黄灯先灭
MOV CX,3000H
MOV AX,0100H
WEN2:
DEC AX
JNZ WEN2
LOOP WEN2
DEC BL
JNZ FORTH ;东西路口黄灯再亮
MOV DL,0FFH
;**********************************检测是否有键按下,调用6号功能
MOV AH,06H
INT 21H ;执行键盘输入操作
JZ FIRST
MOV AH,4CH
INT 21H ;返回操作系统
CODE ENDS
END START
六.实验总结
这是我们的首个微机原理实验,对实验箱以及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)
DATA SEGMENT
N EQU 0BH ;定义计数器初值N,初值N在0到F之内,便于字符显示简单 STRING DB 0AH,0DH,'$' ;定义STRING用来换行,0DH回车,0AH换行,$是字符串的结尾标志
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
;*************************************************8253的初始化
MOV DX,0EC03H ;控制寄存器地址0EC03H MOV AL,10H ;计数器0:00,只读/写计数器的低字节:01,方式0:000,
;二进制计数:0, 所以控制字写00010000B
MOV CL,N ;用CL控制计数N次
MOV DX,0EC00H ;计数器0地址0EC00H MOV AL,N OUT DX,AL ;写入控制字 OUT DX,AL ;写入计数初值为N,即0BH,11 L00P: MOV DX,0EC00H
IN AL,DX ;读取当前数值 CMP AL,CL JNE L00P DEC CL ;若AL不等于CL,则继续到L00P循环 ;更改CL值
;*****************************************************单字符输出程序,先转换成ASIIC
MOV DL,AL CMP DL,09H ;转换为ASIIC,0~9内的数字加30,A到F加37 JLE ADD30 ADD DL,07H ; A~F先加7,下一步再加30
ADD30: ADD DL,30H
MOV AH,02H ;02号功能是单字符输出显示,显示计数器当前值 INT 21H
;******************************************************
MOV AH,4CH INT 21H CMP CL,0 JNL L00P ;循环至CL等于0,即N次 MOV DX,OFFSET STRING ;换行 MOV AH,09H ;, INT 21H
CODE ENDS
END START
(2)
DATA SEGMENT
N DB 07H
DATA ENDS
STACK1 SEGMENT PARA STACK
DB 20 DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS: CODE
START: MOV AL, 36H ;设置8253计数器0为工作方式3,十进制计数
MOV DX,0EC03H
OUT DX, AL ;送方式控制字到控制口
MOV DX, 0EC00H
MOV AX, 1000 ;计数初值为1000
OUT DX, AL ;送计数初值的低字节到计数器0的端口
MOV AL, AH
OUT DX, AL ;送计数初值的高字节到计数器0的端口
MOV AL, 76H ;设置8253计数器1为工作方式3,十进制计数
MOV DX, 0EC03H
OUT DX, AL ;送方式控制字到控制口
MOV DX, 0EC01H
MOV AX, 1000 ;计数初值为1000
OUT DX, AL ;送计数初值的低字节到计数器1的端口
MOV AL, AH
OUT DX, AL ;送计数初值的高字节到计数器1的端口
MOV AH, 4CH ;返回DOS
INT 21H
CODE ENDS
END START
七.实验总结
经过第一次实验的教训后,我在实验前做了充足的预习工作,已经将程序写好,只需要在实验室连接外部电路,调试程序即可,因此实验进行得很顺利。这次实验是针对可编程定时时钟/计数器(8253),8253有六种工作方式,我在实验中主要用到了8253的工作方式0和工作方式3,此外调用了 02号功能单字符输出显示,以及09号功能输出显示字符串,我在做宏汇编研究性学习的时候就已经研究过这两个功能的使用方法,所以这次使用得心应手,要注意的是:执行02号功能必须进行ASSIC码转换,执行09号功能必须在字符串结尾写一个符号'$',表示字符串结束。此外,在实验老师的指导下,我进一步熟悉了调试的方法,之前只会F8单步调试,但是在遇到很长的循环程序时,就不能单步调试的了,通过这次实验我学会了如何使用F4让程序进行到任意指定位置,这样就可以跳过循环继续执行代码。
实验三、可编程中断控制器
一.实验目的
通过实验了解中断是计算机系统最重要的工作方式之一,理解中断能实现系统协调工作,了解中断在操作系统,工业控制中的应用。通过实验可学会可编程中断控制器8259的结构、中断申请、中断响应、中断处理、中断返回等中断原理,掌握中断系统的编程与应用。
(1)掌握PC机8259A可编程中断控制器中断基本原理。
(2)掌握中断源、中断处理过程、中断向量表的建立、DOS的使用。
(3)熟悉主程序、中断服务程序编写,了解中断相应过程 。
二.实验内容
(1)学习PC机系统中断原理
(2)利用手动产单脉冲作为中断请求信号 , 要求每按一次开关产生一次中断在屏幕上显示一次 “TPC pci card Interrupt” 中断10次后程序退出。
三.实验原理
PC机用户可使用的硬件中断只有可屏蔽中断由8259中断控制器管理中断控制器用于接收外部的中断请求信号经过优先级判别等处理后向CPU发出可屏蔽中断请求 IBMPC、PC/XT机内有一片8259中断控制器对外可以提供8个中断源
中断源中断类型号 中断功能IRQ0 08H 时钟
IRQ1 09H 键盘
IRQ2 0AH 保留
IRQ3 OBH 串行口2
IRQ4 0CH 串行口1
IRQ5 0DH 硬盘
IRQ6 0EH 软盘
IRQ7 0FH 并行打印机
8个中断源的中断请求信号线IRQ0 IRQ7在主机的62线ISA总线插座中可以引出系统已设定中断请求信号为边沿触发普通结束方式对于PC/AT及286以上微机内又扩展了一片8259中断控制 IRQ2用于两片8259之间级连对外可以提供16个中断源
中断源 中断类型号 中断功能 IRQ8 070H 实时时钟
IRQ9 071H 用户中断
IRQ10 072H 保留
IRQ11 O73H 保留
IRQ12 074H 保留
IRQ13 075H 协处理器
IRQ14 076H 硬盘
IRQ15 077H 保留
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的中断功能,代码如下:
mov dx,ioport_cent+68h ;设置 tpc 卡中9054芯片io口,使能中断
in ax,dx
or ax,0900h
out dx,ax
其中IOPORT_CENT是9054芯片寄存器组的I/O起始地址,每台微机可能都不同,编程时需要了解当前的微机使用哪段并进行设置,获取方法请参看本书结尾部分的介绍。(也可使用自动获取资源分配的程序取得),+68H的偏移是关于中断使能的寄存器地址,设置含义如下:
设置INTCSR(68H)寄存器 中断模式设置
程序退出前还要关闭9054的中断,代码如下:
mov dx,ioport_cent+68h ;设置 tpc 卡中9054芯片io口,关闭中断
in ax,dx
and ax,0f7ffh
out dx,ax
6. PC机中断控制器8259 的地址为20H、21H,编程时要根据中断类型号设置中断矢量,8259中断屏蔽寄存器IMR对应位要清零(允许中断),中断服务结束返回前要使用中断结
束命令:
MOV AL,20H
OUT 20H,AL
中断结束返回DOS时应将IMR对应位置1,以关闭中断 。
五.实验电路
实验电路如图,直接用手动产单脉冲作为中断请求信号,只需连接一根导线。
图3.1 中断实验电路图
六.流程图
图3.2 中断实验流程图
五.源程序
;386以上微机适用
;纯dos下才能使用
;tasm4.1或以上编译
;*********************;
;* 中断 *;
;*********************;
data segment
int_vect EQU 073H ;中断0-7的向量为:08h-0fh,中断8-15的向量为:70h-77h
irq_mask_2_7 equ 11111011b ;中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零
irq_mask_9_15 equ 11110111b ;中断0-7时全一,中断8-15时从低至高相应位为零 ioport_cent equ 0E800h ;tpc 卡中9054芯片的io地址
csreg dw ?
ipreg dw ? ;旧中断向量保存空间
irq_times dw 00h ;中断计数
msg1 db 0dh,0ah,'TPC pci card Interrupt',0dh,0ah,'$'
msg2 db 0dh,0ah,'Press any key to exit!',0dh,0ah,'$'
msg3 db 0dh,0ah,'Press DMC to interrupt 10 times and exit!',0dh,0ah,'$' data ends
stack segment stack
db 100 dup (?)
stack ends
code segment
assume cs:code,ds:data,ss:stack,es:data
start:
;Enable Local Interrupt Input
.386
cli mov ax,data mov ds,ax mov es,ax mov ax,stack mov ss,ax mov dx,ioport_cent+68h ;设置 tpc 卡中9054芯片io口,使能中断
in ax,dx or ax,0900h out dx,ax mov al,int_vect ;调用35号功能,保存原中断向量int_vect mov ah,35h int 21h mov ax,es mov csreg,ax mov ipreg,bx ;ipreg csreg是旧中断向量保存空间 mov ax,seg int_proc ;调用25号功能设置新中断向量 mov ds,ax ;中断服务程序的的段基址送DX mov dx,offset int_proc ;中断服务程序的的偏移地址送DX mov al,int_vect mov ah,25h int 21h in al, 21h ;设置中断掩码 and al, irq_mask_2_7 ;主片端口地址21H,D2允许中断11111011b out 21h, al in al, 0a1h and al, irq_mask_9_15 ;从片端口地址A1H,D3允许中断11110111b out 0a1h, al mov ax,data mov ds,ax mov dx,offset msg2 mov ah,09h ;09号功能显示'Press any key to exit!' int 21h
mov dx,offset msg3 ;显示'Press DMC to interrupt 10 times and exit!'
loop1:
exit: cli
mov ah,09h int 21h mov irq_times,0ah sti ;允许可屏蔽中断请求进入 cmp irq_times,0 ;等待中断并判断中断10次后退出 jz exit mov ah,1 ;BIOS功能调用int 16h ah=01H检测字符是否准备好 int 16h ;ZF=0,表示无字符可接收,ZF=1,表示有字符可接收 jnz exit ;按任意键退出IF=1 jmp loop1 mov bl, irq_mask_2_7 ;恢复中断掩码 not bl in al, 21h or al, bl out 21h, al mov bl, irq_mask_9_15 not bl in al, 0a1h or al, bl out 0a1h, al mov dx,ipreg ;恢复原中断向量int_vect mov ax,csreg mov ds,ax
mov al,int_vect int 21h mov dx,ioport_cent+68h ;设置 tpc 卡中9054芯片io口,关闭中断 in ax,dx
and ax,0f7ffh
out dx,ax
mov ax,4c00h ;
int 21h
int_proc proc far
push ax
push dx
push ds
dec irq_times
mov ax,data ;Interrupt to do
mov ds,ax
mov dx,offset msg1
mov ah,09h
int 21h
mov al,20h ;Send EOI
out 0a0h,al
out 20h,al
pop ds
pop dx
pop ax
返回操作系统
iret
int_proc endp
code ends
end start
六 .实验总结
这次的实验感觉比较难,首先是中断程序复杂,其次,要在纯DOS环境下运行。 这次实验重点是要理解中断的概念和熟悉中断中8352主片和从片的如何级联工作,具体包括:知道如何查找中断源、确定中断类型,设置TPC卡中断使能、调用35号功能保护原中断向量、调用25号功能设置新的中断向量,设置中断屏蔽字等诸多内容。虽然老师已经给了我们程序,但是要在短时间内彻底地读懂全部程序,并透彻的理解每一句代码的意义还是比较困难的,尤其是使用微机中断前使能9054的中断功能这一部分的程序令人费解,特地请教了老师帮我解惑。通过此次试验。我对整个中断服务流程的理解更加清晰,对 8352主片和从片的级联工作用以拓展中断源的工作方式有了进一步的认识。
实验四 模/数转换器 A/DC0809
一. 实验目的
通过实验了解计算机能直接处理的通常是数字信号,学会利用A/D器件把模拟信号转换成数字信号,学会A/D芯片如何与计算机连接,掌握有哪些主要参数影响采集的速度和精度,掌握软件编程实现模拟信号采集,思考如何解决实际多通道数据采集处理问题,思考数据采集后如何处理等问题,了解模/数转换的基本原理,掌握ADC0809的使用方法。
(1) 掌握单通道模拟信号采集到数据处理的方法。
(2) 掌握采集电路和计算机连接的硬件电路。
(3) 熟悉多通道模拟信号采集到数据处理的方法。
实验电路原理图如图4.1。通过实验台左下角电位器RW1输出0~5V直流电压送入ADC0809通道0(IN0), 编程采集IN0输入的电压,在屏幕上显示出转换后的数据(用16进制数)
三.实验电路
图4.1 模数转换电路
四.参考流程图
图4.2 A/D转换流程图
1、ADC0809的IN0口地址为298H,IN1口地址为299H。
2、IN0单极性输入电压与转换后数字的关系为:
其中Ui为输入电压,UREF为参考电压,这里的参考电压为PC机的+5V电源。 3、一次A/D转换的程序可以为
MOV DX,口地址 ;启动转换
OUT DX,AL
;延时
IN AL,DX ;读取转换结果放在AL中
六.源程序
CODE SEGMENT
ASSUME CS:CODE
START: MOV AL,0
MOV DX,0EC18H ;IN0口动态地址
OUT DX,AL ;启动
MOV DX,0FFFH
MOV CX,0
DELATE:LOOP DELATE
DEC DX
JNZ DELATE ;延时
WP: MOV DX,0EC18H
IN AL,DX ;读IN0口
MOV DL,AL
MOV CL,4
SHR DL,CL ;右移4位
CMP DL,9
JG BIG
ADD DL,30H ;ASCII显示0~9,并显示
MOV AH,06H
INT 21H
JMP NEXT
BIG: ADD DL,37H ;ASCII码A~F,并显示
MOV AH,06H
INT 21H
JMP NEXT
NEXT: MOV DX,0EC18H ;读IN0口
IN AL,DX
MOV DL,AL
AND DL,00001111B ;屏蔽高4位 CMP DL,9 JG BIGS
ADD DL,30H ;ASCII显示0~9,并显示 MOV AH,06H INT 21H JMP JUDGE
BIGS: ADD DL,37H ;ASCII码A~F,并显示 MOV AH,06H INT 21H JMP JUDGE
JUDGE: MOV DL,0DH ;加回车符,只显示一个两位数字 INT 21H
MOV DL,0FFH MOV AH,06H INT 21H
JZ START ;有键按下返回DOS MOV AH,4CH INT 21H CODE ENDS END START
七.实验总结
这次试验之前我也同样进行了预习,了解了模/数转换的基本原理,掌握ADC0809的使用方法。在将IN0口的输入电压显示在屏幕上时,通过实验台左下角电位器RW1输出0~5V直流电压送入ADC0809通道0,调节电位器的阻值,屏幕上显示的数字随着电阻值的变化而变化,不需要按enter键换行,通过和老师的交流,才明白过来,这是因为程序的JUDGE段加了回车符,只显示一个两位数字,所以不需要按enter键进行换行,直接改变电阻值,即可显示出相应的输入电压值。
通过这几次的实验,我发现微机实验其实很简单,在扎实掌握基本知识的基础上,灵活的做一些变动,就可以实现,这让我体会到面对难题,如果你不愿尝试就一定不会有突破,只要愿意思考,并且举一反三,不断尝试,才会有成功的机遇。
五、PC机串行通讯实验
一、实验目的
1、 进一步了解串行通信的基本原理。
2、 掌握串行接口芯片8250的工作原理和编程方法。 3、 熟悉PC机串行口的基本连接方法
二、实验内容
1、PC机RS-232串口自发自收。
按照PC机串口自发自收的连接方法连线。编写PC机自发自收串行通信程序,要求:从键盘输入一个字符,将字符通过串口发送出去,再由此串口将字符接收回来并在屏幕上显示,实现自发自收。
2、 两台PC机间RS-232串口通信。
按照PC机RS-232串口直接互连的方法连接两台PC机。 编写PC机直接互连串行通信程序;要求:由甲机键盘键入字符经串口发送给乙机,再由乙机通过串口接收字符并显示在屏幕上。当键入感叹号“!”,结束收发过程。
图5-1 DB-9连接器 图5-2 双机近距离通信连接图
三、实验原理
(1)本实验为异步通信:以字符为单位进行传送,每传送一个字符,以起始位作为开始标志,以停止位作为结束标志。
异步串行通信的工作过程是:传送开始后,接收设备不断地检测传输线是否有起始位到来,当接收到一系列的“1”(空闲或停止位)之后,检测到第一个“0”,说明起始位出现,就开始接收所规定的数据位、奇偶校验位及停止位。经过接收器处理,将停止位去掉,把数据位拼装成一字节数据,并且经奇偶校验无错误,才算是正确地接收到了一个字符。当一个
字符接收完毕,接收设备又继续测试传输线,监视“0”电平的到来(下一个字符的开始)。
(2
)8250各部分功能说明
8250片内有10个寄存器,其中有几个是共用地址的,其识别由线路控制寄存器(LCR)的最高位DLAB来决定。各寄存器的地址和格式如下所示:
(3)数据发送和接收:
(插入起始、校验、停止位后发出)
数据接收:
四.源程序
1.PC机RS-232串口自发自收。 CODE SEGMENT
ASSUME CS:CODE
;8250初始化,设DLAB=1
START: MOV AL,10000000B
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,00001010B MOV DX,3FBH OUT DX,AL
;写入除数低字节
;写入除数高字节
;7位数据,1位停止,奇校验
;写入线路控制寄存器
;自检控制
MOV AL,00010000B MOV DX,3FCH OUT DX,AL MOV AL,0 MOV DX,3F9H OUT DX,AL
;写入Modem控制寄存器
;写中断允许寄存器,屏蔽中断
WAIT_FOR:
MOV DX,3FDH IN AL,DX
;读线路状态寄存器
TEST AL,00011110B ;出错否 JNZ ERROR
;出错,转ERROR
TEST AL,00000001B ;接收数据就绪否 JNZ RECEIVE
;就绪,转接受
TEST AL,00100000B ;发送寄存器空否,不空,返回等待 JZ WAIT_FOR MOV AH,1 INT 21H
;读键盘 ;发送
MOV DX,3F8H OUT DX,AL JMP WAIT_FOR
;返回等待
RECEIVE: PUSH CX PUSH AX MOV CX,02000H T1: MOV AX,0FFFFH T2: DEC AX JNZ T2
LOOP T1 ;延时程序
MOV DX,3F8H IN AL,DX AND AL,01111111B CMP AL,03H JNZ CHAR MOV AH,4CH INT 21H
;返回DOS
;保留7位数据 ;读接收数据
;是Ctrl+C?
CHAR: PUSH AX MOV DL,AL
MOV AH,2H INT 21H POP AX JMP WAIT_FOR
;返回等待
;出错则清除线路状态寄存器 ;显示接收字符
ERROR: MOV DX,3FDH
IN AL,DX
MOV AH,02H INT 21H JMP WAIT_FOR CODE ENDS
END START
2. 两台PC机间RS-232串口通信。
(1)发送端:
CODE SEGMENT
ASSUME CS:CODE
;8250初始化,设DLAB=1 START: MOV AL,80H
MOV DX,3FBH OUT DX,AL MOV AX,0030H 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 ;写入除数低字节 ;写入除数高字节 ;7位数据,1位停止,奇校验 ;写入线路控制寄存器 ;数据终端就绪,请求发送数据 ;写入Modem控制寄存器 ;写中断允许寄存器,屏蔽中断
WAIT_FOR:
MOV DX,3FDH ;读线路状态寄存器 第30页 共42页
TEST AL,00100000B ;发送寄存器空否,不空,返回等待 JZ WAIT_FOR
SEND: MOV AH,1
EXIT: MOV AX,4C00H
INT 21H INT 21H ;读键盘,若是'!',返回DOS,若不是,则发送 CMP AL,21H JZ EXIT MOV DX,3F8H OUT DX,AL JMP WAIT_FOR ;返回等待
CODE ENDS
END START
(2)接收端:
CODE SEGMENT
ASSUME CS:CODE
;8250初始化,设DLAB=1 START: MOV AL,80H
MOV DX,3FBH OUT DX,AL MOV AX,0030H MOV DX,3F8H OUT DX,AL MOV AL,AH MOV DX,3F9H OUT DX,AL MOV AL,0AH MOV DX,3FBH 第31页 共42页 ;写入除数低字节 ;写入除数高字节 ;7位数据,1位停止,奇校验
MOV AL,03H MOV DX,3FCH OUT DX,AL MOV AL,0 MOV DX,3F9H OUT DX,AL ;数据终端就绪,请求发送数据 ;写入Modem控制寄存器 ;写中断允许寄存器,屏蔽中断
WAIT_FOR:
MOV DX,3FDH IN AL,DX TEST AL,00000001B ;接收数据就绪否 JNZ RECEIVE JMP WAIT_FOR ;返回等待 ;转接收 ;读线路状态寄存器
RECEIVE:
MOV DX,3F8H IN AL,DX AND AL,01111111B CMP AL,21H JNZ CHAR MOV AX,4C00H INT 21H ;返回DOS ;保留7位数据 ;读接收数据 ;是'!'?
CHAR: PUSH AX
第32页 共42页 MOV DL,AL MOV AH,2 INT 21H POP AX JMP WAIT_FOR ;返回等待 ;显示接收字符
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)显示出来,并使喇叭响一下。从键盘上按空格键开始下一轮抢答,按其它键程序退出。 第33页 共42页
图6—1 竞赛抢答器电路图
设置8255为C口输入、A口输出,读取C口数据,若为0表示无人抢答,若不为0则有人抢答。根据读取数据可判断其组号。从键盘上按空格键开始下一轮抢答,按其它键程序退出。
响铃的DOS功能调用:
MOV DL, 7 ; 响铃ASCII码为07
MOV AH ,2
INT 21H
8255动态分配地址:
控制寄存器:0EC0BH
A口地址:0EC08H
C口地址:0EC0AH
三.程序流程图
第34页 共42页
图6—2 抢答器流程图
四.源程序
DATA SEGMENT
LIST DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
;8个显示字符对应的共阴极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
MOV DX,0EC0BH ;写控制寄存器,对8255进行初始化
MOV AL,89H ;标志位:1,A口方式0:00,A口输出:0,PC7~ PC0输入:1001 OUT DX,AL
L0: MOV DX,0EC0AH ;C口地址
IN AL,DX ;读C口状态,检测有无按钮按下,1代表有键按下
CMP AL,0
JZ L0 ;0无人抢答,则循环检测
MOV BL,0 ;用BL计数右移次数,求是哪一组抢答了
L1: INC BL
SHR AL,1 ;将AL逻辑右移直至标志位为1时,抢答组被找到
JNC L1
DEC BL ;右移次数减1等于抢答组的组号
MOV AL,BL ;
MOV BX,OFFSET LIST ; 七段显示代码表的首地址送BX
AND AX,00FFH ; 屏蔽AX高字节,保留组号
ADD BX,AX ; 代码表首地址BX加组号AL等于显示字符代码的地址 MOV AL,[BX] ; 取出字符送AL
MOV DX,0EC08H ;
OUT DX,AL ; 送到A口输出显示
MOV DL,7 ;响铃的ASCII是7
MOV AH,2
INT 21H
MOV AH,01H ;01号功能从键盘输入
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
五.实验总结
这是最后一次做微机原理实验了,实验过程中涉及到本课程中的接口芯片、中断、定时、DOS功能调用等知识,是微机原理与接口技术的综合应用,旨在锻炼我们运用接口技术完成一个较大的综合设计。老师建议我们先不要参考实验指导书上给出的电路图,根据自己掌握的知识,以及前面实验积累的经验,自己尝试着去连接电路。电路看是复杂,但自己连接以后觉得其实很简单,按照程序设计,8255的PC口作为输入,PA口作为输出,所以八个逻辑开关依次连接到8255的PC0~PC7管脚,七段显示数码管的a~g共七个管脚依次连接到8255的PA0~PA6管脚,在连上片选以及供电电源等,就完成了硬件电路的设计与连接。只要自己思路清晰,对8255的管脚功能熟悉掌握,结合所编写的程序去做,硬件电路的设计与实现
就能轻松应对了。
这六次微机原理与接口技术的实验结束后,我们在硬件电路连接、软件编程应用、查错与调试等各个方面的能力都得到了提升,让我学会了如何将多种接口的配合使用,掌握了软件、硬件协同工作的方法。
七、参考文献
1.戴胜华,张凡,盛珣华. 微机原理与接口技术[M]. 北京:北京交通大学出版社, 2008.
2. Barry B.Brey. intel系列微处理器结构、编程和接口技术大全[M]. 北京:机械工程出版社,1998.