8254A不同工作方式的实验
一、实验目的 掌握8254A和微机接口的连接方法,了解8254A的基本的工作原理和编程方法。理解8253A定时/计数器的各种工作方式的特点;通过观察实验波形直观地了解8254几种工作方式的异同。
二、实验内容 1、将8254计数器0设为工作方式0,计数器初值设置为N(N<0FH)。将实验台上单脉冲接到CLK0上,手动逐个输入单脉冲,用L0和示波器观察OUT0电平变化(输入N+1个脉冲后OUT0变高电平,L0亮) 2、编写程序分别显示2,3工作方式下的波形。要求2方式的输出频率为1000Hz,3方式的输出频率为2000Hz。本实验使用8254A的定时/计数器2,GATE2接到+5V或地,CLK2接1MHZ时钟脉冲,OUT2接示波器观测输出波形。 3、采用定时器0和定时器1的级联方式,周期性的点亮和熄灭发光二极管各0.5秒。
三、实验线路连接 1、实验1使用的计数器0,因此out0连接L0作为计数器输出信号的观察;gate0 连接+5v的高电平,即保持允许计数的状态;clk0连接上升沿作为手动输入的脉冲信号;8254的CS连接译码电路的Y0口。 2、实验2采用的是计数器2,因此out0连接示波器观察输出波形;gate0 连接+5v的高电平,即保持允许计数的状态;clk0连接1MHZ作为输入的脉冲信号;8254的CS连接译码电路的Y0口。 3、实验3采用的级联方式,其中CLK0连接1MHZ作为输入的脉冲信号。GATE0连接的+5v高电平,即保持允许计数的状态;OUT0连接CLK1,将计数器1的输出电平信号作为脉冲信号输送给计数器1. GATE1连接高电平,即保持允许计数的状态;OUT1连接示波器,观察其输出波形,同时OUT1还连接L0, 观察小灯泡的亮灭。 四、实验编程提示 编写4个实验程序(分别是0,2,3,级联方式)并分别执行。在观察各种方式的输出波形时,要分析测试结果的原因。
五、实验步骤 1、 根据原理图正确连接实验线路(需要连接红线)。 2、 正确理解实验原理。 3、 编写实验程序,并上机调试,观察实验结果。
- 首先在向283H中送入方式命令字00010000b,表示的是选择计数器1,写低字节,采用方式0,二进制计数。
- 向计数器0送入初值03h(N)。
实验结果分析: 一开始灯泡是灭的,示波器对应的是低电平,然后手动给4(N+1)个正脉冲后,小灯泡持续变亮,并且示波器出现并保持高电平。由方式0输出的信号可知,当计数结束后,OUT信号由低变为高电平,并维持在高电平,因此LED灯会一直亮。程序写入计数初值是写入初值寄存器的,之后到来的CLK高电平的后沿才将计数初值送到减一计数器,因此从CLK的第2个下降沿才开始减1计数。因此在手动输入N+1次的高电平后,LED灯才会亮
- 首先在向283H中送入方式命令字10110100b,表示的是选择计数器2,先写低字节再写高字节,采用方式2,二进制计数。
- 计数器2的初值是1MHZ/1000HZ=1000=3E8h
实验结果: 该方波的频率是999.990HZ 约等于1000HZ,即1个周期是1ms。设置完方式2后,out1变为高电平,写初值寄存器后,计数器启动,当计数器减到1,OUT变为0,输出宽度为一个CLK周期的负脉冲,并自动重新装入初始值,自动启动计数。因此在每个周期中先有一个很短下降沿,然后是很长的上升沿,二者所占的时间跨度的比为999:1, 因此宏观上看像是一条直线。
- 首先在向283H中送入方式命令字10110110b,表示的是选择计数器2,先写低字节再写高字节,采用方式3,二进制计数。
- 计数器2的初值是1MHZ/2000HZ=500=1F4h
实验结果: 写入方式字3后,OUT->1, 然后将计数初值500送入到计数缓冲器中,在下一个下降沿到来时送入到减1计数器中。然后在每一个周期中的前250次中,OUT维持高电平不变,然后在后250次中OUT变为低电频,所以占空比为1:1,示波器的波形是方波。并在每个周期的最后一个CLK中,将计数初值重新装入减一计数器中,自动进入到下一个周期的计数。 是示波器上显示的频率是1.99998KHZ约等于2000HZ,验证了程序的正确性。
- 级联:
由于实验的要求是小灯泡先亮0.5秒,然后灭0.5秒,周期性的亮灭,因此需要的周期是0.5+0.5=1s,对应的频率为1/1=1HZ, 一次对应的计数个数为1Mhz/1=1000000,由于采用的是级联的方式,所以将计数器0采用2方式的输出OUT信号,作为计数器1的时钟脉冲信号。因此只要保证计数器1和2的计数初值相乘为1000000即可。
- 首先向8253H中送入方式命令字00010100b,表示计数器0,只写低字节,采用工作方式 2,2进制计数
- 然后向计数器0送入计数的初值1000
- 然后向8253H中送入方式命令字01010110b,表示计数器1,只写低字节,采用工作方式 3,2进制
- 最后向计数器1中送入初值1000.
实验结果: 输出方波的周期是1s,同时小灯泡以0.5s为时间单位周期性的闪烁。因为计数器0的计数初值是1000,连接的是时钟脉冲信号是1Mhz,所以输出的OUT信号的频率是1Mhz/1000=1000hz,由方式2的输出波形可知,每1ms输出一个负脉冲传给计数器1,计数器1的计数初值是1000,因此接收500个负脉冲后,即每隔0.5s电平发生跳变,由高电平变为低电平或者由低电平变为高电平,满足了实验的要求,验证了程序的正确性。
六、思考题 观测到的0方式是怎样的波形,为什么会出现这种现象? 方式0的波形是:先是低电平,然后是高电平,并一直保持高电平不变。这是由于方式0的工作方式所决定的。在方式0中,写入方式字后,OUT变为低电平。将计数初值写入初值寄存器后,在下一个到来的负脉冲将初值写入减一计数器,并开始计数,此时OUT仍然保持低电平,直到计数器中的值减为0,OUT才变为高电平,因此看到的示波器输出的波形显示低电平,然后手动给N+1个正脉冲后,示波器变为高电平,并保持在高电平不变,并不会将计数初值重新自动送入到减一计数器中。
七、源代码
Test0.asm
.model small
.386
code segment
start:
mov dx,283h;命令口地址
mov al,00010000b; 计数器0;只写低字节;2方式;二进制
out dx,al; 初始化
mov dx,280h; 选择计数器0
mov ax,03h;计数器初值是3
out dx,al; 只写低字节
code ends
end start
Test1.asm
.model small
.386
code segment
start:
mov dx,283h;命令口地址
mov al,10110100b; 计数器2;先低字节再高字节;2方式;二进制
out dx,al; 初始化
mov dx,282h; 选择计数器2
mov ax,3e8h;计数器初值1000
out dx,al; 先写低字节
mov al,ah;
out dx,al;再写高字节
code ends
end start
Test2.asm
.model small
.386
code segment
start:
mov dx,283h;命令口地址
mov al,10110110b; 计数器2;先低字节再高字节;2方式;二进制
out dx,al; 初始化
mov dx,282h; 选择计数器2
mov ax,1f4h;计数器初值500
out dx,al; 先写低字节
mov al,ah;
out dx,al;再写高字节
code ends
end start
Test3.asm
code segment
assume cs:code
start:
mov dx,283h; 命令口地址
mov al,00010100b; 计数器0,只写低字节,方式2,2进制
out dx,al
mov dx,280h; 计数器0
mov al,1000; 计数初值1000
out dx,al;
mov dx,283h; 命令口地址
mov al,01010110b; 计数器1,只写低字节,方式3,2进制
out dx,al
mov dx,281h;计数器1
mov al,1000;计数初值1000
out dx,al
code ends
end start
利用8255A实现LED流水灯点亮实验
一、 实验目的 该实验的目的在于让学生掌握8255A和微机接口的连接方法,了解8255A的基本的工作原理和编程方法。
二、 实验内容 PC口接8个拨动开关K1-K8, PB口接8个LED。初始由开关K1-K8设定8位不同的值,当执行后LED按K1-K8初始设定的值点亮,并向右流动。8255工作在0方式。
三、 实验线路连 1、8255A的CS端口与地址译码器的280H处相连 2、拨动开关的K0-K7分别于与PA0-PA1相连,作为输入 3、发光二极管LED0-LED7分别于PB0-PB7相连,作为输出 四、 实验编程提示 LED右流水仅仅取决于第1次开关的位置,一旦LED流水开始, LED流水的次序将不再理睬开关位置的重新变化。提示:为了使流水显示明显,每个位置应加延时程序。
五、 实验步骤 a) 根据原理图正确连接实验线路(需要连接红线)。 b) 正确理解实验原理。 c) 编写实验程序,并上机调试,观察实验结果。 实验流程图 编程思路: BH存放新的开关状态 BL存放旧的开关状态 CL存放流水灯的状态(即当前亮的是哪个灯) 1 首先初始时,先读取开关的初始状态并保存到CL和BL中 2. 然后在循环LP1中首先判断开关的状态是否发生改变,如果发生改变就把新的开关状态存入CL中,更新流水线状态 3. CL对应位置的LED灯亮 4. 调用延时子程序 5. CL右移一位,即右流水 6. 跳转到LP1,即第二步 六、 思考题 在本实验的硬件电路中,能使用C口对LED指示灯控制码?如果可以写出2种控制方法(编程方法)。 可以,编程方法如下: 1 C口作为数据口:在数据段中将“PORTB EQU 281H;” 改为“PORTB EQU 282H;”,将LED连接到C口后即可变成通过C口对LED灯控制 2. C口作为命令口:通过C口按位置位/复位命令。例如将LED连接到C口后,通过 MOV DX,PORTD; PORTD对应的地址是283H MOV AL,00000001B OUT DX,AL; 即可实现将PC1置为1,使得LED1点亮
七、源代码
.model small
.386 ;
DSEG SEGMENT
PORTA EQU 280H; A端口
PORTB EQU 281H; B端口
PORTD EQU 283H; 命令与状态口
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS: DSEG
START:
MOV AX,DSEG;
MOV DS,AX;
MOV DX,PORTD
MOV AL,90H;1001 0000 初始化命令:A端口0方式输入,B端口0方式输出
OUT DX,AL;将初始化命令输入到命令状态口
MOV DX,PORTA;
IN AL,DX; 输入初始开关状态到AL
MOV CL,AL; CL保存流水状态
MOV BL,AL; BL保存旧的开关状态, 在此初始化BL
LP1:
MOV DX,PORTA
IN AL,DX
MOV BH,AL; BH存放新的开关状态
CMP BH,BL; 判断开关状态是否发生改变
JZ LIGHT; 如果开关状态未变,则调转到LIGHT
MOV BL,BH; 否则旧的开关状态变为新状态
MOV CL,BL; 把当前开关状态存入CL, 更新流水线状态
LIGHT:
MOV AL,CL; AL中存入流水线状态
MOV DX,PORTB;
OUT DX,AL; 灯亮
CALL DELAY1
ROR AL,1;右移一个灯
MOV CL,AL; CL 保存下一个要亮的灯
JMP LP1;
DELAY1 PROC ; 双重循环的延时子程序
MOV CX,25
AGAIN:
MOV DX,0FFFFH
DELAY:
DEC DX
JNZ DELAY
LOOP AGAIN
RET
DELAY1 ENDP
CSEG ENDS
END START
8259中断实验
一、 实验目的 该实验使学生掌握8259向量中断方式的硬件连接和软件编程的方法,同时使同学掌握中断和其它接口芯片配合来完成某一特定任务的方法。 二、 实验内容 1 手动产生单脉冲作为中断请求信号连接到MIRQ3上和SIRT10上。每按一次开关产生一次中断,在屏幕上显示’TPCA INTERRUPT’,中断10次后程序退出。 2. 8255的PC6作为中断源连接到MIRQ3上,每向8259A发出中断请求,使LED指示等交替点亮和熄灭。中断5次后程序退出。 三、实验线路连接 对于实验一:MIRQx 连接单脉冲1/正脉冲;对于实验二,SIRQx接单脉冲2/正脉冲。 对于实验二:8255的PC6连接到MIRQ3上,8255的CS连接到I/O译码地址的280端口,LED0~LED7分别连接到PA0~PA7
四、实验编程 实验1的算法流程图: 实验二的算法流程图 五、实验步骤 首先按照上述的电路图连接线路,然后运行程序代码,观察实验结果。
六、源代码附录
实验1源代码:
data segment
mess1 db 'main:TPCA INTERRUPT!',0dh,0ah,'$' ; 回车换行
mess2 db 'slave:TPCA INTERRUPT!',0dh,0ah,'$' ; 回车换行
data ends
code segment
assume cs:code,ds,data
start:
; 写主片的中断向量
mov ax, cs
mov ds, ax ; 段地址
mov dx,offset int3 ; 偏移地址
mov ax,250bh ; DOS 功能号25h:设置中断向量ds:dx =中断向量,al=中断类型号
int 21h
;写从片的中断向量
mov ax, cs
mov ds, ax ; 段地址
mov dx,offset int10 ; 偏移地址
mov ax,2572h ; DOS 功能号25h:设置中断向量ds:dx =中断向量,al=中断类型号
int 21h
;开放主片的IRQ3和IRQ2
cli ;修改中断向量时要关中断
in al,21h ;读IMR(奇地址)
and al,0f3h ;通过与运算,开放IRQ3和IRQ2中断 11110011
out 21h,al ;奇地址写OCW1,设置屏蔽字
; 开放从片的IRQ2
cli ;修改中断向量时要关中断
in al,0A1h ;读IMR(奇地址)
and al,0fbh ;通过与运算,开放IRQ3和IRQ2中断 11111011
out 0A1h,al ;奇地址写OCW1,设置屏蔽字
;设置中断计数器
mov cx,10 ;设置计数初值
;循环等待
sti ;CPU开中断
ll: ;循环等待中断
cmp 0,cx;
jnz next; ; 循环结束
jmp ll
next:
;返回DOS
mov ah,4ch ;结束程序
int 21h
int3 proc near: ;主片:中断子程序
; 保护现场
push dx
push ax;
;显示响应中断的提示信息
mov ax,data
mov ds,ax
mov dx,offset mess1
mov ah,09 ; dos 功能号:09h ds:dx= 串地址
int 21h
;关闭中断
mov al,20h ;发出EOI结束中断
out 20h,al
dec cx ;计数值减一
in al,21h ;读屏蔽字
or al,08h ;针对IRQ3屏蔽 0000 1000
out 21h,al ;OCW1 设置中断屏蔽
;开中断
sti
;恢复现场
pop ax;
pop dx;
;中断返回
iret
int3 endp
int10 proc near: ;从片:中断子程序
; 保护现场
push dx
push ax
;显示响应中断的提示信息
mov ax,data
mov ds,ax
mov dx,offset mess2
mov ah,09 ; dos 功能号:09h ds:dx= 串地址
int 21h
;关闭中断
mov al,20h ;发出EOI结束中断
out 20h,al
dec cx ;计数值减一
in al,0A1h ;读屏蔽字
or al,04h ;针对IRQ2屏蔽 0000 0100
out 0A1h,al ;OCW1 设置中断屏蔽
;开中断
sti
;恢复现场
pop ax;
pop dx;
;中断返回
iret
int10 endp
code ends
end start
实验2的源代码:
.Model small
.386
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX ; 数据段的装载
CLI ;关中断
CLD ;方向
;写中断向量
PUSH DS; 保护断点
MOV AX,SEG INT_35;段地址
MOV DS,AX;
MOV DX,OFFSET INT_35;偏移地址
MOV AX,250bh;
INT 21H; DOS 功能号25h:设置中断向量ds:dx =中断向量,al=中断类型号
POP DS;
;写屏蔽字
CLI; 关中断
IN AL,21H ;读IMR
AND AL,11110111B ;设置OCW1,开放IR3中断
OUT 21H,AL ;写中断屏蔽字OCW1
MOV BL,0 ; 初始LED0小灯泡
MOV CX,5 ;循环次数
STI ;开中断
AGAIN1:
;PC6产生上升沿
MOV DX,283H;
MOV AL,10000000B; 先初始化, PC6设为输出信号
OUT DX,AL;
MOV DX,283h;
MOV AL,00001100B; PC6输出低电平
OUT DX,AL;
NOP;
NOP;
MOV AL,00001101B; PC6输出高电平
OUT DX,AL;
NOP;
NOP;
CALL DELAY
LOOP AGAIN1 ;一直等待中断
IN AL,21H ;读IMR
OR AL,00001000B ;设置OCW1,关闭IR3中断
OUT 21H,AL ;写中断屏蔽字OCW1
MOV AX,DATA; 数据段的恢复
MOV DS,AX
MOV AH,4CH ;结束,返回DOS
INT 21H
DELAY PROC ; 双重循环的延时子程序
PUSH CX;
MOV CX,10H
AGAIN:
MOV DX,0FFFFH
DELAY1:
DEC DX
JNZ DELAY1
LOOP AGAIN
POP CX;
RET
DELAY ENDP
INT_35 PROC NEAR ;中断服务程序
PUSH DX ;保护现场
PUSH AX
PUSH CX
CLI ;关中断
MOV AX,DATA
MOV DS,AX
; 小灯泡亮
MOV DX,283H;
MOV AL,10000000B; A端口,0方式输出
OUT DX,AL;
XOR BL,11111111B;异或运算,最后一位取反
MOV AL,BL; LED0
MOV DX,280H;
OUT DX,AL; 输出到LED0
MOV AL,20H ;写OCW2,送中断结束命令EOI
OUT 20H,AL
STI ;开中断
POP CX ;恢复现场
POP AX
POP DX
IRET ;中断返回
INT_35 ENDP
CODE ENDS
END START
A/D D/A 转换实验
一、 实验目的 了解模/数转换的基本原理,掌握利用中断方法对ADC0809的编程方法。了解数/模转换器的基本原理,掌握DAC0832芯片的使用方法 二、 实验内容 实验1:使用ADC0809的通道0,接入0-5V的直流电压,用W1调整模拟电压值,A/D的转换结束信号EOC接在8259A的IRQ3上,采集100个数据并存入内存中,同时将采集的16进制数据显示在电脑屏幕上。请多次调整0-5V的电压值(旋动W1旋钮),进行A/D采集,并观测内存中的数据的变化情况 实验2:DAC0832是采用CMOS工艺制成的R-2R倒T型电阻网络8位D/A转换器,输出为差分电流信号。20脚DIP封装,内部带有两级8位锁存。要求DAC0832采用直通模式产生正弦波。 三、 实验线路连 实验1的连线图: 连线: 0809/CS 接 I/O地址译码/Y3(298H—29FH) 0809/IN0 接 电位器/0~5V 0809/EOC 接 总线/MIRQ3
实验二的连线图:
接线: 0832/CS 接 I/O地址译码/Y2(290H—298H) 0832/Ua,Ub 接 示波器 四、 实验编程提示 实验1的流程图: 实验2的流程图: 五、 实验步骤 1 正确理解实验的原理 2. 首先按照上述连线图进行线路的连接,然后分别运行两个程序 3. 观察实验结果并能分析
六、源代码附录
ADC0809
.model small
.386
DATA SEGMENT
BUF DW 100 DUP(0)
POINT DW ?
TEMP DB ?
BREAK1 DB 'BREAK1!',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
;8259写中断向量
CLI
MOV AX,250BH
MOV DX,SEG AD35
MOV DS,DX
MOV DX,OFFSET AD35
INT 21H
;恢复数据段
MOV AX,DATA;
MOV DS,AX;
; 开中断屏蔽IRQ3
IN AL,21H
AND AL,11110111B
OUT 21H,AL
; 设置采样次数和内存指针
MOV CX,100
MOV AX,OFFSET BUF;
MOV POINT,AX;
STI;开中断
;启动转换
MOV BH,0
BEGIN:
INC BH
MOV AL,0H
MOV DX,298H
OUT DX,AL;假写,CS,WR
NOP
NOP
CALL DELAY1
LOOP BEGIN; 未完成,继续启动
; 恢复数据段
MOV AX,DATA;
MOV DS,AX;
;屏蔽中断请求
IN AL, 21H
OR AL, 00001000B
OUT DX, AL
MOV TEMP,BH
CALL SHOW
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
; 返回DOS
MOV AH,4CH ;返回DOC
INT 21H
;------------------中断服务程序----------------
AD35 PROC
;寄存器入栈
PUSH AX;
PUSH BX;
PUSH DX;
PUSH DI;
CLI; 关中断
CALL DELAY1; 延时
; 读取转换结果
MOV DX,298H;
IN AL,DX;
; 存数据
MOV DI,POINT
MOV [DI],AL
INC DI
MOV POINT,DI
; 显示数据
MOV TEMP,AL;
CALL SHOW;
;清SIR,发结束命令EOI
MOV AL,20H
OUT 20H,AL
STI ;开中断
POP DI;
POP DX;
POP BX;
POP AX;
IRET ;中断返回
AD35 ENDP
;-------------------------显示16进制数-------------------
SHOW PROC
PUSH BX
PUSH CX
PUSH AX
MOV BL,TEMP;
MOV CH,2
MOV CL,4
SH:
ROL BL,CL;
MOV AL,BL;
AND AL,0FH;
ADD AL,30H; 0~9
CMP AL,3AH;
JB BA
ADD AL,07H; A~F
BA:
MOV DL,AL
MOV AH,02H;
INT 21H;
DEC CH;
JNZ SH;
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
POP AX
POP CX
POP BX
RET
SHOW ENDP
; --------------------双重循环的延时子程序-------------------
DELAY1 PROC
PUSH CX;
MOV CX,25
AGAIN1:
MOV DX,0FFFFH
DELAY:
DEC DX
JNZ DELAY
LOOP AGAIN1
POP CX;
RET
DELAY1 ENDP
CODE ENDS
END START
SIN
.model small
.386
DATA SEGMENT
SIN DB db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db 80h,66h,4eh,38h,25h,15h,09h,04h
db 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据
LEN EQU $-SIN
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
; 装载数据段
MOV AX,DATA;
MOV DS,AX;
;初始化
MOV SI, OFFSET SIN; SI指向数据表的首地址
MOV BH,LEN; 数据表中的长度送BH
; 设置直通模式
MOV DX,290H;
MOV AL,0H;
OUT DX,AL;
; 用SI间址取出正弦波数据送DAC0832
LP:
MOV AL,[SI];
OUT DX,AL;送数值到0832
MOV BL,AL;
MOV AH,0BH;
INT 21H;
CMP AL,0FFH;
JE STOP;
MOV AL,BL;
INC SI;
DEC BH;
JNZ LP;
;返回DOC
STOP:
MOV AH,4CH
INT 21H
CODE ENDS
END START
|