第12章 发声系统的程序设计

30
IBM PC 80X86 汇汇汇汇汇汇汇汇汇汇汇汇汇汇汇 第 12 第 第第第 第第第第第 第 12 第 第第第 第第第第第

Upload: hyatt-rice

Post on 15-Mar-2016

78 views

Category:

Documents


6 download

DESCRIPTION

第12章 发声系统的程序设计. 基本内容. 可编程内部定时器8253/54 通用发声程序 乐曲程序. 12.1 可编程内部定时器8253/54. 编程结构 工作方式 控制字 IBM PC 8253/54 定时器的使用. 编程结构. 8253/54定时器内部有3个独立工作的计数器:计 数器0、计数器1和计数器2,端口地址分别为40 H、41H 和42 H。 其中计数器0用于实时钟,计数器1用于 DMA 进行寄存器刷新,计数器2用于扬声器发声。每个计数器 中包含一个以倒计数的方式计数的16位计数寄存器。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

第 12 章 发声系统的程序设计

Page 2: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

基本内容可编程内部定时器 8253/54

通用发声程序 乐曲程序

Page 3: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

12.1 可编程内部定时器 8253/54 编程结构 工作方式 控制字 IBM PC 8253/54 定时器的使用

Page 4: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

8253/54 定时器内部有 3 个独立工作的计数器:计 数器 0 、计数器 1 和计数器 2 ,端口地址分别为 40H 、 41H 和 42H 。其中计数器 0 用于实时钟,计数器 1 用于 DMA 进行寄存器刷新,计数器 2 用于扬声器发声。每个计数器 中包含一个以倒计数的方式计数的 16 位计数寄存器。 8253/54 内部还有一个公用的控制寄存器,端口地址为 43H 。 每个计数器由 CLK 、 GATE 和 OUT 3 个引脚与外部通信, 如下图所示,其中 CLK 为时钟输入端, GATE 为门控信号, OUT 为信号输出端。

编程结构

Page 5: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

内部总线

CLK0

GATE0OUT0

CLK1

GATE1OUT1

CLK2

GATE2OUT2

计数器 2

计数器 0

计数器 1

D0–D7

A0A1WRRDCS

数据总线缓冲器

读写逻辑

控制寄存 器

Page 6: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

8253/54 有 6 种可编程选择的工作方式。这 6 种工作方式的主要区别是输出波形不同,下面分别作以介绍。

工作方式

1. 方式 0 :计数结束产生中断 在这种方式下,计数器对 CLK 输入信号进行减法计数,每一个时钟周期计数器减 1 。当设定该方式后,计数器的 OUT 变低。设置装入计数值时也使输出 OUT变低。当计数减到 0— 计数结束时,输出 OUT 变高。该输出信号可以作为中断请求信号来使用。

Page 7: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 2. 方式 1 :可编程单脉冲输出 当计数器的计数值装入计数器后,要由门控信号 GATE 上升沿开始启动计数。同时计数器的 OUT 输出为低电平。当计数结束时,OUT 输出为高电平。这样就可以从计数器的 OUT 端得到一个由

GATE上升沿开始,直到计数结束的负脉冲。若要再次获得一个所希望宽度的负脉冲,则需要重新装入计数值并用 GATE 启动来达到。 3. 方式 2 :频率发生器 在该方式下,计数器装入初值,开始工作后,计数器的输出OUT 将连续输出一个时钟周期宽的脉冲。两负脉冲之间的时钟周期数就是计数器装入的计数初值。这样一来,就可以利用不同的计数值达到对时钟脉冲的分频,而分频输出就是 OUT 输出。

Page 8: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 4. 方式 3 :方波发生器 这种方式下,可以得到对称的方波由 OUT 输出。当装入计数值为 N 时,若 N 为偶数,则完成 N/2 计数 OUT 为高,完成另外 N/2 计数时 OUT 为低,一直进行下去。若 N 为奇数,则( N+1 ) /2 计数时 OUT 保持高电平。而( N—1 ) /2 计数期间 OUT 为低电平。 5. 方式 4 :软件触发选通 设置此方式后,输出 OUT 立即变为高电平,一旦装入计数值,计数立即开始。当计数结束时,由 OUT 输出一个宽度为一个时钟周期的负脉冲。

Page 9: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

6. 方式 5 :硬件触发选通 在设置此方式后, OUT 输出为高电平。计数由GATE的上升沿开始进行,当计数结束时由输出端 OUT 送出一宽度为一个时钟周期的负脉冲。 在此方式下, GATE 的电平高低不影响计数,只是由 GATE 的上升沿启动计数开始。 若在计数结束前,又出现 GATE 上升沿,则计数从头开始。

Page 10: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

8253/54 的 3 个计数器是分别编程的,中央处理器通过写入控制命令字对 8253/54 进行编程,将控制字送入控制寄存器,设定 8253/54 的工作方式。 8253/54 控制寄存器中的控制字节格式如下:

控制字

SC1

SC0

RL1

RL0

M2 M1 M0 BCD

D7 D6 D5 D4 D3 D2 D1 D0

Page 11: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 D0 :选择计数器格式 0 :二进制计数 1 : BCD 码格式 D1 、 D2 、 D3 :选择工作方式 000 :方式 0 001 :方式 1 x10 :方式 2 x11 :方式 3 100 :方式 4 101 :方式 5

D4 、 D5 :选择读写方式 00 :将计数器中的数据锁存于缓冲器 01 :选择计数器的低 8 位读写 10 :选择计数器的高 8 位读写 11 :先读写低 8 位计数值,后读写高 8 位计数值D6 、 D7 :选择计数器 00 :计数器 0 01 :计数器 1 10 :计数器 2 11 :非法

Page 12: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

例:按要求写出 8253 的初始化程序:将计数器 0 设为模式 3 ,计数初始值为 2000 ( BCD 码)。 MOV AL , 00110111B ;设定控制字 OUT 43H , AL ;控制字送控制寄存器 MOV AX , 2000H OUT 40H , AL MOV AL , AH OUT 40H , AL

Page 13: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

在 PC 系列微机系统中, 8254/53 的 3 个时钟输入端 ( CLK0 、 CLK1 、 CLK2 )的输入频率均为 1.1931816MHz 。 IBM 公布的软件 BIOS 中有专门对 8253 初始化的程序 。 下面是计数器 0的初始化程序:

IBM PC 8253/54定时器的使用

MOV AL , 00110110H ;选择计数器 0 ,双字节,方式 3 ,十六进制 OUT 43H , AL ;写入控制器 MOV AL , 0 ;初值为 0000H (即 65636 ) OUT 40H , AL ;写低字节 OUT 40H , AL ;写高字节

Page 14: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 计数器 1 专门用做动态随机存储器刷新的定时控制,下面是计数器 1 的初始化程序: MOV AL , 01010100H ;选择计数器 1 ,只写低字节,方 式 2 ,二进制 OUT 43H , AL ;写入控制器 MOV AL , 18 ;将低字节计数值 18 写入 OUT 41H , AL ;计数器 1 门控 GATE1 接 +5V ,输出 0UT1 通过 D 型触发器产生存 储器刷新请求信号 DRQ0 , DRQ0 是 DMA 控制器通道 0 的请 求信号。刷新分频数设为 18 ,因此,在 OUT1 输出周期 为 18/1.1931816 MHz (即约 15μs )的脉冲序列。

Page 15: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 计数器 2 产生扬声器频率信号,控制扬声器发声。下面是计数器 2 的初始化程序: MOV AL , 10110110H ;选择计数器 2 ,写双字节, 方式 3 ,二进制数 OUT 43H , AL ;写入控制器 MOV AX , 533H ;初值为 533H OUT 42H , AL ;送低字节 MOV AL , AH OUT 42H , AL ;送高字节 计数器 2 工作于方式 3 。门控 GATE2 与 8255 的端口 PB0 相连,输出 0UT2 产生频率为 896Hz 的方波,因此将计数器 2 的计数初值设为 533H ( 1.1931816MHz/896Hz=533H )

Page 16: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计12.2 通用发声程序

PC 机可以通过两种方法产生声音 ,这两种方法都与并行接口芯片 8255 有关 , 8255 有 3 个 8 位端口和一个控制寄存器,端口地址分别为 60H 、 61H 、 62H 和 63H 。 60H端口和 62H端口用于输入, 61H端口用于输出,这 3 个端口分别称为 PA 、 PC 、 PB , 63H 端口用于设置 8255 的工作方式。 8255 PB 口各位含义如下图所示。 D7

D6

D5

D4

D3

D2

D1

D0 定时器 2闸门扬声器数据选择 C 端口来源开动盒带马达

选择 A 端口来源 禁止键盘时钟脉冲 允许扩展槽错误信息 允许 RMA 工作

扬声器驱动方式

Page 17: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 一种方法是通过输入 / 输出指令向设备寄存器的 D1位交替送 0 和 1 ,使与其相连的扬声器脉冲门产生连续的脉冲电流,驱动扬声器发声。 第二种方法是利用 8253/54 可编程定时器驱动扬声器。如 下 图 所 示 , 和 扬 声 器 相 连 的 是 定 时 器 2 , 门 控

GATE2 与端口 61H 的 D0 位相连,该位为 1 时,允许定时器 2 工作在方式 3 。输出 OUT2 与端口 61H的D1 位通过一个与门和扬声器的驱动电路相连,该位为1 时,允许输出信号送到扬声器电路。

与门

放大器 扬声器8255PB D1

脉冲信号8255PB D0

CLOCK OUT2

GATE2

Page 18: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计通用发声程序

BIOS 中的 BEEP子程序能控制 8253/54 定时器,产生频率为 896 Hz 、持续时间为 0.5秒倍数的声音。程序设计中可以对 BEEP 程序作以修改,使其不仅能产生任一频率的声音,而且能调整声音的持续时间。 由于计数器的输入频率为 1.1931816M Hz ,所以用下式:1193100÷要求频率 =12348H÷ 要求频率计算出计数值,将该值作为初值送计数器 2 ,就可以实现: MOV DX , 12H MOV AX , 348CH DIV DI

Page 19: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 例:通用发声程序 GENSOUND 。

;功能:产生任一频率的声音;入口参数: BX= 时间延时的计数初值 DI=指定的发声频率PUBLIC GENSOUNDCODE SEGMENT PARA‘CODE’ ASSUME CS : CODE UNSOUND PROC FAR PUSH AX PUSH BX PUSH CX

Page 20: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 PUSH DX PUSH DI MOV AL , 0B6H ;初始化定时器 2 OUT 43H , AL MOV DX , 12H MOV AX , 348CH ;设置输入频率 DIV DI OUT 42H , AL MOV AL , AH OUT 42H , AL IN AL , 61H ;读 8255状态 MOV AH , AL

Page 21: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 OR AL , 3 ;设置 61H端口的 D0 和 D1 位 OUT 61H , AL WAIT : MOV CX , 1400 ;设定延时 DELAY : LOOP DELAY DEC BX JNZ WAIT MOV AL , AH OUT 61H , AL POP DI POP DX POP CX

Page 22: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 POP BX POP AX RET UNSOUND ENDP CODE ENDS END

说明: 8088/86 系统时钟频率为 4.7M Hz ,即时钟周期约 212ns , CPU执行一条 LOOP指令需要 17个时钟周期,所以该程序中的延时设定值为5ms(1400*17*212ns) 。

Page 23: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

为了编写能发出乐曲音调的声音,可以利用计算机 控制发声的原理,通过对 8253 编程来实现。下表给出了 两个音节的音符与频率之间的关系。 从表中可以看出声音频率值和脉冲频率值有如下关 系:脉冲频率 =1193181/ 声音频率。

12.3 乐曲程序 音调与频率和时间的关系

Page 24: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

音符 脉冲频率 声音频率 音符 脉冲频率 声音频率1 9104 131 2 4056 2942 8113 147 3 3614 3303 7228 165 4 3417 3494 6815 175 5 3042 3925 6085 196 6 2710 4406 5421 220 7 2415 4947 4828 247 1 2280 5231 4452 262      

音符与频率之间的关系

Page 25: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计

明确了音调与频率和时间的关系,设计程序时, 就可以按照乐谱在数据段中定义两个存储区,将每个 音符所对应的频率和延时时间值分别放在两个存储区 中,在代码段中依次取出表中的频率值和时间值,实 现演奏。

演奏乐曲的程序

Page 26: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 例:《萍聚》乐曲演奏程序如下: DATA SEGMENTMUSIF DW 196 , 220 , 262 , 294 , 330 , 2 DUP(392) DW 440 , 392 , 2 DUP(330),294 , 3 DUP(262) , 220 , 220 , 262 DW 294 , 196 , 220 , 262 , 294 , 330 , 2 DUP(392) DW 440 , 392 , 330 , 330 , 294 , 3 DUP(262) , 220 , 220 , 196 DW 3 DUP(262) , 294 , 262 , 294 , 330 , 349 DW 392 , 392 , 440 , 392 , 330 , 392 , 3 DUP(440) , 392 , 330 DW 294 , 262 , 294 , 196 , 220 , 262 , 294 , 330 , 392 , 392 DW 440 , 392 , 2DUP(330) , 294 , 3DUP(262) , 220 , 220 , 196,262 DW -1 ;以上为频率表

Page 27: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计MUSIT DW 2 DUP(12),38,12,25,12,12 DW 38,12,25,12,12,38,5 DUP(12) DW 75,12,12,38,12,25,12,12 DW 38,12,25,12,12,38,5 DUP(12) DW 75,12,12,38,12,25,12,12 DW 38,6,6,25,12,12,38,12,25,12,12 DW 38,12,25,12,12 , 38 , 12 , 25 , 12 , 12 DW 38 , 12 , 25 , 12 , 12 , 38 , 5 DUP(12),100 ;以上为节拍时间表DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA

Page 28: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计MAIN PROC FARSTART: MOV AX,DATA MOV DS,AX LEA SI,MUSIT ;频率表偏移地址 LEA BP,DS:MUSIF ;时间表偏移地址VOIM: MOV DI,[SI] CMP DI,-1 JE ENDF MOV BX,DS:[BP] MOV AL,0B6H OUT 43H,AL MOV DX,12H MOV AX,348CH DIV DI OUT 42H,AL

Page 29: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 MOV AL,AH OUT 42H,AL IN AL,61H MOV AH,AL OR AL,3 ;打开扬声器 OUT 61H,ALWAIT1: MOV CX,1400LONG: LOOP LONG DEC BX JNZ WAIT1 MOV AL,AH OUT 61H,AL ;复位端口 ADD SI,2 ADD BP,2 JMP VOIM

Page 30: 第12章   发声系统的程序设计

《 IBM PC 80X86 汇编语言程序设计》 冶金工业出版社

第 12章 发声系统的程序设计 ENDF: MOV AX,4C00H INT 21H CODE ENDS END START

从上面的程序中可以看出,编写乐曲程序分为 3 个步骤: ( 1 )在数据段中为要演奏的乐曲定义一个声音频率表和一个节拍时间表。 ( 2 )将声音频率表和节拍时间表的偏移地址送 SI 和 BP

( 3 )从声音频率表和节拍时间表中取出数据分别送入DI 和 BX