第八章:8253

前言

《微机原理与接口技术复习笔记》系列文章主要用于微机这门课的期末复习,适用于计算机相关专业的同学。本系列文章会总结相关知识点并给出例题。

注意⚠️:本文不适用于电子信息相关专业的同学,原因是计科专业对这门课要求比较低,而电子信息专业这门课的要求会比较高,会涉及更多内容。

定时和计数的方式

  1. 软件法:比较浪费CPU时间。
  2. 硬件法:不占用CPU;不可程控调节,精度低。
  3. 软硬结合:8253等可编程定时/计数器。定时期间不占用CPU,程序控制调节定时时间,精度高。

8253的结构和引脚

image-vbb0.png

整体结构

  • 通道0部件、通道1部件、通道2部件
  • 控制字寄存器部件
  • DB缓冲期:提供D7-D0的数据线,与8086/8088相连接。
  • 读写控制部件
    • 地址线A1和A0:用来选择通道0、通道1、通道2和控制寄存器。与CPU的地址线连接。
    • CS片选、RD读控制线、WR写控制线

通道

  • 8253内置3个独立的通道。
  • 每个通道有1个16位的减法计数器,每个通道可以设置6种工作方式

工作过程

  • 输入1-CLK:计数脉冲,每个脉冲到来后通道内部的计数器会减1,减到0会在OUT输出信号。
    • 频率:<=2MHz
  • 输入2-GATE:门控信号。
    • 1:允许计数
    • 上升沿:开始计数
    • 0或者下降沿:禁止计数
  • 输出

8253的控制字

8253只有1个控制字。

控制字决定8253的下面功能:

  • where:工作通道
  • how:
    • 工作方式——脉冲格式。
    • 计数方式——二进制or十进制。
    • 读数方式——读的字节的高or低

image-almn.png

8位的控制字

  • 7-6:选择通道。00、01、10分别表示通道0-通道2,11表示无效
  • 5-4:送数据方式。
    • 00为计数器锁存当前值。
    • 01表示读写低字节;10表示读写高字节。
    • 11表示先读写低字节,然后读写高字节。
  • 3-1:工作方式。000-101分别表示工作方式从0到5。
  • 0:计数方式。0表示二进制计数,1表示BCD计数。

8253的编程

整体思路

  1. 写控制字:决定通道、工作方式、计数方式。
  2. 写计数初始值。(如果是0-255,只需要OUT1次。如果>255,需要OUT两次,先低后高

8253的6种工作方式

工作方式总结

  • 方式0
    • 输出特点:只有它初始值是0,计数结束后变成1。
    • 应用:计数结束进行中断请求。
  • 方式1:
    • 输出特点:单稳态脉冲(气球形变)。GATE启动—硬件触发。
    • 应用:程序控制脉冲宽度;定时延时
  • 方式2:
    • 输出特点:连续!连续的负脉冲,自动装入初始值
    • 应用:分频器
  • 方式3:
    • 输出特点:连续方波。自动装入初始值。
    • 应用:方波发生器。
  • 方式4:
    • 输出特点:单负脉冲。软件触发。
    • 应用:选通触发——定时炸弹。
  • 方式5:
    • 输出特点:单负脉冲。硬件出发——GATE启动。自动装入初始值。
    • 应用:选通触发——定时炸弹。

image-6wft.png

思考一些相同点

  • 方式1和方式5:硬件触发,需要等待GATE的上升沿。
  • 方式2和方式3:产生连续的负脉冲。
  • 方式2方式3和方式5:自动重新装入初始值。

思考一些特殊的地方

  • 方式0:初始是低电平,最后才升高。

方式0:计数结束中断

时序图

特点

  • 写入控制字后,OUT立刻变成低电平(只有方式0才是这种特点
  • 设置初值后,再来一个CLK下降沿脉冲在真正开始计数。
  • GATE:1表示可以工作。
  • 计数器减到0后,OUT变成高电平。

应用:定时计数。计数结束后请求中断。

方式1:可编程单稳脉冲

时序图

image-dior.png

特点

  • 写入控制字后,OUT立即变成高电平。
  • 设置初始值后,不开始计数,直到GATE出现上升沿,并在下一个CLK开始计数。计数的时候OUT才变低电平。
  • GATE:计数没有结束,GATE又来一个上升沿,则重新装入初始值。
  • 计数结束后,OUT变高。

应用

  • 负脉冲宽度 = T_{CLK}×n,可以调节!
  • 单稳态触发器(单稳态触发器的工作原理:当接收到输入信号时,它会暂时改变状态,然后自动返回原始的稳定状态。可以类比为气球的形变)

方式2:分频器(连续负脉冲)

时序图

image-dc9w.png

特点

  • 写入控制字后,OUT立刻变高电平。
  • 写入初始值后,下一个CLK开始计数。
    • 重新计数:计数器减到1后产生一个低电平脉冲,计数器到0又重新变高,同时将初始值继续装入,重新计数
    • 产生一系列连续的负脉冲,频率:f_{clk}/n
  • GATE:=1才计数。

应用:分频器/负脉冲序列发生器。

方式3:方波发生器

时序图

image-uvob.png

特点

  • 写入控制字后,OUT立刻变高
  • 写入初始值后,下一个CLK开始计数。
    • 产生连续脉冲。频率:f_{clk}/n
    • 输出脉冲是正负对称的方波。(奇数:负脉冲比正脉冲少一个。)
  • GATE:=1才计数

应用:方波发生器/分频器

方式4:软件触发选通(定时炸弹)

时序图

image-8ee1.png

特点

  • 写入控制字后,OUT立刻变高。
  • 写入初始值后,下一个CLK开始计数。
    • 计数减少到0后OUT变低,产生一个负脉冲
  • GATE:=1才开始计数。

应用:软件触发,产生选通脉冲。

方式5:硬件触发选通

时序图

image-ol0a.png

特点

  • 写入控制字后,OUT变成高电平。
  • 写入初始值后GATE出现上升沿才开始计数,并且在下一个CLK开始。
    • 计数减少到0后OUT变低,产生一个负脉冲。
    • 自动再次装入N,等GATE的上升沿触发。
  • GATE:每次GATE来上升沿都重新装入N。就算新装入N,如果没来上升沿是不会装入的,而是等下次上升沿到来才装入。

应用:产生选通脉冲(硬件触发)

例题1:简单题

题目

image-vjvu.png

分析:本题属于简单类型,即直接告诉控制字各个字段的内容。

  • 本题给了8253的各个口地址,无须通过硬件译码电路来确定。
  • 第一步,确定控制字。00(通道0)11(送2次)011(方式3)1(BCD) = 37H
  • 第二步,编写程序
    • 按照先写控制字,写到题目给定的控制字口地址
    • 后写初始值的方式。写到目标地址。

编程要点

  1. 数据放寄存器AL,地址放DX。
  2. 写控制字,控制口地址3F6H。
  3. 写初始值,分两次OUT。
; 写控制字
MOV AL,37H
MOV DX,3F6H
OUT DX,AL
; 写计数初始值
MOV AL,34H
MOV DX,3F0H
OUT DX,AL
MOV AL,12H
OUT DX,AL

例题2:产生定时波形

题目:编写程序产生不同的定时方波。

image-5qfc.png

附控制字的格式:

image-tjjg.png

分析

  • 确定端口地址——本题给了CPU和8253之间的硬件电路。
    • 根据38译码器的片选,可以知道:A9A8=11,A7A6=00,A5=0
    • 根据38译码器的连线,可以知道:A4A3A0=100
    • 根据A2A1的不同,选择不同的通道地址
      • 00选择通道0:11 0001 0000 = 310H
      • 01选择通道1:11 0001 0010 = 312H
      • 通道2:314H
      • 控制单元:316H
  • 确定控制字
    • 确定方式
      • 通道0是2kHZ的方波,可以知道是方式3
      • 通道1是480us单负脉冲,有GATE信号,可以知道是方式1
      • 通道2是1us的单负脉冲,有GATE信号,比较短,可以知道是方式5
    • 确定初始值
      • N_0=f_{in}/f_{out}=1Mhz/2kHz=500,即分为05 00传送
      • N_1=T_{out}/T_{in}=480us/1us=480,即分为 04 80 传送
      • N2=26,只需要送入一次。
    • 确定控制字
      • 通道0:0011 0111 = 37H
      • 通道1:0111 0011 = 63H
      • 通道2:1001 1011 = 9BH

编写程序

; 通道0,写控制字
MOV AL,37H
MOV DX,316H
OUT DX,AL
; 通道0,写初始值
MOV AL,00
MOV DX,310H
OUT DX,AL
MOV AL,05
OUT DX,AL
; 通道1,写控制字
MOV AL,63
MOV DX,316H
OUT DX,AL
; 通道1,写初始值
MOV AL,80
MOV DX,312H
OUT DX,AL
MOV AL,04
OUT DX,AL
; 通道2,写控制字
MOV DX,316H
MOV AL,9BH
OUT DX,AL
; 通道2,写初始值
MOV DX,314H
MOV AL,26H
OUT DX,AL

例题3:长延时

题目
设计一个输出一个方波,让灯泡亮10s灭10s。输入频率是2Mhz。

image-rmbu.png

分析

  • 方波的T=20s,所以f_{out}=1/20=0.05,所以计数初始值:n=f_{in}/f_{out}=2M/0.05=40M
  • 需要将通道0和1串联,n0 = 5000,n1 = 8000

主要是分析出这个点,其他程序不难写。

例题4

题目:设计一个每500个工件就中断1次。

分析:看到中断肯定是方式0了,本题主要是注意将N设置为499而不是500。