MOV AL,00011001B(19H);定义ICW1,片从级联,电平触发 OUT 0FCH,AL ;发ICW1命令
MOV AL,90H ;IR0的中断类型号为90H OUT 0FEH,AL ;发ICW2命令 MOV AL,00000010B(02H);定义ICW3,1#从片接主片的IR2 OUT 0FEH,AL
MOV AL,00000001B(01H);定义ICW4,完全嵌套,非缓冲 OUT 0FEH,AL ;非自动EOI结束方式 MOV AL,11101111B(0EFH);定义OCW1,允许IR4中断, OUT 0FEH,AL ;其余中断请求屏蔽
(4)2#从片8259A初始化编程:端口地址为FEECH和FEEEH MOV AL,00011001B(19H);定义ICW1,片从级联,电平触发 MOV DX,0FEECH
OUT DX,AL ;发ICW1命令
MOV AL,0A0H ;IR0的中断类型号为A0H MOV DX,0FEEEH
OUT DX,AL ;发ICW2命令 MOV AL,00000101B(05H);定义ICW3,2#从片接主片的IR5 OUT DX,AL
MOV AL,00000001B(01H);定义ICW4,完全嵌套,非缓冲 OUT DX,AL ;非自动EOI结束方式 MOV AL,11101111B(0EFH);定义OCW1,允许IR4中断, OUT DX,AL ;其余中断请求屏蔽 第八章
1. 8253芯片有哪几个计数通道?每个计数通道可工作于哪几种工作方式?这些操作方式的 主要特点是什么?
答:8253内部包含3个完全相同的计数器/定时器通道,即0~2计数通道,对3个通道的操 作完全是独立的。8253的每个通道都有6种不同的工作方式。
方式0——计数结束中断方式:当对8253的任一个通道写入控制字,并选定工作于方
式0时,该通道的输出端OUT立即变为低电平。要使8253能够进行计数,门控信号GATE 必须为高电平。经过n十1个脉冲后,计数器减为0,这时OUT引脚由低电平变成高电平。 OUT引脚上的高电平信号,一直保持到对该计数器装入新的计数值,或设置新的工作方式 为止。在计数的过程中,如果GATE变为低电平,则暂停减1计数,计数器保持GATE有 效时的值不变,OUT仍为低电平。待GATE回到高电平后,又继续往下计数。
方式1——可编程单稳态输出方式 :当CPU用控制字设定某计数器工作于方式1时, 该计数器的输出OUT立即变为高电平。GATE出现一个上升沿后,在下一个时钟脉冲的下 降沿,将n装入计数器的执行部件,同时,输出端OUT由高电平向低电平跳变。当计数器 的值减为零时,输出端OUT产生由低到高的正跳变,在OUT引脚上得到一个n个时钟宽 度的负单脉冲。在计数过程中,若GATE产生负跳变,不会影响计数过程的进行。但若在 计数器回零前,GATE又产生从低到高的正跳变,则8253又将初值n装入计数器执行部件, 重新开始计数,其结果会使输出的单脉冲宽度加宽。
方式2——比率发生器:当对某一计数通道写入控制字,选定工作方式2时,OUT端 输出高电平。如果GATE为高电平,则在写入计数值后的下一个时钟脉冲时,将计数值装 入执行部件,此后,计数器随着时钟脉冲的输入而递减计数。当计数值减为1时,OUT端
由高电乎变为低电平,待计数器的值减为0时,OUT引脚又回到高电平,即低电平的持续 时间等于一个输入时钟周期。与此同时,还将计数初值重新装入计数器,开始一个新的计数 过程,并由此循环计数。如果装入计数器的初值为n,那么在OUT引脚上,每隔n个时钟 脉冲就产生一个负脉冲,其宽度与时钟脉冲的周期相同,频率为输入时钟脉冲频率的n分之 一。在操作过程中,任何时候都可由CPU重新写入新的计数值,不影响当前计数过程的进 行。当计数值减为0时,一个计数周期结束,8253将按新写入的计数值进行计数。在计数 过程中,当GATE变为低电平时,使OUT变为高电平,禁止计数;当GATE从低电平变为 高电平,GATE端产生上升沿,则在下一个时钟脉冲时,把预置的计数初值装入计数器,从 初值开始递减计数,并循环进行。
方式3——方波发生器 :方式3和方式2的工作相类似,但从输出端得到的是对称的 方波或基本对称的矩形波。 如果写入计数器的初值为偶数,则当8253进行计数时,每输 入一个时钟脉冲,均使计数值减2。计数值减为0时,OUT输出引脚由高电平变成低电平, 同时自动重新装入计数初值,继续进行计数。当计数值减为0时,OUT引脚又回到高电平, 同时再一次将计数初值装入计数器,开始下一轮循环计数;如果写入计数器的初值为奇数, 则当输出端OUT为高电平时,第一个时钟脉冲使计数器减1,以后每来一个时钟脉冲,都 使计数器减2,当计数值减为0时,输出端OUT由高电平变为低电平,同时自动重新装入 计数初值继续进行计数。这时第一个时钟脉冲使计数器减3,以后每个时钟脉冲都使计数器 减2,计数值减为0时,OUT端又回到高电平,并重新装入计数初值后,开始下一轮循环 计数。
方式4——软件触发选通:当对8253写入控制宇,进入工作方式4后,OUT端输出变 为高电平,如果GATE为高电平,那么,写入计数初值后,在下一个时钟脉冲后沿将自动 把计数初值装入执行部件,并开始计数。当计数值成为0时,OUT端输出变低,经过一个 时钟周期后,又回到高电平,形成一个负脉冲。若在计数过程中写入一个新的计数值,则在 现行计数周期内不受影响,但当计数值回0后,将按新的计数初值进行计数,同样也只计一 次。 如果在计数的过程中GATE变为低电平,则停止计数,当GATE变为高电平后, 又重新将初值装入计数器,从初值开始计数,直至计数器的值减为0时,从OUT端输出一 个负脉冲。
方式5——硬件触发选通:编程进入工作方式5后,OUT端输出高电平。当装入计数
值n后,GATE引脚上输入一个从低到高的正跳变信号时,才能在下一个时钟脉冲后沿把计 数初值装入执行部件,并开始减1计数。当计数器的值减为0时,输出端OUT产生一个宽 度为一个时钟周期的负脉冲,然后OUT又回到高电平。计数器回0后,8253又自动将计数 值n装入执行部件,但并不开始计数,要等到GATE端输入正跳变后,才又开始减1计数。 计数器在计数过程中,不受门控信号GATE电平的影响,但只要计数器未回0,GATE的上 升沿却能多次触发计数器,使它重新从计数初值n开始计数,直到计数值减为0时,才输出 一个负脉冲。如果在计数过程中写入新的计数值,但没有触发脉冲,则计数过程不受影响。 当计数器的值减为0后,GATE端又输入正跳变触发脉冲时,将按新写入的初值进行计数。 2. 8253的最高工作频率是多少?8254与8253的主要区别是什么? 答:8253的最高计数频率能达到2MHz。
Intel 8254是8253的增强型产品,它与8253的引脚兼容,功能几乎完全相同,不同之 处在于以下两点:
(1)8253的最大输入时钟频率为2MHz,而8254的最大输入时钟频率可高达5MHz。 (2)8254有读回(Read-back)功能,可以同时锁存1~3个计数器的计数值及状态值, 供CPU读取,而8253每次只能锁存和读取一个通道的计数器,且不能读取状态值。 3. 对8253进行初始化编程分哪几步进行?
答:(1)写入控制字
用输出指令向控制字寄存器写入一个控制字,以选定计数器通道,规定该计数器的工
作方式和计数格式。写入控制字还起到复位作用,使输出端OUT变为规定的初始状态,并 使计数器清0.
(2)写入计数初值
用输出指令向选中的计数器端口地址中写入一个计数初值,初值设置时要符合控制字中 有关格式规定。
4. 设8253的通道0~2和控制端口地址分别为300H,302H,304H和306H,定义通道0工 作在方式3,CLK0=2MHz。试编写初始化程序,并画出硬件连接图。要求通道0输出1.5KHz 的方波,通道1用通道0的输出作计数脉冲,输出频率为300Hz的序列负脉冲,通道2每 秒钟向CPU发50次中断请求。
答:通道0工作在方式3,n0=2MHz/1.5KHz=1334 通道1工作在方式2,n1=1.5KHz/300Hz=5
通道2工作在方式0,当CLK2=2MHz时, n2=2MHz/50Hz-1=39999; 当CLK2=OUT0=1.5KHz时, n2=1.5KHz/50Hz-1=29 ; 当CLK2=OUT1=300Hz时, n2=300Hz/50Hz-1=5
初始化程序如下: 通道0初始化: MOV DX, 306H
MOV AL, 00110111B(37H) ;方式3,先读/写低8位, ;后读/写低8位, BCD计数 OUT DX, AL MOV DX, 300H
MOV AL, 34H ;初值低8位 OUT DX, AL
MOV AL, 13H ;初值高8位 OUT DX, AL 通道1初始化: MOV DX, 306H
MOV AL, 01010101B(55H) ;方式2,只读/写低8位, BCD计数 OUT DX, AL MOV DX, 302H
MOV AL, 05H ;初值 OUT DX, AL 通道2初始化: MOV DX, 306H
MOV AL, 10010001B(91H) ;方式0,只读/写低8位,BCD计数 OUT DX, AL MOV DX, 304H
MOV AL, 29H(或05H) ;初值 OUT DX, AL
5. 某微机系统中,8253的端口地址为40H~43H。要求通道0输出方波,使计算机每秒钟 产生18.2次中断;通道1每隔15μs向8237A提出一次DMA请求;通道2输出频率为2000Hz 的方波。试编写8253的初始化程序,并画出有关的硬件连接图。
答:此微机系统为IBM PC/XT系统,通道0作实时时钟,每秒钟产生18.2次中断。 通道0工作于方式3,n0=1.19318MHz/18.2=65536 即 0 初始化编程:
MOV AL, 00110110B ;通道0,先写低字节,后写高字节,方式3,2进制计数 OUT 43H, AL ;写入控制字
MOV AX, 0000H ;预置计数值n=65536 OUT 40H,AL ;先写低字节 MOV AL,AH
OUT 40H,AL ;后写高字节
通道1工作于方式2,周期为15μs,频率为66.2878KHz, 初值n1=1.19318MHz/66.2878KHz=18 初始化编程:
MOV AL,01010101B ;控制字,计数1,只写低字节,方式2,BCD计数 OUT 43H,AL ;写入控制字
MOV AL,18H ;计数初值BCD数18H OUT 41H,AL ;送初值
通道2用于扬声器音调控制,要求输出频率2000Hz的方波,故工作于方式3, n2=1.19318MHz/2000Hz=596 初始化编程:
MOV AL,10110111B ;控制字,计数器2,先写低字节,后写高字节,方式3, BCD计数 OUT 43H,AL
MOV AX,596H ;预置初值 OUT 42H,AL ;先送低字节 MOV AL,AH
OUT 42H,AL ;后送高字节
6. 设某系统中8254芯片的基地址为F0H,在对3个计数通道进行初始化编程时,都设为先 读写低8位,后读写高8位,试编程完成下列工作: (1)对通道0~2的计数值进行锁存并读出来。 (2)对通道2的状态值进行锁存并读出来。 答:(1)利用8254的读回功能锁存计数值
MOV AL,11011110B ;锁存3个计数通道计数值 OUT 0F3H,AL
IN AL,0F0H ;读通道0低8位 MOV AH,AL
IN AL,0F0H ;读通道0高8位 XCHG AH,AL ;将计数值置入AX PUSH AX ;入栈保存
IN AL,0F1H ;读通道1低8位 MOV AH,AL
IN AL,0F1H ;读通道1高8位 XCHG AH,AL PUSH AX ;入栈
IN AL,0F2H ;读通道2低8位 MOV AH,AL
IN AL,0F2H ;读通道2高8位 XCHG AH,AL PUSH AX
(2) 利用8254的读回功能锁存状态 MOV AL,11101000B ;锁存通道2状态 OUT 0F3H,AL
IN AL,0F2H ;读通道2状态 第九章