微机的题目:求“8254初始化及其应用”的解答!谢谢!

如题所述

7.3.2 8254工作方式及其初始化编程
http://www.tyut.edu.cn/kecheng1/2008/site04/courseware/chapter7/7.3.2.htm

7.3.2 8254工作方式及其初始化编程

1.8254工作方式
  8254的每个计数器有六种工作方式,同一芯片中的三个计数器可以通过初始化分别设定为不同的工作方式,但是不论哪种工作方式都应遵循以下规则:

  ① 控制字写入控制寄存器后,控制逻辑电路复位,输出信号OUT进入初始状态(高电平或低电平)。

  ② 计数初始值写入CR后,经过一个时钟周期,送入CE。

  ③ 通常在时钟脉冲CLK的上升沿对门控信号GATE采样。在不同工作方式下,对门控信号的触发方式有不同的要求。

  ④ 在时钟脉冲CLK的下降沿,计数器减“1”计数。

(1)方式0:计数结束产生中断(interrupt on terminal count)

  方式0时序如图7.21所示。   图7.21 方式0时序

  在写入控制字CW(control word)后,OUT引脚初始电平为低电平,写入计数初始值N之后的第一个CLK的下降沿将N装入计数执行部件,待下一个CLK的下降沿到来且门控信号GATE为高电平时,开始启动减“1”计数,随后每一个CLK的下降沿,计数器减1。在计数过程中,OUT引脚一直保持低电平,直到计数为“0”时,OUT引脚输出由低电平变为高电平,并且保持高电平。

  方式0的特点:计数初始值无自动装入功能,若要继续计数,则需要重新写入计数初始值。门控信号GATE用来控制CE,当GATE为高电平时,允许计数;当GATE为低电平时,禁止计数。当GATE重新为高电平时,计数器接着当前的计数值继续计数。计数期间给计数器装入新值,则会在写入计数初始值后重新开始计数过程。

  由于方式0在计数结束后,OUT引脚输出一个由低电平到高电平的跳变信号,因此可以用它作为计数结束的中断请求信号。

(2)方式1:可重复触发的单稳态触发器(hardware retriggerable one shot)

  方式1时序如图7.22所示,    图7.22 方式1时序

  在写入控制字CW后,OUT引脚初始电平为高,写入计数值N后,计数器并不开始计数,直到GATE上升沿触发之后的第一个CLK的下降沿,将N装入CE,待下一个CLK的下降沿开始计数,OUT引脚由高电平变为低电平。在整个计数过程中,OUT引脚都保持低电平,直到计数为“0”时变为高电平。一个计数过程结束后,OUT引脚输出一个宽度为N倍时钟周期的负脉冲,可作为单稳态触发器的输入信号。

  方式1的特点:硬件启动计数,即由门控信号GATE的上升沿触发计数。在计数过程中,CPU可改变计数值,但是对计数过程没有影响。计数为“0”,OUT引脚输出高电平,若再次触发,则计数器将按新输入的计数初始值进行计数。

(3)方式2:分频器(rate generator)

  方式2时序如图7.23所示,     图7.23 方式2时序

  控制字CW写入之后,OUT引脚初始电平为高,在写入计数值N之后第一个CLK的下降沿将N装入计数执行单元CE,待下一个CLK的下降沿到来且门控信号GATE为高电平时,启动计数。在计数过程中,OUT引脚始终保持高电平,直到CE减到“1”时,OUT引脚变为低电平,维持一个时钟周期后,又恢复为高电平,同时自动将计数值N加载到CE,重新启动计数,形成循环计数过程,OUT引脚连续输出负脉冲。

  方式2的特点:计数初始值有自动装入功能,不用重新写入计数值,计数过程可由GATE信号控制。当GATE为低电平时,暂停计数;在GATE变为高电平后的下一个CLK脉冲使计数器恢复计数初始值,重新开始计数。

(4)方式3:方波发生器(square wave mode)

  方式3时序如图7.24所示,     图7.24 方式3时序

  工作原理与方式2类似,有自动重复计数功能,但OUT引脚输出的波形不同。当计数值N为偶数时,OUT输出对称的方波信号,正负脉冲的宽度为个时钟周期;当计数值N为奇数时,OUT输出不对称的方波信号,正脉冲宽度为个时钟周期,负脉冲宽度为个时钟周期。

(5)方式4:软件触发计数(software triggered strobe)

  方式4时序如图7.25所示,     图7.25 方式4时序

  写入控制字CW后,OUT初始电平为高,在写入计数初始值N之后的第一个CLK的下降沿将N装入计数执行单元CE,待下一个计数脉冲信号CLK到来且门控信号GATE为高电平时(即软件启动),开始计数。当计数为“0”时,OUT引脚由高电平变为低电平,维持一个时钟周期,OUT引脚由低电平变为高电平。一次计数过程结束后,OUT引脚输出宽度为一个时钟周期的负脉冲信号.

  方式4的特点:无自动重复计数功能,只有在输入新的计数值后,才能开始新的计数。若设置的计数值为N,则在写入计数值N个时钟脉冲之后,才使OUT引脚产生一个负脉冲信号。

(6)方式5:硬件触发计数(hardware triggered strobe)

  方式5时序如图7.26所示,     图7.26 方式5时序

  写入控制字CW后,OUT引脚初始电平为高,在写入计数值N后,计数器并不开始计数,只有GATE信号出现由低到高的上升沿(即硬件启动)之后的第一个CLK的下降沿,将N装入计数执行单元CE,待下一个CLK的下降沿才开始计数。当计数为“0”后,OUT引脚由高电平变为低电平,维持一个时钟周期,OUT引脚由低电平变为高电平。一次计数过程结束后,OUT引脚输出宽度为一个时钟周期的负脉冲信号。

  方式5输出波形与方式4相同。两种工作方式的区别是:方式4为软件启动计数,即GATE=1,写入计数初始值时启动计数;方式5为硬件启动计数,即先写入计数初始值,由GATE的上升沿触发,启动计数。

  在设置8254的工作方式时,需要注意上述六种工作方式的一些特点:方式0, 1, 4, 5的计数初始值无自动加载功能,当一次计数结束后,若要继续计数,需要再次编程写入计数值;方式2和方式3的计数初始值有自动加载功能,只要写入一次计数值,就可以连续进行重复计数。方式2, 4, 5的输出波形虽然相同,即都是宽度为一个时钟周期的负脉冲,但方式2可以连续自动工作,方式4由软件触发启动,方式5由硬件触发启动。

8254的六种工作方式的特点及其功能见表7.5。

      表7.5 8254的六种工作方式的特点及其功能

2.8254初始化编程
  8254的每个计数器都必须在写入控制字和计数初始值后,才能启动工作,因此,在初始化编程时,必须通过写入控制字来设定计数器的工作方式和写入计数初始值。

(1)控制字的格式

8254控制字的格式如图7.27所示。

        图7.27 8254控制字的格式

  D0:计数初始值计数方式选择。D0=1,BCD码计数;D0=0,二进制数计数。

  8254有BCD码和二进制数两种计数方式。若采用二进制数计数(16位),计数值的范围为0000~FFFFH,最大值为216,即十进制数的65536,表示为0000H;若采用BCD码计数(四位十进制数),计数值的范围为0000~9999,最大值为104,即十进制数的10000,表示为0000。

  D3D2D1:工作方式选择位。因为M2M1M0的二进制编码有八种(即000~111),而8254有六种工作方式,所以,方式2和方式3的M2位可设为任意值0或者1。

  D5D4:读/写计数器控制。计数值的读出或写入可按字节或字两种方式进行操作,用RW1和RW0的编码01, 10, 11来控制读出或写入计数值的顺序和字节数。若按字节读/写时,可选择低8位或高8位;若按字读写时,分为两步完成,即先读/写低8位后读/写高8位。

  D7D6:计数器选择。D7D6的四个状态分别对应选择计数器0, 1和2,三个计数器的控制寄存器使用相同的端口地址。

  需要注意的是:CPU对8254的某个计数器进行读出操作时,有两种方法。一种方法是先由控制字的RW1和RW0设定读出顺序与格式,然后由输入(IN)指令对所选计数器进行读出操作。采用这种方法时,为了确保被读出的当前计数值稳定,可利用门控信号GATE或者阻止时钟输入的方法,暂时禁止计数器操作。另一种方法是先给8254发锁存命令(即设定RW1和RW0为00),然后按照先读取低字节、后读取高字节的顺序将当前计数值读出。当8254接收到锁存命令后,将当前的计数值锁存到计数锁存寄存器中,供CPU读取。

(2)8254的读回命令

  8254的读回命令可以将三个计数器的计数值和状态锁存,并向CPU返回一个状态字,如图7.28所示。

        图7.28 8254的读回命令

  D7=1, D6=1时,为读回命令。

  D5=0为锁存计数值,以便CPU读取当前计数值。

  D4=0为锁存状态信息。

  D3~D1是计数器选择位,一次可以锁存一个计数器、两个计数器或者三个计数器中的计数值或状态信息。当某一计数器的计数值或状态信息被CPU读取后,锁存失效。

  读回命令写入控制端口,状态信息和计数值都通过计数器端口读取。如果使读回命令的D5和D4位都为0,即状态信息和计数值都要读回,读取的顺序是:先读取状态信息,后读取计数值。

(3)计数初始值的设定

  计数初始值(或称计数常数)可根据8254的实际应用和工作方式来设定,一般有如下几种情况:

  ① 作为发生器,应选择方式2或方式3。它实际上是一个分频器,因此计数常数就是分频系数,即:分频系数(fi为输入CLK频率,f0为OUT输出频率)。

  ② 作为定时器,计数脉冲CLK通常来自系统内部时钟,计数常数就是定时系数,即:定时系数(T为定时时间,tclk为时钟周期,fclk为时钟频率)。

  ③ 作为计数器,计数脉冲通常来自系统外部,因此,计数常数为外部事件的脉冲个数。

(4)8254初始化编程

  在编写初始化程序时,由于8254的三个计数器的控制字都是独立的,而他们的计数常数都有各自的地址单元,因此初始化编程顺序比较灵活,可以写入一个计数器的控制字和计数常数之后,再写入另一个计数器的控制字和计数常数,也可以把所有计数器的控制字都写入之后,再写入计数常数。需要注意的是:计数器的控制字必须在其计数常数之前写入,计数常数的低8位须在高8位之前写入。下面通过示例说明8254的初始化编程方法。

【例7.6】 某系统使用一片8254,要求完成如下功能:

  ① 计数器0对外部事件计数,记满100次向CPU发出中断请求;

  ② 计数器1产生频率为1kHz的方波信号,设输入时钟CLK1为2.5MHz;

  ③ 计数器2作为标准时钟,每秒向CPU发一次中断请求,输入时钟CLK2由OUT1提供。

  根据题意,确定相应通道的工作方式控制字及计数常数:

  计数器0的控制字为00010000B,即10H(方式0、二进制计数),计数常数为100。

  计数器1的控制字为01110110B,即76H(方式3、二进制计数)。

  计数常数为:=2.5MHz/1kHz=2500。

  计数器2的控制字为10110001B,即B1H(方式0、BCD计数)。

  计数常数为:=1s×1kHz=1000。

  设8254的端口地址为80H~83H,编制初始化程序如下:

  MOV AL, 10H     ; 计数器0控制字
  OUT 83H, AL     ; 写入控制端口
  MOV AL, 100     ; 计数常数100
  OUT 80, AL      ; 写入计数器0的低字节
  MOV AL, 76H     ; 计数器1控制字
  OUT 83H, AL     ; 写入控制端口
  MOV AX, 2500     ; 计数常数2500
  OUT 81H, AL     ; 写入计数器1低字节
  MOV AL, AH
  OUT 81H, A      ; 写入计数器1高字节
  MOV AL, 0B1H     ; 计数器2控制字
  OUT 83H, AL     ; 写入控制端口
  MOV AX, 1000H    ; 计数常数1000(BCD码为1000H)
  OUT 82H, AL     ; 写入计数器2低字节
  MOV AL, AH
  OUT 82H, AL     ; 写入计数器2高字节
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-24
8254 的初始化
——————————————————————————
初始化分为两步:
向控制寄存器写入方式控制字,确定所要使用的计数器的工作方式;
向使用的计数器写入计数初值。

你的题目没有具体数值,所以进行自设。

设某微机系统中8254的端口地址为40H~43H,要求计数器0工作在方式0,计数初值为0DEH,按二进制计数;计数器1工作在方式2,计数初值为1000D,按BCD码计数。试写出初始化程序段。

初始化程序如下:
MOV AL,10H ;写通道0控制字
OUT 43H,AL
MOV AL,0DEH ;写通道0计数初值
OUT 40H,AL
MOV AL,65H ;写通道1控制字
OUT 43H,AL
MOV AL,10H ;写通道1计数初值
OUT 41H,AL

8254 的应用
——————————————————————————
1. 8254控制扬声器
2. PWM脉宽调制
3. 电机转速测量本回答被提问者采纳