微机原理与接口技术问题

以8086为CPU的某微机系统中使用了一块8253芯片,其通道端口地址为408H,40AH,40CH,控制口地址为40EH,3个通道使用同一输入时钟,频率为2MHz,要求完成如下功能:
1.利用计数器0输出频率为4kHz的对称方波;
2.利用计数器1采用硬件触发,输出宽度等于时钟周期的单脉冲,定时常数为72H;
3.利用计数器2产生宽度为0.2ms的单脉冲,试设计该定时系统硬件电路和初始化程序。
求一个详细的过程这块学的不太好。

朋友你好,以下是我把你的问题和相关观点都看了一遍分析出来的,望采纳谢谢啦
这题不难,我们需要设置的是8253芯片的工作模式以及通道的计数方式。对于计数器0,要输出4kHz的方波,因此需要将通道0配置为工作在“模式三”下(即方波发生器模式),同时选择二进制计数,并将计数初值设置为0,计数终值设置为499(因为2MHz的输入时钟频率下,每500个时钟周期会产生一个4kHz的方波)。初始化程序如下:



MOV AL, 00110110B ; 将控制字寄存器设为110
OUT 40H, AL ; 写入控制字
MOV AL, 00000000B ; 计数器0计数初值低8位为0
OUT 40H, AL ; 写入初值低8位
MOV AL, 00000101B ; 计数器0计数初值高8位为5
OUT 40H, AL ; 写入初值高8位
MOV AL, 00000001B ; 计数器0计数终值低8位为1
OUT 40H, AL ; 写入终值低8位
MOV AL, 11110110B ; 计数器0计数终值高8位为F5
OUT 40H, AL ; 写入终值高8位
对于计数器1,要输出一个宽度等于时钟周期的单脉冲,并且需要使用硬件触发方式。因此,我们需要将通道1配置为工作在“模式二”下(即单脉冲发生器模式),同时选择二进制计数,启用硬件触发,并将计数初值设置为0,计数终值设置为72H(因为每个时钟周期为500ns,所以72个时钟周期为36us)。初始化程序如下:

MOV AL, 01000010B ; 将控制字寄存器设为10010
OUT 40H, AL ; 写入控制字
MOV AL, 00000000B ; 计数器1计数初值低8位为0
OUT 41H, AL ; 写入初值低8位
MOV AL, 00000000B ; 计数器1计数初值高8位为0
OUT 41H, AL ; 写入初值高8位
MOV AL, 01110010B ; 计数器1计数终值低8位为72
OUT 41H, AL ; 写入终值低8位
MOV AL, 00000000B ; 计数器1计数终值高8位为0
OUT 41H, AL ; 写入终值高8位
对于计数器2,要输出一个宽度为0.2ms的单脉冲。由于时钟周期为500ns,因此需要让计数器2计数625个时钟周期才能产生一个0.2ms的脉冲。同样地,我们需要将通道2配置为工作在“模式二”下,选择二进制计数,启用软件触发,并将计数初值和计数终值都设置为0。初始化程序如下:

MOV AL, 01000010B ; 将控制字寄存器设为10010
OUT 40H, AL ; 写入控制字
MOV AL, 00000000B ; 计数器2计数初值低8位为0
OUT 42H, AL ; 写入初值低8位
MOV AL, 00000000B ; 计数器2计数初值高8位为0
OUT 42H, AL ; 写入初值高8位
MOV AL, 11111000B ; 计数器2计数终值低8位为F8
OUT 42H, AL ; 写入终值低8位
MOV AL, 00000010B ; 计数器2计数终值高8位为2
OUT 42H, AL ; 写入终值高8位

完成8253芯片的初始化后,我们需要编写一个循环程序来保持计数器工作,并通过通道端口地址进行读取和输出。具体的控制流程如下:

等待计数器0产生完整个方波周期;
读取计数器1的状态寄存器,判断是否产生了单脉冲;
如果产生了单脉冲,则将计数器1的计数器清零,等待下一次触发;
读取计数器2的状态寄存器,判断是否产生了单脉冲;
如果产生了单脉冲,则将计数器2的计数器清零,等待下一次触发;
跳回步骤1,重复执行以上步骤。
初始化完毕后,可以编写类似下面的循环程序来实现这样的控制流程:

WHILE TRUE DO
    ; Step 1: wait for a complete period of the square wave from counter 0
    READ_COUNTER_0_STATUS
    WAIT_FOR_COUNTER_0_TO_FINISH

    ; Step 2: check if counter 1 has generated a pulse
    READ_COUNTER_1_STATUS
    IF COUNTER_1_GENERATED_PULSE THEN
        ; Step 3: reset counter 1 and wait for next trigger
        RESET_COUNTER_1
        WAIT_FOR_TRIGGER

    ; Step 4: check if counter 2 has generated a pulse
    READ_COUNTER_2_STATUS
    IF COUNTER_2_GENERATED_PULSE THEN
        ; Step 5: reset counter 2 and wait for next trigger
        RESET_COUNTER_2
        WAIT_FOR_TRIGGER
    ENDIF
ENDWHILE
在以上代码中,"READ_COUNTER_X_STATUS"表示需要从通道X的状态寄存器中读取计数器状态,并判断是否产生了单脉冲。对于计数器0,我们只需要等待其完成一个完整的方波周期即可;而对于计数器1和计数器2,需要先通过"RESET_COUNTER_X"来清零计数器,然后等待下一次硬件或软件触发的信号。

最后,为了实现输出功能,我们需要将8253芯片的通道端口地址与CPU进行连接,并实现相应的IO操作程序来读取和写入寄存器。具体的硬件电路设计和程序编写可能略微复杂,需要根据不同的具体情况进行定制。





引用chatGPT作答,该微机系统中使用的8253芯片为可编程定时器/计数器芯片,它可以根据程序需要进行定时或计数操作,共有三个计数通道。通道0和通道1为单计数器/定时器,通道2为单计数器。每个通道都有一个16位计数器,可以分别工作在计数或定时模式下。

下面分别对三个功能进行设计:

1.利用计数器0输出频率为4kHz的对称方波
对称方波的周期为T=1/f,所以4kHz对称方波的周期T=1/4kHz=0.25ms。

由于8253芯片的计数器0为16位计数器,最大计数值为65535,因此需要通过分频器来将2MHz的时钟分频得到4kHz的输出。

计数器0的控制字为36H,其中低8位表示计数器0的初始计数值,高8位表示计数器的工作方式和计数器控制字寄存器的选择。计数器0的计数方式为16位二进制自动重载计数,即当计数器计满65535时,自动将计数器清零并重新开始计数。

为了得到4kHz的输出频率,需要将时钟频率分频,计算可得分频系数为500(2MHz/500=4kHz)。由于8253芯片的计数器0为16位计数器,因此初始计数值为FFFF-500+1=FB1C。因此,计数器0的控制字为36H,初始计数值为FB1C。

初始化程序如下:

MOV AL, 36H ; 选择计数器0,16位自动重载计数模式
OUT 40CH, AL ; 将控制字送入计数器0的控制字寄存器中
MOV AX, FB1CH ; 设置计数器0的初始计数值
OUT 408H, AL ; 将低8位送入计数器0的计数器端口
MOV AL, AH
OUT 408H, AL ; 将高8位送入计数器0的计数器端口

2.利用计数器1采用硬件触发,输出宽度等于时钟周期的单脉冲,定时常数为72H
计数器1的控制字为B4H,其中低8位表示计数器1的初始计数值,高8位表示计数器的工作方式和计数器控制字寄存器的选择。计数器1的计数方式为16位二进制程序触发计数,即当计数器接收到外部触发信号时开始计数。

为了输出宽度等于时钟周期的单脉冲,需要计算出时钟周期的计数值。由于时钟频率为2MHz,因此时钟周期为1/2MHz=0.5us。因此,定时常数为72H代表的计数值为0.5us*72H=36ms。

计数器1的工作方式为单脉冲输出模式,即当计数器计满后,输出一个单脉冲。计数器1的输出单脉冲的宽度等于时钟周期的宽度,因此输出单脉冲的宽度为0.5us。

计数器1需要接收一个外部触发信号才能开始计数,触发信号可以从8253芯片的控制口地址40EH的输出端口输出。为了保证计数器1在每次触发后都能正确计数,需要在初始化程序中将控制口地址40EH的输出端口设置为高电平,表示禁止8253芯片对外部触发信号的响应。当计数器1的计数值被重新加载时,控制口地址40EH的输出端口将会被清零,表示允许8253芯片对外部触发信号进行响应。

初始化程序如下:

MOV AL, B4H ; 选择计数器1,16位程序触发计数模式
OUT 40AH, AL ; 将控制字送入计数器1的控制字寄存器中
MOV AX, 36H ; 设置计数器1的初始计数值为36H
OUT 40BH, AL ; 将低8位送入计数器1的计数器端口
MOV AL, AH
OUT 40BH, AL ; 将高8位送入计数器1的计数器端口
IN AL, 40EH ; 读取控制口地址40EH的输入端口,清除计数器1的输出单脉冲标志
OR AL, 01H ; 将输出端口的最低位设置为1,禁止8253芯片响应外部触发信号
OUT 40EH, AL ; 将输出端口的值送入控制口地址40EH的输出端口

3.利用计数器2产生宽度为0.2ms的单脉冲
计数器2的控制字为74H,其中低8位表示计数器2的初始计数值,高8位表示计数器的工作方式和计数器控制字寄存器的选择。计数器2的计数方式为单脉冲输出模式,即当计数器计满后,输出一个单脉冲。计数器2的输出单脉冲的宽度可以通过计数器2的初始计数值和时钟频率来计算得到。
宽度为0.2ms的单脉冲的计数值为0.2ms/0.5us=400H。因此,计数器2的初始计数值为FFFF-400H+1=FC01。初始化程序如下:

MOV AL, 74H ; 选择计数器2,单脉冲输出模式
OUT 408H, AL ; 将控制字送入计数器2的控制字寄存器中
MOV AX, FC01H ; 设置计数器2的初始计数值为FC01H
OUT 40CH, AL ; 将低8位送入计数器2的计数器端口
MOV AL, AH
OUT 40CH, AL ; 将高8位送入计数器2的计数器端口

当计数器2计数满后,将会输出一个单脉冲。该单脉冲的宽度为计数器2的初始计数值乘以时钟周期的宽度,即0.5us*FC01H=327.69us,与目标宽度0.2ms略有误差。如果需要更精确地生成宽度为0.2ms的单脉冲,可以通过调整计数器2的初始计数值来进行微调。

注意,在上述程序中,我们使用了控制口地址40EH的输入端口来读取8253芯片的输出端口的值,并将最低位设置为1,以禁止8253芯片响应外部触发信号。这是因为8253芯片在初始化后会自动响应外部触发信号,并开始计数,如果没有禁止8253芯片的外部触发响应,计数器1和计数器2可能会在初始化后立即开始计数,从而导致计数器的计数值不准确。

另外,需要注意的是,8253芯片的各个通道之间是相互独立的,因此在程序中需要分别对计数器0、计数器1和计数器2进行初始化,并设置它们各自的控制字和计数器初始值。

以下内容引用CHATGPT:

首先,针对第一个功能,要输出频率为4kHz的对称方波,需要将8253的计数器0配置为方式3(square wave generator),再将计数器0的初值设置为5000(2MHz时钟频率下,计数器0需要计数5000个时钟周期才能输出一次4kHz的方波),控制口地址为40EH的位0需设为1,表示允许计数器0输出方波。初始化程序中需要对8253进行相应的初始化配置。

下面是示例代码:

; 初始化8253
MOV AL, 00110110B ; 配置计数器0为方式3,计数器1和2为方式0
OUT 40H, AL ; 将配置字节写入8253的控制寄存器
MOV AL, 50H ; 计数器0初始值为5000
OUT 40H, AL ; 将计数器0初值的低8位写入通道0的数据寄存器
MOV AL, 19H ; 计数器0初值的高8位为19H
OUT 40H, AL ; 将计数器0初值的高8位写入通道0的数据寄存器
MOV AL, 00000001B ; 允许计数器0输出方波
OUT 40H, AL ; 将配置字节写入8253的控制寄存器

针对第二个功能,需要使用计数器1采用硬件触发输出宽度等于时钟周期的单脉冲,定时常数为72H。具体实现方法是将计数器1的工作模式设置为方式1(hardware retriggerable one-shot),将计数器1的初值设置为72H,控制寄存器中的位4设置为1,表示使用硬件触发模式,位3设置为1,表示允许计数器1输出单脉冲。在初始化程序中,需要对8253进行相应的初始化配置。

下面是示例代码:

; 初始化8253
MOV AL, 00110110B ; 配置计数器0为方式3,计数器1和2为方式0
OUT 40H, AL ; 将配置字节写入8253的控制寄存器
MOV AL, 72H ; 计数器1初始值为72H
OUT 41H, AL ; 将计数器1初值的低8位写入通道1的数据寄存器
MOV AL, 0H ; 计数器1初值的高8位为0
OUT 41H, AL ; 将计数器1初值的高8位写入通道1的数据寄存器
MOV AL, 00011010B ; 配置计数器1为方式1,使用硬件触发模式
OUT 43H, AL ; 将配置字节写入8253的控制寄存器

针对第三个功能,需要使用计数器2产生宽度为0.2ms的单脉冲。计数器2的工作模式需设置为方式2(rate generator),初值需要根据时钟频率和所需的脉冲宽度计算得出,具体计算方法为:初值 = (时钟频率 ÷ 输出频率) × 脉冲宽度。以本题为例,时钟频率为2MHz,输出宽度为0.2ms,因此计数器2的初值应为800H。控制寄存器中的位3需设置为1,表示允许计数器2输出单脉冲。在初始化程序中,需要对8253进行相应的初始化配置。

下面是示例代码:

; 初始化8253
MOV AL, 00110110B ; 配置计数器0为方式3,计数器1和2为方式0
OUT 40H, AL ; 将配置字节写入8253的控制寄存器
MOV AL, 00H ; 计数器2初始值的低8位为0
OUT 42H, AL ; 将计数器2初值的低8位写入通道2的数据寄存器
MOV AL, 08H ; 计数器2初值的高8位为8H
OUT 42H, AL ; 将计数器2初值的高8位写入通道2的数据寄存器
MOV AL, 00001110B ; 配置计数器2为方式2
OUT 43H, AL ; 将配置字节写入8253的控制寄存器

基于最新版ChatGPT4与博主叶秋学长的回答,望采纳!!!有其他问题也可以询问我哦💕(最新版更智能,功能更加强大):
我来为您详细讲解一下如何实现这个定时系统。

首先,需要了解一下8253芯片的基本工作原理和寄存器结构。

8253芯片是一个具有3个计数通道的可编程定时器/计数器。每个通道都有一个16位的计数器和相关的控制寄存器。在本题中,需要使用8253芯片的三个通道来实现定时功能,其中计数器0和计数器1用于输出方波和单脉冲,计数器2用于产生定时延迟。

8253芯片的端口地址如下:

通道0端口地址为408H
通道1端口地址为40AH
通道2端口地址为40CH
控制口地址为40EH
接下来,我们按照题目要求,分步骤来实现这个定时系统。

利用计数器0输出频率为4kHz的对称方波
首先需要确定计数器0的工作模式,使其能够输出频率为4kHz的对称方波。8253芯片支持的计数模式包括:

方波模式:计数器计数到计数值后自动复位并输出一个周期的方波。
脉冲模式:计数器计数到计数值后自动复位并输出一个单脉冲。
在本题中,需要使用方波模式来实现对称方波的输出。计数器0的控制字寄存器的格式如下:

diff
Copy code
+--------+--------+--------+--------+
| 位 15 | 位 14 | 位 13 | 位 12 |
+--------+--------+--------+--------+
| 0 | 0 | 1 | 1 | (工作模式选择)
+--------+--------+--------+--------+
| 1 | 1 | 0 | 0 | (计数器0选择)
+--------+--------+--------+--------+

+--------+--------+--------+--------+
| 位 11 | 位 10 | 位 9 | 位 8 |
+--------+--------+--------+--------+
| 0 | 0 | 0 | 0 | (计数器0方式选择,0:方波模式,1:脉冲模式)
+--------+--------+--------+--------+
| 1 | 1 | 0 | 0 | (计数器0选择)
+--------+--------+--------+--------+

+--------+--------+--------+--------+
| 位 7 | 位 6 | 位 5 | 位 4 |
+--------+--------+--------+--------+
| 计数值 (低8位) |
+--------+--------+--------+--------+

+--------+--------+--------+--------+
| 位 3 |

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这道题主要考察对8253芯片的掌握能力及计数器的使用。

首先,需要说明的是8253芯片有三个计数通道,每个通道都有其独特的通道号和地址。

根据题目要求,需要实现以下功能:

  1. 利用计数器0输出频率为4kHz的对称方波,通道0的控制字为36H(十进制为54),向408H端口写入36H即可。
  2. 利用计数器1进行硬件触发,输出宽度等于时钟周期的单脉冲,通道1的控制字为48H(十进制为72),向40AH端口写入48H即可。定时常数为72H,需要向40BH端口写入72H。
  3. 利用计数器2产生宽度为0.2ms的单脉冲,通道2的控制字为B4H(十进制为180),由于需要输出单脉冲,需要采用单稳态触发器,将所得到的方波进行单谐振转换,得到一个单脉冲。通道2的控制字为B4H(即10110100),向40CH端口写入B4H,并将端口值存入AL寄存器,此时AL=10110100B,需要根据脉冲宽度的要求来设置定时器的计数初值,因为时钟频率为2MHz,所以0.2ms对应的计数初值为400H,用计数初值寄存器(40CH,40DH)来存储400H的低8位和高8位,需使用LATCH命令进行写操作。

以下是具体的代码实现:

; 初始化8253芯片,设置各计数器工作方式和计数初值
INIT8253 PROC
    MOV AL, 36H     ; 控制字,输出对称方波,计数器0
    OUT 408H, AL
    MOV AL, 48H     ; 控制字,硬件触发单脉冲,计数器1
    OUT 40AH, AL
    MOV AL, 72H     ; 定时常数,计数器1
    OUT 40BH, AL
    MOV AL, B4H     ; 控制字,单脉冲模式,计数器2
    OUT 40CH, AL
    MOV AL, 10000000B ; 脉冲宽度为0.2ms,将计数初值存入40CH、40DH中
    OUT 40DH, AL
    MOV AL, 4H      ; 计数初值低八位
    OUT 40CH, AL
    MOV AL, 0H      ; 计数初值高八位
    OUT 40CH, AL
    RET
INIT8253 ENDP

以上即为一种可行的实现方式,具体实现还需根据硬件电路设计和操作系统的要求进行一些改进。
如果我的回答解决了您的问题,请采纳!

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
这是一道关于微机原理与接口技术的问题,需要对8253芯片的基本原理和操作进行了解和掌握。下面是实现这个功能的详细过程:

1、 利用计数器0输出频率为4kHz的对称方波

计数器0控制的是8253芯片的通道0,要输出频率为4kHz的对称方波,需要计算计数器0的计数器初值。由于时钟频率为2MHz,所以计数器0的计数器初值为500。具体操作如下:

  • 将0x40送入8253芯片的控制端口40H,表示选择计数器0。
  • 将0x34送入8253芯片的计数器0端口408H,表示将计数器0设置为工作方式2,即比率发生器,同时设置计数器初值的低8位。
  • 将0x01送入8253芯片的计数器0端口408H,表示设置计数器初值的高8位。
  • 计数器0开始工作,每个计数周期输出一次对称方波。

2、 利用计数器1采用硬件触发,输出宽度等于时钟周期的单脉冲,定时常数为72H

计数器1控制的是8253芯片的通道1,要输出宽度等于时钟周期的单脉冲,需要计算计数器1的计数器初值,并且采用硬件触发方式。由于时钟频率为2MHz,所以计数器1的计数器初值为72。具体操作如下:

  • 将0x41送入8253芯片的控制端口40H,表示选择计数器1。
  • 将0x04送入8253芯片的计数器1端口40AH,表示将计数器1设置为工作方式4,即软件触发,同时设置计数器初值的低8位。
  • 将0x00送入8253芯片的计数器1端口40AH,表示设置计数器初值的高8位。
  • 将0x60送入8253芯片的计数器1端口40AH,表示采用硬件触发方式。
  • 计数器1开始工作,当计数器1的计数值为72时,输出宽度等于时钟周期的单脉冲。

3、 利用计数器2产生宽度为0.2ms的单脉冲

计数器2控制的是8253芯片的通道2,要输出宽度为0.2ms的单脉冲,需要计算计数器2的计数器初值。由于时钟频率为2MHz,所以计数器2的计数器初值为400。具体操作如下:

  • 将0x42送入8253芯片的控制端口40H,表示选择计数器2。
  • 将0x34送入8253芯片的计数器2端口40CH,表示将计数器2设置为工作方式2,即比率发生器,同时设置计数器初值的低8位。
  • 将0x01送入8253芯片的计数器2端口40CH,表示设置计数器初值的高8位。
  • 计数器2开始工作,当计数器2的计数值为400时,输出宽度为0.2ms的单脉冲。

以上操作完成后,还需要通过初始化程序来实现8253芯片的初始化和计数器的启动。初始化程序的具体操作如下:

  • 将0x36送入8253芯片的控制端口40H,表示初始化8253芯片的工作方式。
  • 将0x00送入8253芯片的计数器0端口408H,表示设置计数器0的计数器初值。
  • 将0x00送入8253芯片的计数器0端口408H,表示设置计数器0的计数器初值。
  • 将0x00送入8253芯片的计数器0端口408H,表示设置计数器0的计数器初值。
  • 计数器0、计数器1、计数器2开始工作,完成对应的定时功能。

综上所述,实现这个功能的硬件电路和初始化程序的详细过程如上所述。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢