电子发声设计实验

一、实验目的:

学习用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

1电子发声设计实验 1.1实验内容 根据实验提供的音乐频率表和时间表,编写程序控制8254,使其输出连接到扬声器上 能发出相应的乐曲。 1.2实验原理 一个音符对应一个频率,将对应一个音符频率的方波通到扬声器上,就可以发出这个 音符的声音。将一段乐曲的音符对应频率的方波依次送到扬声器,就可以演奏出这段乐 曲。利用8254的方式3—"方波发生器",将相应一种频率的计数初值写入计数器,就可产 生对应频率的方波。计数初值的计算如下: 计数初值 = 输入时钟 ÷ 输出频 例如输入时钟采用1MHz,要得到800Hz的频率,计数初值即为1000000÷800。音符与频 率对照关系如表1所示。对于每一个音符的演奏时间,可以通过软件延时来处理。首先确 定单位延时时间程序(根据CPU的频率不同而有所变化)。然后确定每个音符演奏需要几 个单位时间,将这个值送入DL中,调用DALLY子程序即可。 下面提供了乐曲《友谊地久天长》实验参考程序。 频率表和时间表是一一对应的,频率表的最后一项为0,作为重复的标志。根据频率 表中的频率算出对应的计数初值,然后依次写入8254的计数器。将时间表中相对时间值 带入延时程序来得到音符演奏时间。实验参考程序流程如图1所示。 1.3实验步骤 1. 参考图2所示连接实验线路; 2. 编写实验程序,经编译、连接无误后装入系统; 3. 运行程序,听扬声器发出的音乐是否正确。 1.4程序代码 1.4.1第一个程序 IOY0 EQU 0600H MY8254_COUNT0 EQU IOY0+00H ;8254计数器0端口地址 MY8254_COUNT1 EQU IOY0+02H ;8254计数器1端口地址 MY8254_COUNT2 EQU IOY0+04H ;8254计数器2端口地址 MY8254_MODE EQU IOY0+06H ;8254控制寄存器端口地址 STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS DATA SEGMENT FREQ_LIST DW 196,262,262,262,330,294,262,294,330,262,262,330,393 ;频率表 DW 441,441,393,330,330,262,294,262,294,330,262,221,221,196 DW 262,441,393,330,330,262,294,262,294,441,393,330,330,393 DW 441,525,393,330,330,262,294,262,294,330,262,221,221,196,262,0 TIME_LIST DB 4, 6, 2, 4, 4, 6, 2, 4, 4, 6, 2, 4, 4 ;时间表 DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4, 6, 2, 4, 4 DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4, 6, 2, 4, 4 DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4, 6, 2, 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,0FF0H D2: DEC AX JNZ D2 LOOP D1 DEC DL JNZ D0 RET DALLY ENDP CODE ENDS END START 1.4.2第二个程序 【实验内容】 按下键盘上的数字键1—7,使得扬声器发出音乐乐谱的1-7音 【实验代码】 IOY0 EQU 0600H MY8254_COUNT0 EQU IO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钻仰弥坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值