8254计数器应用实验
一、实验目的
1.掌握8254的工作方式及应用编程;
2.掌握8254的典型应用电路的连接。
二、实验内容
将 8254 的计数器 0 设置为方式 0,计数值为十进制数 4,用单次脉冲 KK1+作为 CLK0 时钟,OUT0 连接 MIR7,每当 KK1+按动 5 次后产生中断请求,在屏幕上显示字符(自己参考ASCII码定义)。
三、实验原理以及电路连接
8254 是 Inte1 公司生产的可编程间隔定时器。是 8253 的改进型,比 8253 具有更优良的性能。8254 具有以下基本功能:
(1)有3个独立的 16 位计数器。
(2)每个计数器可按二进制或十进制(BCD)计数。
(3)每个计数器可编程工作于6种不同工作方式。
(4)8254 每个计数器允许的最高计数频率为 10MHz(8253 为 2MHz)。
(5)8254 有读回命令(8253 没有),除了可以读出当前计数单元的内容外,还可以读
出状态寄存器的内容。
(6)计数脉冲可以是有规律的时钟信号,也可以是随机信号。
8254的工作方式如下述:
- 方式0:计数到0结束输出正跃变信号方式。
- 方式1:硬件可重触发单稳方式。
- 方式2:频率发生器方式。
- 方式3:方波发生器。
- 方式4:软件触发选通方式。
- 方式5:硬件触发选通方式。
图3.1 8254的内部接口和引脚
8254 的控制字有两个:一个用来设置计数器的工作方式,称为方式控制字;另一个用来设置读回命令,称为读回控制字。这两个控制字共用一个地址,由标识位来区分。
图3.2 8254实验电路原理图
图3.3 8254计数应用实验
图3.4 实验箱连接图
四、程序流程以及代码
实验步骤:
(1)实验接线如图 3.3所示(由于8254单元中 GATE0 信号已经上拉+5V,所以 GATEO不用接线)。
(2)编写实验程序,经编译、链接无误后装入系统。
(3)单击Run按钮,运行实验程序,每连续按动 5 次 KK1+,在界面的输出区会显示字符,观察实验现象。
(4)改变计数值,验证 8254 的计数功能。
图4.1 实验运行结果
IOY0 EQU 0600H ;IOY0起始地址
A8254 EQU IOY0+00H*2
B8254 EQU IOY0+01H*2
C8254 EQU IOY0+02H*2
CON8254 EQU IOY0+03H*2SSTACK SEGMENT STACKDW 32 DUP(?)
SSTACK ENDSCODE SEGMENTASSUME CS:CODE, SS:SSTACK
START: PUSH DSMOV AX, 0000HMOV DS, AXMOV AX, OFFSET IRQ7 ;取中断入口地址MOV SI, 003CH ;中断矢量地址MOV [SI], AX ;填IRQ7的偏移矢量MOV AX, CS ;段地址MOV SI, 003EHMOV [SI], AX ;填IRQ7的段地址矢量CLIPOP DS;初始化主片8259MOV AL, 11HOUT 20H, AL ;ICW1MOV AL, 08HOUT 21H, AL ;ICW2MOV AL, 04HOUT 21H, AL ;ICW3MOV AL, 01HOUT 21H, AL ;ICW4MOV AL, 6FH ;OCW1OUT 21H, AL;8254MOV DX, CON8254MOV AL, 10H ;计数器0,方式0OUT DX, ALMOV DX, A8254MOV AL, 04HOUT DX, ALSTI
AA1: JMP AA1
IRQ7: MOV DX, A8254MOV AL, 04HOUT DX, ALMOV AX, 0141HINT 10H ;显示字符(可以改成自己想显示的字符)MOV AX, 0120HINT 10H MOV AL, 20HOUT 20H, AL ;中断结束命令IRET
CODE ENDSEND START对应实验要求输出字符的代码:
IOY0 EQU 0600H ; IOY0起始地址
A8254 EQU IOY0+00H*2
B8254 EQU IOY0+01H*2
C8254 EQU IOY0+02H*2
CON8254 EQU IOY0+03H*2SSTACK SEGMENT STACKDW 32 DUP(?)
SSTACK ENDSCODE SEGMENTASSUME CS:CODE, SS:SSTACK
START: PUSH DSMOV AX, 0000HMOV DS, AXMOV AX, OFFSET IRQ7 ;取中断入口地址MOV SI, 003CH ;中断矢量地址MOV [SI], AX ;填IRQ7的偏移矢量MOV AX, CS ;段地址MOV SI, 003EHMOV [SI], AX ;填IRQ7的段地址矢量CLIPOP DS;初始化主片8259MOV AL, 11HOUT 20H, AL ;ICW1MOV AL, 08HOUT 21H, AL ;ICW2MOV AL, 04HOUT 21H, AL ;ICW3MOV AL, 01HOUT 21H, AL ;ICW4MOV AL, 6FH ;OCW1OUT 21H, AL;8254MOV DX, CON8254MOV AL, 10H ;计数器0,方式0OUT DX, ALMOV DX, A8254MOV AL, 04HOUT DX, ALSTI
AA1: JMP AA1
IRQ7: MOV DX, A8254MOV AL, 04HOUT DX, ALMOV AH, 0EH ;设置显示字符的中断号MOV AL, [currentChar] ;从currentChar取当前要显示的字符INT 10H ;显示字符INC WORD PTR [currentChar] ;移动->下一个字符CMP WORD PTR [currentChar], OFFSET count0EndJNE endIRQMOV WORD PTR [currentChar], OFFSET countMsg ;重置为第一个字符
endIRQ:MOV AL, 20HOUT 20H, AL ;中断结束命令IRET
CODE ENDSEND STARTcountMsg db 'count4', 0Dh, 0Ahdb 'count3', 0Dh, 0Ahdb 'count2', 0Dh, 0Ahdb 'count1', 0Dh, 0Ahdb 'count0', 0Dh, 0Ah
count0End db '$' ; 字符串结束标志
currentChar DW OFFSET countMsg ; 当前要显示的字符的地址
如果对你有帮助的话,请给我点个赞吧❤