微机原理与接口技术
实验报告
姓名:张楠乔
学号: 10213030
班级:自动化1004
指导教师:周永华
实验一交通灯控制实验
一、实验目的
通过并行接口8255实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用。
二、实验内容
实验内容,如图1连接电路,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东西路口的交通灯与PC2、PC1、PC0相连,编程使六个灯按交通灯变化规律亮灭。
图1 连接图
要求:
十字路口交通灯的变化规律要求:
(1)南北路口的绿灯、东西路口的红灯同时亮30秒左右。
(2)南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮。
(3)南北路口的红灯、东西路口的绿灯同时亮30秒左右。
(4)南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁若干次。
(5)转(1)重复。
三、实验流程图
图2 流程图
四、试验程序:
data segment
pc equ 0c40ah
pd equ 0c40bh
data ends
stack1 segment stack
dw 100Hdup(?)
stack1 ends
code segment
assume cs:code,ds:data,ss:stack1
start: mov dx,data
mov ds,dx ;初始化
mov al,80h
mov dx,pd
out dx,al
s: mov al,24h
mov dx,pc
out dx,al
call delay3 ;南北绿灯亮、东西红灯亮3秒
mov cx,6
y1: mov al,44h
out dx,al
call delay1
mov al,04h
out dx,al
call delay1
loop y1 ;南北绿灯灭,南北黄灯闪,东西红灯亮
mov al,81h
out dx,al
call delay3 ;东西红灯灭,南北红灯、东西绿灯亮3秒
mov cx,6
y2: mov al,82h
out dx,al
call delay1
mov al,80h
out dx,al
call delay1
loop y2 ;东西绿灯灭,东西黄灯闪,南北红灯亮
mov dl,0ffh
mov ah,6
int 21h
jz s
mov ah,4ch
int 21h ;查询是否有键按下
delay3 proc ;延时3秒子程序
push cx
push ax
mov cx,0afffh
t1: mov ax,0ffffh
t2: dec ax
jnz t2
loop t1
pop ax
pop cx
ret
delay3 endp
delay1 proc ;延时半秒子程序
push cx
push ax
mov cx,1d55h
t3: mov ax,0ffffh
t4: dec ax
jnz t4
loop t3
pop ax
pop cx
ret
delay1 endp
code ends
end start
五、实验步骤
(1)将PC总线接口卡插在任意扩展槽中(已接好)。
(2)用50芯线扁平电缆线连接接口卡和实验台。
(3)如图1所示连接线路。
(4)打开实验箱电源,启动TCP-2003实验系统软件环境。
(5)测试8255、LED和串口是否完好。
六、实验现象:
南北路口的绿灯、东西路口的红灯同时亮3秒左右,然后南北路口的黄灯闪烁若干次,东西路口的红灯继续亮,接着南北路口的红灯、东西路口的绿灯同时亮3秒左右,然后南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁若干次。如此循环。结果与实验要求相符。
七、实验心得
本实验的重要一部分就是延时子程序,编写程序时候要根据流程图,这样就从一定程度上简化了实验,还有就是实验的调试过程,一定要细心又有耐心
实验二可编程定时器/计数器(1)
一、实验目的
掌握8253的基本工作原理和编程方法
二、实验内容
1、按电路图虚线连接电路,将计数器0设置为方式0,计数器初值N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。
实验电路图:
三、试验流程图
四、实验程序:
CODE SEGMENT
ASSUME CS:CODE
START:
MOV DX,0EC03H
MOV AL,10H ;设置计数器0工作方式0
OUT DX,AL
MOV DX,0EC00H
MOV AL,03H ;设置N为3(可更改设置)
OUT DX,AL
L1: MOV DX,0EC00H
IN AL ,DX ;读计数器0的计数值
AND AL,0FH ;屏蔽高四位
CMP AL,09H
JLE L2
ADD AL ,07H
L2: ADD AL, 30H ;判断大小并将其变为ASCII码
MOV DL ,AL
MOV AH,02H
INT 21H ;2号功能显示计数值
MOV DL,0DH ;回到本行最前面
MOV AH,02H
INT 21H
MOV DL,0FFH
MOV AH,06H
INT 21H ;6号功能输入任意字符
JZ L1 ;无键按下,执行L1循环
MOV AH,4CH ;
INT 21H
CODE ENDS ;结束
END START
五、实验结果及分析:
程序运行之后逻辑笔代表低电平的绿灯亮,当按下脉冲按键后,屏幕上会显示数字3,每按一下按键数字就会减1,直到为0,且同时指示灯由绿灯变成红灯。
计数脉冲由CLK端输入,计数初值写入16位计数初值寄存器,并加载到16位减‘1’计数执行部件。方式0计数工程中,OUT一直保持低电平,直到计数达‘0’,OUT输出由低电平变为高电平。
可编程定时器/计数器(2)
一、实验目的
掌握8253的基本工作原理和编程方法
二、实验内容
按图连接电路,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率为1Hz)
电路图:
三、实验流程图:
四、实验程序:
CODE SEGMENT
ASSUME CS:CODE
START: MOV AL,36H ;计数器0为工作方式3,先读低字节再读高字节
MOV DX,0EC03H
OUT DX,AL
MOV AX,1000 ;设置计数初值
MOV DX,0EC00H
OUT DX,AL
MOV AL,AH
OUT DX,AL ;送计数初值至计数器0
MOV AL,76H ;计数器1工作方式3
MOV DX,0EC03H
OUT DX,AL
MOV DX,0EC01H
MOV AX,1000 ;设置计数初值
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV AH,4CH ;返回操作系统
INT 21H
CODE ENDS
END START
五、实验结果:
计数器0输入1MHz作为时钟,工作在方式3方波发生器,计数初值为1000,输出1000Hz的方波,此方波做为计数器1的时钟接入,而计数器1也工作在方式3方波发生器,输出1Hz的方波,用逻辑笔观察看到的现象为红、绿灯不停交替闪烁。
实验三中断实验
一、 实验目的
1、掌握PC机中断处理系统的基本原理
2、学会编写中断服务程序
二、 实验原理与内容
1、实验原理
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的设置来和某一根中断相连接才能进行中断申请
2、实验内容
实验电路如图5-8 直接用手动产单脉冲作为中断请求信号只需连接一根导线要求每按一次开关产生一次中断在屏幕上显示一次 TPC pci card Interrupt 中断10次后程序退出
编程提示:
1. 由于9054的驱动程序影响直写9054芯片的控制寄存器, 中断实验需要在纯DOS的环境中才能正常运行。
2. 由于TPC卡使用PCI总线, 所以分配的中断号每台微机可能都不同,编程时需要了解当前的微机使用那个中断号并进行设置。获取方法是在纯DOS环境中,运行一个读PCI配置空间的程序“PORTR.EXE”,该程序能够获得本机TPC板卡或所有PCI板卡的硬件资源,如IO、内存、中断占用情况。然后根据获得的中断请求号码来修改程序中的中断向量、中断掩码的参数,并重新编译链接后即可。
3. 由于TPC卡使用9054芯片连接微机,所以在编程使用微机中断前需要使能9054的中断功能代码如下:
mov dx,ioport_cent+68h ;设置 tpc 卡中9054芯片io口,使能中断
inax,dx
or ax,0900h
outdx,ax
其中IOPORT_CENT是9054芯片寄存器组的I/O起始地址 ,每台微机可能都不同, 编程时 需要了解当前的微机使用哪段并进行设置,获取方法请参看汇编程序使用方法的介绍。+68H的偏移是关于中断使能的寄存器地址 设置含义如下:
三、实验流程图
四、实验程序
;386以上微机适用
;纯dos下才能使用
;tasm4.1或以上编译
data segment
int_vect EQU 071H ;中断0-7的向量为:08h-0fh,中断8-15的向量为:70h-77h
irq_mask_2_7 equ 011111011b ;中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零
irq_mask_9_15 equ 011111101b ;中断0-7时全一,中断8-15时从低至高相应位为零
ioport_centequ 0d800h ;tpc卡中9054芯片的io地址
csregdw ?
ipregdw ? ;旧中断向量保存空间
irq_timesdw 00h ;中断计数
msg1db 0dh,0ah,'TPC pci card Interrupt',0dh,0ah,'$'
msg2db 0dh,0ah,'Press any key to exit!',0dh,0ah,'$'
msg3db 0dh,0ah,'Press DMC to interrupt 10 times and exit!',0dh,0ah,'$'
data ends
stacks segment
db 100 dup (?)
stacks ends
code segment
assumecs:code,ds:data,ss:stacks,es:data
start:
;Enable Local Interrupt Input
.386
cli
movax,data
movds,ax
moves,ax
movax,stacks
movss,ax
mov dx,ioport_cent+68h ;设置tpc卡中9054芯片io口,使能中断
inax,dx
or ax,0900h
outdx,ax
moval,int_vect ;保存原中断向量
mov ah,35h
int 21h
movax,es
movcsreg,ax
movipreg,bx
movax,cs ;设置新中断向量
movds,ax
movdx,offsetint_proc
moval,int_vect
mov ah,25h
int 21h
in al, 21h ;设置中断掩码
and al, irq_mask_2_7
out 21h, al
inal, 0a1h
and al, irq_mask_9_15
out 0a1h, al
movax,data
movds,ax
movdx,offset msg2
mov ah,09h
int 21h
movdx,offset msg3
mov ah,09h
int 21h
mov irq_times,0ah
sti
loop1:
cmp irq_times,0 ;等待中断并判断中断10次后退出
jz exit
mov ah,1
int 16h
jnz exit ;按任意键退出
jmp loop1
exit: cli
movbl, irq_mask_2_7 ;恢复中断掩码
notbl
inal, 21h
or al, bl
out 21h, al
movbl, irq_mask_9_15
notbl
inal, 0a1h
or al, bl
out 0a1h, al
movdx,ipreg ;恢复原中断向量
movax,csreg
movds,ax
mov ah,25h
moval,int_vect
int 21h
mov dx,ioport_cent+68h ;设置tpc卡中9054芯片io口,关闭中断
inax,dx
and ax,0f7ffh
outdx,ax
mov ax,4c00h
int 21h
int_proc proc far ;中断处理程序
cli
push ax
push dx
push ds
decirq_times
movax,data ;Interrupt to do
movds,ax
movdx,offset msg1
mov ah,09h
int 21h
mov al,20h ;Send EOI
out 0a0h,al
out 20h,al
pop ds
pop dx
pop ax
sti
iret
int_procendp
code ends
end start
五、实验现象
每按下一次中断按钮,产生中断并在电脑屏幕上显示一次中断信息,当中断十次后,则结束程序,回到DOS界面。
;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!'
mov ah,09h
int 21h
mov irq_times,0ah
sti ;允许可屏蔽中断请求进入
loop1:
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
exit: cli
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 ah,25h
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
sti ;开中断
iret
int_proc endp
code ends
end start
六、实验心得
中断实验相对来说是比较难的一次实验,它要求在纯DOS界面下执行,因此得用DOS命令调用程序,并进行编译链接执行。这就增加了本来已经熟悉的实验软件操作的难度。在实验中,需注意以下几个问题:
1. 要装入新的中断前需将该处原中断取出保存,当用完后还需再次把原中断装入,以防止原中断内容被覆盖或者发生改变。
2. 在本次实验中还需将用到的仪器先使能,否则无法正常工作。
3. 中断需要用的堆栈段,因此必须定义足够的堆栈段。
实验四模/数转换器
一、实验目的
了解模/数转换的基本原理,掌握ADC0809的使用方法。
二、实验内容
实验电路原理图如图5-5。通过实验台左下角电位器RW1输出0~5V直流电压送入ADC0809通道0(IN0), 编程采集IN0输入的电压,在屏幕上显示出转换后的数据(用16进制数)
图5-5 模数转换电路
三、实验提示
1. ADC0809的IN0口地址为298H,IN1口地址为299H。
2. IN0单极性输入电压与转换后数字的关系为:
NUU256iREF=
其中Ui为输入电压,UREF为参考电压,这里参考电压为PC的机+5V电源。
3. 一次A/D转换的程序可以为
MOV DX, 口地址;启动转换
OUT DX, AL
;延时
IN AL,DX ;读取转换结果放在AL中
四、实验流程图
五、实验程序
STACK1 SEGMENT PARA STACK
DW 100 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK1
START:MOV DX,0C418H ;ADC0809地址为0C410H
MOV AL,0 ;向其地址写入0,启动ADC0809进行模数转换
OUT DX,AL
MOV CX,0FFFH ;延时,使ADC0809完成转换
T1:MOV DI,0FFFFH
T2:DEC DI
JNZ T2
LOOP T1
IN AL,DX ;将转换结果读进来
MOV BL,AL ;将数据的高,低位存入BL位存入AL
AND AL,11110000B
AND BL,00001111B
MOV CL,4
SHR AL,CL
CMP AL,0AH ;比较AL的值与0AH的大小
JAE L0 ;若大于等于0 AH转L0
ADD AL,30H ;若小于0AH加30H转换成它的ASCII码
JMP L1
L0:ADD AL,37H ;大于0AH时加37H转换成它的ASCII码
L1:CMP BL,0AH ;比较BL的值与0AH的大小
JAE L2 ;若大于等于0AH转L2
ADD BL,30H ;若小于0AH加30H转换成它的ASCII码
JMP L3
L2:ADD BL,37H
L3:MOV DL,AL ;2号功能调用,显示高位
MOV AH,02H
INT 21H
MOV DL,BL ;显示低位
MOV AH,02H
INT 21H
MOV DL,13 ;回车
MOV AH,02H
INT 21H
MOV DL,10 ;换行
MOV AH,02H
INT 21H
MOV DL,0FFH ;按任意键退出
MOV AH,06H
INT 21H
JZ START
MOV AH,4CH
INT 21H
CODE ENDS
END START
六、实验现象
调节滑动变阻器,屏幕上显示的数值(00~FF)随着电阻的改变而改变,并且是整屏幕显示。
七、实验心得
本次实验是将电压值经过AD后把模拟量变化为了数字量,使得表示更精确了,也方便于读数。启动转换后需要等待一段时间,以防还没有转换好就读出结果,造成错误。输出结果要求用16进制显示,因此还需将结果转换为对应的ASCII码。
实验五串行通信
一、 实验目的
1、 掌握串行接口芯片8250的基本原理和编程方法
2、 熟悉PC机串行的基本连接方法
3、 进一步了解串行通信的基本原理
二、 实验内容
1、 PC机RS-232串口自发自收
2、 自发自收实验:将RS232C的DB9的电缆插头第2脚和第3脚短接,然后编程实现。
3、 2台PC的串行通信:用 RS232C的DB9的电缆(交叉线)将两台机器连接,然后编程实现收发数据。
三、 硬件连接
四、实验程序
1-单机通信(自发自收)
CODE SEGMENT
ASSUME CS:CODE
START: MOV AL,10000000B ;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,00001010B ;7位数据,1位停止,奇校验
MOV DX,3FBH
OUT DX,AL ;写入线路控制寄存器
MOV AL,00010000B ;自检控制
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 ;出错,转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 ;保留7位数据
CMP AL,03H ;是Ctrl+C?
JNZ CHAR
MOV AH,4CH ;返回DOS
INT 21H
CHAR: PUSH AX
MOV DL,AL
MOV AH,2H ;显示接收字符
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,0030H
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,00100000B ;发送寄存器空否,不空,返回等待
JZ WAIT_FOR
SEND: MOV AH,1
INT 21H
CMP AL,21H
JZ EXIT
MOV DX,3F8H ;读键盘,若是'!',返回DOS,若不是,则发送
OUT DX,AL
JMP WAIT_FOR ;返回等待
EXIT: MOV AX,4C00H
INT 21H
CODE ENDS
END START
接收程序:
CODE SEGMENT
ASSUME CS:CODE
START: MOV AL,80H ;8250初始化,设DLAB=1
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 ;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,00000001B ;接收数据就绪否
JNZ RECEIVE ;转接收
JMP WAIT_FOR ;返回等待
RECEIVE:
MOV DX,3F8H ;读接收数据
IN AL,DX
AND AL,01111111B ;保留7位数据
CMP AL,21H ;是'!'?
JNZ CHAR
MOV AX,4C00H ;返回DOS
INT 21H
CHAR: PUSH AX
MOV DL,AL
MOV AH,2 ;显示接收字符
INT 21H
POP AX
JMP WAIT_FOR ;返回等待
CODE ENDS
END START
五、 实验现象及分析:
自发自收:当把2口和3口用跳线连上时,输入带屏幕显示字符后,屏幕上会出现两个相同的字符,当把跳线拔出,屏幕上显示一个字符。
双机通信:发送机发出一个字符,接收机屏幕上会显示该字符。当发送字符为“!”时,程序停止运行
六、 实验心得:
老师提供了本实验的程序文件,所以难度相对较低,只需读懂程序即可。
实验六抢答器
一、实验目的
1、了解微机化竞赛抢答器的基本原理。
2、进一步学习使用并行接口。
二、实验内容
下图为竞赛抢答器(模拟)的原理图,逻辑开关K0~K7代表竞赛抢答按钮0~7号,当某个逻辑电平开关置“1”时,相当某组抢答按钮按下。在七段数码管上将其组号(0~7)显示出来,并使喇叭响一下。从键盘上按空格键开始下一轮抢答,按其它键程序退出。
三、编程分析
1、设置8255为C口输入、A口输出,读取C口数据,若为0表示无人抢答,若不为0则有人抢答。根据读取数据可判断其组号。从键盘上按空格键开始下一轮抢答,按其它键程序退出。
2、计算组号的算法:
组号=C口数据连续除以2得到商为零的除法运算次数
MOV AH,0
MOV DL,2
MOV CL,0
JISUAN: DIV DL
INC CL
CMP AL,0
JNZ JISUAN
DEC CL
MOV AL,CL
3、响铃的DOS功能调用:
MOV DL, 7 ; 响铃ASCII码为07
MOV AH ,2
INT 21H
四、程序设计流程图
五、汇编语言程序:
DATA SEGMENT
LIST DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DATA ENDS
STACK1 SEGMENT STACK
K DW 200 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START:
MOV AX,DATA ;初始化数据
MOV DS,AX
MOV AX,STACK1
MOV SS,AX
MOV DX,0C40BH ;初始化8255,设定C口输入、A口输出
MOV AL,10001001B
OUT DX,AL
BIN: MOV DX,0C408H ;清除A口,消除影响
MOV AL,0
OUT DX,AL
L1: MOV DX,0C40AH ;读入C口
IN AL,DX
CMP AL,0 ;与0比较,为零则循环等待
JZ L1
MOV DL,0
CNT: SHR AL,1 ;逻辑判断抢答组号
JZ OP
INC DL
JMP CNT
OP:
MOV AL,DL
MOV BX,OFFSET LIST
XLAT ;查表指令,计算物理地址
MOV DX,0C408H
OUT DX,AL ;A口输出
RING:
MOV DL,7 ;ASCII码为07,响铃
MOV AH,2
INT 21H
L2:
MOV AH,08H
INT 21H
CMP AL,20H ;检测空格键下一轮抢答
JZ BIN
MOV AH,4CH
INT 21H
CODE ENDS
END START
六、实验现象及分析:
初始状态为数码管全亮。拨下任一开关后,铃响,同时数码管显示该组的组号。按空格键,恢复到初始状态。
七、实验心得:
组号的计算跟显示是个难点,首先是计算,要用到移位、循环、比较,显示则要用到查表,所以看似简单的抢答器程序设计其实并不简单,因为覆盖的知识点较多,但是,经过前几次的实验,这几方面都已经经受多次考验了,总体上也不算难。
实验总结
通过微机实验,我不仅熟悉了试验箱和这个软件平台,同时,也进一步巩固了课本所学知识,并且更深刻的了解到8255 、8259等芯片的用途及初始化,编程注意事项等。在做实验的过程中,我也注意到了一些课堂上不曾留意的小细节,弥补了自己学习中的不足。