目录
3.1实验目的
学习用 8254 定时/计数器使蜂鸣器发声的编程方法。
3.2实验设备
PC 机一台,TDX-PITE 实验装置一套
3.3实验内容
根据实验提供的音乐频率表和时间表,编写程序控制 8254,使其输出连接到扬声器上能发出相应的乐曲。
3.4实验说明及步骤
一个音符对应一个频率,将对应一个音符频率的方波通到扬声器上,就可以发出这个音符的声音。将一段乐曲的音符对应频率的方波依次送到扬声器,就可以演奏出这段乐曲。利用8254 的方式 3一-“方波发生器”,将相应一种频率的计数初值写入计数器,就可产生对应频率的方波。计数初值的计算如下:
计数初值 = 输入时钟 / 输出频
例如输入时钟采用 1MHz,要得到 800Hz 的频率,计数初值即为 1000000800。音符与频率对照关系如表 3.1 所示。对于每一个音符的演奏时间,可以通过软件延时来处理。首先确定单位延时时间程序 (根据 CPU 的频率不而有所变化)。然后确定每个音符演需要几个单位时间,将这个值送入 DL 中,调用 DALLY 子程序即可。
单位延时时间DALLY PROC
DO: MOV CX,0010H
D1: MOV AX,OFOOH
D2: DEC AX
JNZ D2
LOOP D1
RET
DALLY ENDP
;N 个单位延时时间 (N 送至 DL)DALLY PROC
DO: MOV CX,0010H
D1: MOV AX,OFOOH
D2:DEC AX
JNZ D2
LOOP D1
DEC DL
JNZ D0
RET
DALLY ENDP
下面提供了乐曲《友谊地久天长》实验参考程序。程序中频率表是将曲谱中的音符对应的频率值依次记录下来(B 调、四分之二拍),时间表是将各个音符发音的相对时间记录下来(由曲谱中节拍得出)。
;=================================================================
; SOUND.asm
; 电子发声设计实验 歌曲《天长地久》
;=================================================================
; 端口定义
IOY0 EQU 0600H
MY8254_COUNT0 EQU IOY0+00H*2 ;8254计数器0端口地址
MY8254_COUNT1 EQU IOY0+01H*2 ;8254计数器1端口地址
MY8254_COUNT2 EQU IOY0+02H*2 ;8254计数器2端口地址
MY8254_MODE EQU IOY0+03H*2 ;8254控制寄存器端口地址
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
FREQ_LIST DW 371,495,495,495,624,556,495,556,624
DW 495,495,624,742,833,833,833,742,624
DW 624,495,556,495,556,624,495,416,416,371
DW 495,833,742,624,624,495,556,495,556,833
DW 742,624,624,742,833,990,742,624,624,495
DW 556,495,556,624,495,416,416,371,495,0
TIME_LIST DB 4, 6, 2, 4, 4, 6, 2, 4, 4
DB 6, 2, 4, 4, 12, 1, 3, 6, 2
DB 4, 4, 6, 2, 4, 4, 6, 2, 4, 4
DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4
DB 6, 2, 4, 4, 12, 4, 6, 2, 4, 4
DB 6, 2, 4, 4, 6, 2, 4, 4, 12
DATA ENDS
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV DX, MY8254_MODE ;初始化8254工作方式
MOV AL, 36H ;定时器0、方式3
OUT DX, AL
BEGIN: MOV SI,OFFSET FREQ_LIST ;装入频率表起始地址
MOV DI,OFFSET TIME_LIST ;装入时间表起始地址
PLAY: MOV DX,0FH ;输入时钟为1MHz,1M = 0F4240H
MOV AX,4240H
DIV WORD PTR [SI] ;取出频率值计算计数初值,0F4240H / 输出频率
MOV DX,MY8254_COUNT0
OUT DX,AL ;装入计数初值
MOV AL,AH
OUT DX,AL
MOV DL,[DI] ;取出演奏相对时间,调用延时子程序
CALL DALLY
ADD SI,2
INC DI
CMP WORD PTR [SI],0 ;判断是否到曲末?
JE BEGIN
JMP PLAY
DALLY PROC ;延时子程序
D0: MOV CX,0010H
D1: MOV AX,0F00H
D2: DEC AX
JNZ D2
LOOP D1
DEC DL
JNZ D0
RET
DALLY ENDP
CODE ENDS
END START
还有别的歌曲可以经行替换,注意只要把歌曲部分代码进行替换就可以了!!!
//《茉莉花》
FREQ_LIST DW 416,416,495,556,165,661,556 ;频率表
DW 495,495,556,495
DW 416,416,495,556,165,661,556
DW 495,495,556,495
DW 495,495,495,416,495
DW 556,556,495,0
TIME_LIST DB 4,2,2,2,2,2,2 ;时间表
DB 4,2,2,8
DB 4,2,2,2,2,2,2
DB 4,2,2,8
DB 4,4,4,2,2
DB 4,4,4,12
DATA ENDS
//《我和我的祖国》
FREQ_LIST1 DW 495,556,495,441,393,350,330,248
DW 330,393,661,624,556,393,495,495
DW 556,624,556,495,441,393,393,278
DW 312,278,248,495,330,350,393,393,0
TIME_LIST1 DB 4,2,2,4,2,2,8,8
DB 3,3,3,3,3,3,8,8
DB 3,3,3,3,3,3,8,8
DB 3,3,3,3,3,3,8,8
//《虫儿飞》
FREQ_LIST DW 330,330,330,350,393,330,294 ;频率表
DW 262,262,262,294,330,330,248,248
DW 221,330,294,221,330,294
DW 221,330,294,262
DW 262,0 ; 时间表
TIME_LIST DB 4,2,2,4,4,8,8
DB 4,2,2,4,4,6,2,8
DB 4,4,8,4,4,8
DB 4,4,6,2
DB 16
频率表和时间表是一一对应的,频率表的最后一项为 0,作为重复的标志。根据频率表中的频率算出对应的计数初值,然后依次写入 8254 的计数器将时间表中相对时间值带入延时程序来得到音符演奏时间。实验参考程序流程如图 3. 所示电子发声电路图如图 3.2 所示。
实验步骤如下:
1.参考图 3.3 所示连接实验线路。
2.编写实验程序(例程文件名为: CSOUND.C),经编译、连接无误后装入系统
3.运行程序,听扬声器发出的音乐是否正确。