用定时器/计数器8253对一个输入脉冲进行2M?(106?)次分频,能否采用一个计数器完成?为什么?可以采用什么方法实现要求的分频?

作者:cambrain     发布时间:2025-01-22     点击数:0    

以下是对该问题的详细分析:

问题分析

8253定时器/计数器的基本信息:8253是一种可编程的定时器/计数器芯片,它包含三个独立的16位计数器,每个计数器可以在不同的工作模式下工作,其计数范围为0 - 65535(因为是16位)。

能否用一个计数器完成2M次分频

由于 8253 的一个计数器最大计数值为 65535,而要求的分频次数为 $2\times10^{6}$ 次,远超过一个计数器的最大计数值,所以不能用一个计数器直接完成。

实现方法

级联计数器:可以将8253的两个计数器级联来实现所需的分频。以下是实现的步骤:

1.第一个计数器

:将第一个计数器(假设是计数器0)设置为工作在模式2(比率发生器模式),其最大计数值为 65536。将其初始计数值设置为 65536,这样当输入 $N_{1}$ 个脉冲时,该计数器会产生一个输出脉冲,输出脉冲的频率为输入频率除以 65536。

2.第二个计数器

:将第二个计数器(假设是计数器1)也设置为模式2,将其初始计数值设置为 $N_{2}$,其中 $N_{2}=\frac{2\times10^{6}}{65536}$ (向上取整)。将计数器0的输出作为计数器1的输入。

3.计算最终分频比

:通过这样的级联方式,最终的输出频率将是输入频率除以 $65536\times N_{2}$,从而实现对输入脉冲的 $2\times10^{6}$ 次分频。

代码示例(伪代码)

以下是8253初始化和设置的伪代码示例,假设使用汇编语言对8253进行编程: ```assembly ; 初始化计数器0 MOV AL, 00110100B  ; 计数器0,先低字节后高字节,模式2 OUT 43H, AL     ; 控制字寄存器地址为43H MOV AX, 65536    ; 最大计数值 OUT 40H, AL     ; 先写低字节到计数器0(端口地址40H) MOV AL, AH OUT 40H, AL     ; 再写高字节到计数器0 ; 初始化计数器1 MOV AL, 01110100B  ; 计数器1,先低字节后高字节,模式2 OUT 43H, AL     ; 控制字寄存器地址为43H MOV AX,