一、实验目的:
学习用8254定时/计数器使蜂鸣器发声的编程方法。
二、实验内容与要求:
根据实验提供的音乐频率表和时间表,编写程序控制8254,使其输出连接到扬声器上能发出相应的乐曲。
三、实验环境:
PC机一台,TD-PITE实验装置一套。
四、实验步骤:
1.参考图4.10.3所示连接实验线路。
2.编写实验程序(例程文件名为:SOUND.ASM),经编译、连接无误后装入系统。
3.运行程序,听扬声器发出的音乐是否正确。
4.固化程序,然后脱机运行程序。
五、电路连接
六、代码设计
1. 关于8254工作方式
MOV DX, MY8254_MODE ;初始化8254工作方式
MOV AL, 36H ;定时器0、方式3
也就是00 11 011 0 计数器0,锁存计数器,工作方式3,二进制数
2.关于频率表和时间表
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
一个音符对应一个频率,将对应一个音符频率的方波通到扬声器上,就可以发出这个音符的声音。将一段乐曲的音符对应频率的方波依次送到扬声器,就可以演奏出这段乐曲。利用8254 的方式 3——“方波发生器”,将相应一种频率的计数初值写入计数器,就可产生对应频率的方波。计数初值的计算如下:
计数初值 = 输入时钟 ÷ 输出频率
例如输入时钟采用1MHz,要得到800Hz的频率,计数初值即为1000000÷800。
这里需要按照音符和频率对照表格:和音乐的简谱对照输入相应数字即可,为0截止。
简谱:
音符和频率对照表格:
频率表和时间表是一一对应的,频率表的最后一项为0,作为重复的标志。根据频率表中的频率算出对应的计数初值,然后依次写入8254的计数器。将时间表中相对时间值带入延时程序来得到音符演奏时间。
七、实验现象
这个主要是听音乐的准确度,现象是看不出来的。
附录 源代码
;=================================================================
; 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 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
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