资源描述:
《电子发声设计实验》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、1电子发声设计实验1.1实验内容根据实验提供的音乐频率表和时间表,编写程序控制8254,使其输出连接到扬声器上能发出相应的乐曲。1.2实验原理一个音符对应一个频率,将对应一个音符频率的方波通到扬声器上,就可以发出这个音符的声音。将一段乐曲的音符对应频率的方波依次送到扬声器,就可以演奏出这段乐曲。利用8254的方式3—“方波发生器”,将相应一种频率的计数初值写入计数器,就可产生对应频率的方波。计数初值的计算如下:计数初值=输入时钟÷输出频例如输入时钟采用1MHz,要得到800Hz的频率,计数初值即为1000000÷800。音符与频率对照关系如表1所示。对于每
2、一个音符的演奏时间,可以通过软件延时来处理。首先确定单位延时时间程序(根据CPU的频率不同而有所变化)。然后确定每个音符演奏需要几个单位时间,将这个值送入DL中,调用DALLY子程序即可。下面提供了乐曲《友谊地久天长》实验参考程序。频率表和时间表是一一对应的,频率表的最后一项为0,作为重复的标志。根据频率表中的频率算出对应的计数初值,然后依次写入8254的计数器。将时间表中相对时间值带入延时程序来得到音符演奏时间。实验参考程序流程如图1所示。1.3实验步骤1.参考图2所示连接实验线路;2.编写实验程序,经编译、连接无误后装入系统;3.运行程序,听扬声器发出
3、的音乐是否正确。1.4程序代码1.4.1第一个程序IOY0EQU0600HMY8254_COUNT0EQUIOY0+00H;8254计数器0端口地址MY8254_COUNT1EQUIOY0+02H;8254计数器1端口地址MY8254_COUNT2EQUIOY0+04H;8254计数器2端口地址MY8254_MODEEQUIOY0+06H;8254控制寄存器端口地址STACK1SEGMENTSTACKDW256DUP(?)STACK1ENDSDATASEGMENTFREQ_LISTDW196,262,262,262,330,294,262,294,330,
4、262,262,330,393;频率表DW441,441,393,330,330,262,294,262,294,330,262,221,221,196DW262,441,393,330,330,262,294,262,294,441,393,330,330,393DW441,525,393,330,330,262,294,262,294,330,262,221,221,196,262,0TIME_LISTDB4,6,2,4,4,6,2,4,4,6,2,4,4;时间表DB12,4,6,2,4,4,6,2,4,4,6,2,4,4DB12,4,6,2,4,4,
5、6,2,4,4,6,2,4,4DB12,4,6,2,4,4,6,2,4,4,6,2,4,4,12DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,MY8254_MODE;初始化8254工作方式MOVAL,36H;定时器0、方式3OUTDX,ALBEGIN:MOVSI,OFFSETFREQ_LIST;装入频率表起始地址MOVDI,OFFSETTIME_LIST;装入时间表起始地址PLAY:MOVDX,0FH;输入时钟为1MHz,1M=0F4240HMOVAX,4240H
6、DIVWORDPTR[SI];取出频率值计算计数初值,0F4240H/输出频率MOVDX,MY8254_COUNT0OUTDX,AL;装入计数初值MOVAL,AHOUTDX,ALMOVDL,[DI];取出演奏相对时间,调用延时子程序CALLDALLYADDSI,2INCDICMPWORDPTR[SI],0;判断是否到曲末?JEBEGINJMPPLAYDALLYPROC;延时子程序D0:MOVCX,0010HD1:MOVAX,0FF0HD2:DECAXJNZD2LOOPD1DECDLJNZD0RETDALLYENDPCODEENDSENDSTART1.4.2
7、第二个程序【实验内容】按下键盘上的数字键1—7,使得扬声器发出音乐乐谱的1-7音【实验代码】IOY0EQU0600HMY8254_COUNT0EQUIOY0+00H;8254计数器0端口地址MY8254_COUNT1EQUIOY0+02H;8254计数器1端口地址MY8254_COUNT2EQUIOY0+04H;8254计数器2端口地址MY8254_MODEEQUIOY0+06H;8254控制寄存器端口地址STACK1SEGMENTSTACKDW256DUP(?)STACK1ENDSDATASEGMENTtable1DW262,294,330,340,39
8、3,441,495infodb0ah,0dh,"Pleaseinp