新浪博客

8254应用举例

2013-10-12 16:28阅读:
在微机系统中,经常需要采用定时/计数器进行定时或计数控制。如在PC/XT系统中,8254的通道0用于系统时钟定时,通道1用于DRAM刷新定时,通道2用于驱动扬声器工作。接口电路如图7.29所示
        图7.29 8254的接口电路
  三个通道的时钟信号CLK2~CLK0由系统时钟4.77MHz经四分频后的1.19MHz提供。
  计数器0工作在方式3,GATE0接高电平,OUT0接到8259A的IR0(总线的IRQ0)引脚,要求每隔55ms产生一次定时中断,用于系统实时时钟和磁盘驱动器的电机定时。
  计数器1工作在方式2,GATE1接高电平,OUT1输出经D触发器后作为对DMA控制器8237A通道0的DREQ0信号,每隔15ms定时启动刷新DRAM。
  计数器2工作在方式3,GATE2由8255A芯片的PB0控制,OUT2输出的方波和8255A芯片的PB1信号进行“与”操作,再经过驱动和低通滤波,产生驱动扬声器发声的音频信号。
  计数初始值的计算如下。
  计数器0:55ms(54.925 493ms)产生一次中断,即每秒产生18.206次中断请求,所以,
计数初始值=1.193 18MHz÷18.206=65 536(即0000H)
  计数器1:在PC/XT计算机中,要求在2ms内进行128次刷新操作,由此可计算出每隔2ms÷128=15.084ms必须进行一次刷新操作。所以
计数初始值=15.084ms×1.19318 MHz=17.997 9≈18
  计数器2:假设扬声器的发声频率为1kHz,则
计数初始值=1.193 18 MHz÷1kHz=1 190
  设8254的端口地址为40H~43H,8255A的端口地址为60H~63H。下面给出计数器0和计数器1的初始化程序及计数器2的扬声器驱动程序。
计数器0初始化程序为:
 
 MOV AL, 36H   ; 计数器0方式3, 采用二进制计数, 先低字节后高字节
;写入计数初始值
OUT 43H, AL   ; 写入控制端口
MOV AL, 0    ; 计数初始值0000H
OUT 40H, AL   ; 写计数初始值低字节
OUT 40H, AL   ; 写计数初始值高字节
计数器1初始化程序为:
  MOV AL, 54H   ; 计数器1方式2, 采用二进制数计数, 只写低字节
  OUT 43H, AL   ; 写入控制端口
  MOV AL, 18   ; 计数初始值为18
  OUT 41H, AL   ; 写计数初始值
计数器2的发声驱动程序为:
BEEP PROC FAR
MOV AL, 0B6H   ; 计数器2方式3, 采用二进制计数, 先低字节后高字节
; 写入计数初始值
OUT 43H, AL   ; 写入控制端口
MOV AX, 1190   ; 计数初始值为1190
OUT 42H, AL   ; 写计数初始值低字节
MOV AL, AH
OUT 42H, AL   ; 写计数初始值高字节
IN  AL, 61H   ; 读8255A的B口
MOV AH, AL    ; B口数据暂存于AH中
OR AL, 03H    ; 使PB1和PB0均为1
OUT 61H, AL   ; 打开GATE2门, OUT2输出方波, 驱动扬声器
MOV CX, 0    ; 循环计数, 最大值为216
L0: LOOP L0     ; 循环延时
DEC BL      ; BL为子程序入口条件
JNZ L0      ; BL=6, 发长声(约3s),BL=1, 发短声(约0.5s)
MOV AL, AH    ; 恢复8255A的B口值, 停止发声
OUT 61H, AL
RET        ; 子程序返回
BEEP ENDP
  8254定时/计数器的应用非常广泛,不仅可以为微机系统提供定时信号,在实际工程中可以应用8254对外部事件进行计数,还可以通过8254驱动扬声器,编写简单的音乐程序等等。

我的更多文章

下载客户端阅读体验更佳

APP专享