唐都8254电子发声实验

第一个是实验指导书上自带的《友谊天长地久》

IOYO	EQU	06C0H
MY8254_COUNT0	EQU	IOYO+00H
MY8254_COUNT1	EQU	IOYO+02H
MY8254_COUNT2	EQU	IOYO+04H
MY8254_MODE		EQU	IOYO+06H

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

CODE	SEGMENT
		ASSUME	CS:CODE,	DS:DATA
START:	MOV AX,	DATA
		MOV DS,	AX					;装载数据
		MOV DX,	MY8254_MODE			;写入控制字00110110,通道0,先写入高位,方式3,二进制
		MOV AL,	36H
		OUT	DX,	AL
BEGIN:	MOV SI,	OFFSET	FREQ_LIST	;取音谱首地址
		MOV DI,	OFFSET	TIME_LIST	;取节拍首地址
PLAY:	MOV DX,	0FH					;输入时钟频率
		MOV AX,	4240H
		DIV	WORD	PTR	[SI]		;依次计算初值:0F4240/音谱频率
		MOV	DX,MY8254_COUNT0		;选择计数器0
		OUT	DX,	AL					;装入技术初值
		MOV AL,	AH
		OUT DX, AL
		MOV DL, [DI]				;取出节拍
		CALL DELAY					;调用延时程序
		ADD SI, 2					
		INC DI
		CMP WORD	PTR	[SI],0		;判断是否到最后一个音
		JE	BEGIN
		JMP	PLAY
DELAY	PROC						;延时程序,延时dl*单位时间
D0:		MOV	CX,	0010H				;loop 16次
D1:		MOV AX, 0F00H				;jnz  15*256次
D2:		DEC AX
		JNZ	D2
		LOOP	D1
		DEC	DL
		JNZ D0
		RET
DELAY	ENDP
CODE	ENDS
		END	START
		

其实讲道理,老师要我们修改歌曲主要就是将FREQ_LIST和TIME_LIST改变成你要改的歌曲。于是下面先来一个两只老虎的。

IOYO            EQU 06C0H
MY8254_COUNT0   EQU IOYO+00H
MY8254_COUNT1   EQU IOYO+02H
MY8254_COUNT2   EQU IOYO+04H
MY8254_MODE     EQU IOYO+06H
STACK1   SEGMENT STACK
         DW 256 DUP(?)
STACK1   ENDS
DATA SEGMENT
FREQ_LIST  DW 330,371,416,330
           DW 416,441,495
           DW 495,556,495,441,416,330
           DW 495,556,495,441,416,330
           DW 330,248,330
           DW 330,248,330,0
          
TIME_LIST  DB 4,4,4,4
           DB 4,4,4,4
           DB 4,4,8
           DB 4,4,8
           DB 2,2,2,2,4,4
           DB 2,2,2,2,4,4
           DB 4,4,8
           DB 4,4,8
DATA ENDS

CODE SEGMENT
          ASSUME CS:CODE,DS:DATA
START:    MOV AX,DATA
          MOV DS,AX
          MOV DX,MY8254_MODE
          MOV AL,36H
          OUT DX,AL
BEGIN:    MOV SI,OFFSET FREQ_LIST
          MOV DI,OFFSET TIME_LIST
PLAY:     MOV DX,0FH
          MOV AX,4240H
          DIV WORD PTR [SI]
          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

再来一个爱情买卖。

IOYO            EQU 06C0H
MY8254_COUNT0   EQU IOYO+00H
MY8254_COUNT1   EQU IOYO+02H
MY8254_COUNT2   EQU IOYO+04H
MY8254_MODE     EQU IOYO+06H
STACK1   SEGMENT STACK
         DW 256 DUP(?)
STACK1   ENDS
DATA SEGMENT
FREQ_LIST  DW 330,441,525,525,330,441,525
           DW 495,441,495,441,393,330
           DW 294,294,294,221,294,330,393
           DW 330,495,495,393,330
           DW 330,441,525,525,331,441,525
           DW 661,589,661,589,525,589
           DW 661,661,589,525,589,589,525,495
           DW 393,330,393,441,441,0
TIME_LIST  DB 4,4,4,4,4,4,8
           DB 4,2,2,4,4,16
           DB 4,4,4,4,4,4,8
           DB 4,4,4,4,16
           DB 4,4,4,4,4,8
           DB 4,2,2,4,4,16
           DB 6,2,4,4,6,2,4,4
           DB 4,4,4,4,16
DATA ENDS

CODE SEGMENT
          ASSUME CS:CODE,DS:DATA
START:    MOV AX,DATA
          MOV DS,AX
          MOV DX,MY8254_MODE
          MOV AL,36H
          OUT DX,AL
BEGIN:    MOV SI,OFFSET FREQ_LIST
          MOV DI,OFFSET TIME_LIST
PLAY:     MOV DX,0FH
          MOV AX,4240H
          DIV WORD PTR [SI]
          MOV DX,MY8254_COUNT0
          OUT DX,AL
          MOV AL,AH
          OUT DX,AL
          MOV DL,[DI]
          CALL DELAY
          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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值