微机原理实验总结
实验三、8253的各种工作方式测试实验
一、实验内容
1、编写程序分别显示0,2,3几种工作方式下的波形
本实验使用8253A的定时/计数器2,GATE2接高电平,CLK2接1MHZ的时钟脉冲,OUT2接示波器观测输出波形。
实验中,要求记录定时器的时间常数,测试方式2和方式3下的输出周期信号的频率和周期。
2、采用图3-2来产生1秒的时钟周期(此内容不做要求,根据实验的时间确定)
图3-2为定时器的级联方式,主要用于产生长时间的定时操作。图3-2实际上对输入时钟进行了两次分频。
三、实验线路连接
io8253aequ 200h
io8253bequ 201h
io8253cequ 203h
code segment
assumecs:code
start:
mov dx,io8253c ;向8253写控制字
mov al,36h ;使0通道为工作方式3
outdx,al
mov ax,0 ;写入循环计数初值1000
mov dx,io8253a
out dx,al ;先写入低字节
moval,ah
out dx,al ;后写入高字节
mov ah,4ch ;程序退出
int 21h
code ends
end start
实验四、利用8255A实现LED的流水点亮实验
一、实验内容
PC口接8个拨动开关K1-K8,PB口接8个LED。初始由开关K1-K8设定8位不同的值,当执行程序后LED按K1-K8初始设定的值点亮,并向右流动(8255A工作在0方式),同时在数码管上显示“8255A”(数码管的片选信号自定)。
关于数码管的编程方法请看实验平台介绍(TPC-386EX学生实验指导书)。
二、实验接线图
将8255A的片选信号8255CS插孔和译码输出210H-21FH插孔相连。
三、实验编程提示
根据难易程度,学生可以选择完成下列两个程序之一:
1、 LED右流水仅仅取决于第1次开关的位置,一旦LED流水开始, LED流水的次序将不再理睬开关位置的重新变化。
2、 在LED右流水中,如果开关的位置发生了变化,LED右流水从变化的位置重新开始。 程序2的提示:程序要能检测到某个时间开关状态的变化,并针对变化后的开关状态右流水,因此程序中要有两个变量,一个存当前开关的状态以检测开关状态是否发生了变化,一个存LED右流水的状态,以便使LED连续右流动。
为了使流水显示明显,每个位置应加延时程序。
datasegment
io8255_a equ200h ;8255基址值
io8255kzequ203h
tab db 01h,02h,04h,08h,10h,20h,40h,80h,55h,0aah
data ends
codesegment
assume cs:code,ds:data
start:
movax,data
movds,ax
l:
call disp
jmp l
mov
dx,io8255kz
mov al,10001000B ;设置工作方式为方式0,A口输出
out dx, al
mov cx,10
movbx,offset tab
loop1:
mov dx,io8255_a
mov al,[bx]
outdx,al
incbx
loop loop1
mov ah,4ch
int 21h
disp:
mov dx,210h
mov al,06h
outdx,al
mov dx,211h
mov al,01h
outdx,al
mov cx,0ffh
l1:
loop l1
mov dx,210h
mov al,5bh
outdx,al
mov dx,211h
mov al,02h
outdx,al
mov cx,0ffh
l2:
loop l2
ret
codeends
end start
实验五、8259A中断控制器实验
一、实验内容
每按动一次PLUS1按钮,产生一次中断信号向主8259A发出中断请求,在中断程序里将LED指示等交替点亮和熄灭。
TPC-386EX实验平台MIR5和SIR0的中断类型号的定义如下表所示:
表5-1 实验平台中断类型号的定义
二、实验接线图
注意:实验系统已经连接了主8259A的片选信号(地址为20H),请将8255A的片选信号8255CS插孔和译码输出200H-20FH插孔相连(见图5-1示)。
三、实验编程提示
1、 实验系统已经对8255A初始化(即已初始化ICW1-ICW4),你仅需要设置中断矢量(在
中断矢量表里填写中断服务程序的入口地址),打开中断(包括CPU中断和8259A中断)即可;ICW初始化时设定为非自动结束方式,则需要在中断结束前(中断服务程序的最后)发中断结束命令。
2、 中断服务程序的主要功能是交替点亮和熄灭LED指示灯(即第1次进中断点亮LED,第
2次进中断则熄灭LED)。
code segment
assumecs:code
intport1 equ 0020h ;中断号
intport2equ 0021h
ioconptequ 203h ;8255a 控制字端口地址
ioaptequ 200h ;8255a pa端口地址
iobptequ 201h ;8255a pb端口地址
iocptequ 202h ;8255a pc端口地址
jmp start
start:
mov al,11011111b
out intport2,al
mov al,00100000b
out intport1,al
mov al,90h
movdx,ioconpt
outdx,al
call wrintver;置中断矢量
sti
l:
hlt
jmp l
wrintver:
mov ax,0h
moves,ax
mov di,4*35h
lea ax,intirq3
moves:[di],ax
movax,seg intirq3
moves:[di+2],ax
ret
intirq3:
push ax
push dx
cli
xor cl,0ffh
movdx,iobpt
moval,cl
outdx,al
mov al,20h
out intport1,al
sti
pop dx
pop ax
iret
code ends
end start
实验六、中断方式的A/D数据采集系统实验
二、实验内容
使用ADC0809的通道0,接入0-5V的直流电压,用WR调整模拟电压值,A/D的转换
结束信号EOC接在8259A的MIR5上,采集100个数据并存入内存中,同时将采集的16进制数据显示在数码管上。请多次调整0-5V的电压值(旋动W1旋钮),进行A/D采集,并观测内存中的数据的变化情况。
三、实验现象
每次采集的100个数据可能是相同的(数码管的数据也可能不变),当WR旋动时可以采到不同的数据。
四、实验接线图
实验系统已经连接了8259A的片选信号,只要将ADC0809片选信号0809CS插孔和译码输出200H-20FH插孔相连,ADC0809的0通道接到旋钮WR上即可。数码管的片选信号有学生自定。
五、实验编程提示
实验平台的监控系统已经对8259A初始化,你只要设置中断向量,开中断,检测采样次数就可以了。第1次启动A/D的工作要在主程序里做(否则不能进入中断服务程序),中断服务程序里要采集数据、存储数据、并启动下一次A/D转换,同时记着要发中断结束命令。 code segment
assumecs:code
intport1 equ 0020h ;中断号
intport2equ 0021h
start_port equ 200h
oe_portequ 201h
buffdb 51 dup(?)
jmp start
start:
;初始化ocw1,ocw2
mov al,11011111b
out intport2,al
mov al,00100000b
out intport1,al
call wrintver ;置中断矢量
mov bx,offset buff ;把bx指向buff
mov cx,0 ;记录次数
;启动
adc
movdx,start_port
outdx,al
sti
l:
hlt
jmp l
wrintver:
mov ax,0h
moves,ax
mov di,4*35h
lea ax,intirq3
moves:[di],ax
movax,seg intirq3
moves:[di+2],ax
ret
intirq3:
push ax
push dx
cli
movdx,oe_port
in al,dx ;取数
mov [bx],al ;存入数组
incbx ;数组指针加1
;在黑框中输出
movdl,al
add dl,30h
mov ah,2
int 21h
cmp cx,50;判断是否已经50次,是的话停止 jnz end1;当zf=1(其他时候为0),跳转到结束 ;重新启动adc
movdx,start_port
outdx,al
sti
pop dx
pop ax
iret
end1:
mov ax,4c00h
int 21h
code ends
end start