E7设计音乐发生器实验文档在线提供.docx

上传人:b****5 文档编号:5970855 上传时间:2023-01-02 格式:DOCX 页数:16 大小:100.19KB
下载 相关 举报
E7设计音乐发生器实验文档在线提供.docx_第1页
第1页 / 共16页
E7设计音乐发生器实验文档在线提供.docx_第2页
第2页 / 共16页
E7设计音乐发生器实验文档在线提供.docx_第3页
第3页 / 共16页
E7设计音乐发生器实验文档在线提供.docx_第4页
第4页 / 共16页
E7设计音乐发生器实验文档在线提供.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

E7设计音乐发生器实验文档在线提供.docx

《E7设计音乐发生器实验文档在线提供.docx》由会员分享,可在线阅读,更多相关《E7设计音乐发生器实验文档在线提供.docx(16页珍藏版)》请在冰豆网上搜索。

E7设计音乐发生器实验文档在线提供.docx

E7设计音乐发生器实验文档在线提供

音乐发生器实验

目录

1前言2

2需求分析2

2.1原理2

2.2要求2

2.3任务2

2.4运行环境2

2.5开发工具2

3概要设计3

3.1系统流程图:

3

3.2音符文件读取程序流程图3

3.3播放子程序4

3.4延时子程序4

4详细设计5

4.1歌曲编排5

4.2分析和设计5

4.3具体代码实现8

5课程设计的总结与体会13

6致谢13

7参考资料13

 

1

前言

编写一个程序来初始化8253定时/计数器和8255并行通信接口芯片。

通过接口控制音乐发声器的播放和灯光的闪烁,实现通过运行在MFDI平台运行程序对硬件电路的控制。

2需求分析

2.1原理

编写程序对8253和8255芯片进行初始化,按照音符来设定频率和8253定时/计数器的延时时间。

对8255芯片pc0和pc6口的置0和1来控制扬声器的开关,对pc4口的置0和1控制LED灯的闪烁。

2.2要求

(1)熟悉电路,理解各个元件之间的控制流程。

(2)熟悉MFDI平台的运行环境。

(3)熟练掌握C语言,调用中断子程序和端口函数对端口进行读写数据的操作。

(4)理解乐谱知识,熟悉音频转换表和节拍的延长时间

2.3任务

(1)曲谱转换

(2)分析电路图

(3)画出程序流程图

(4)编写代码

(5)程序分析与调试

(6)测试

2.4运行环境

(1)WINDOWS2000/XP系统

(2)MFDI实验平台

(3)VC编译环境

2.5开发工具

C语言

3概要设计

3.1系统流程图(如图3.1):

 

图3.1系统流程图

3.2音符文件读取程序流程图(如图3.2):

 

图3.2音符文件读取流程图

3.3播放子程序流程图(如图3.3):

 

图3.3播放流程图

3.4延时子程序流程图(如图3.4):

 

图3.4延时流程图

4详细设计

4.1歌曲编排

根据歌曲的音符来获取它的频率和延时时间,具体介绍请参考《音乐发声器-音乐篇》

4.2分析和设计

在程序的开头部分是声明了四首歌曲的频率和延时时间然后分别定义了指向频率数组和延时数组的指针,

voidinterrupt(*oldhandler)(__CPPARGS);

voidinterrupthandler(__CPPARGS)

{

(*pTimeDelay)--;//延时点数减一

oldhandler();//调用原例程}

这个函数表示的是调用的延时子程序。

然后声明了4个Playing函数,来调用4首歌的播放子程序。

下面是编写的4个read函数,分别是从文件里读出4首歌的音符。

通过转换表转换成16进制的数字(如表4.1)。

表4.1音符——灯光闪烁频率表

音符

1

2

3

4

5

6

7

灯光闪烁频率

0x1

0x3

0x7

0xf

0x1f

0x3f

0x7f

说明当音符为‘1’时,相应的闪烁一个灯为0x1,音符为‘2’时,相应的闪烁两个灯为0x3,依次规律类推。

int*read(char*p)

{inti;

FILE*fp;

intaa[300],*pp;

fp=fopen(p,"r");

while((aa[i]=fgetc(fp))!

=-1)

{switch(aa[i])

{case'1':

bb[i]=0x1;break;

case'2':

bb[i]=0x3;break;

case'3':

bb[i]=0x7;break;

case'4':

bb[i]=0xf;break;

case'5':

bb[i]=0x1f;break;

case'6':

bb[i]=0x3f;break;

case'7':

bb[i]=0x7f;break;}

i++;}

pp=dd;

returnpp;

}

这个程序主要是从文件中读取音符,然后把读到的音符通过音符——灯光闪烁频率表转化成相应的16进制。

读完了后放到一个数组中,然后返回一个数组指针。

intPlaying(void)

{

oldhandler=getvect(INTR);//保存原中断向量

setvect(INTR,handler);//装载新中断向量

outportb(0x303,0x90);//初始化8255

outportb(0x303,0x0c);//置pc6=0禁止8253通道2的gate引脚

outportb(0x303,0x00);//置pc0=0禁止7408

outportb(0x307,0xb6);//初始化8253

pFreq=pf;//取歌曲的第一个音频

pTimeDelay=pt;//取歌曲的第一个时延

while(*pFreq&&!

kbhit())

{

outportb(0x306,(unsignedchar)(CLK/*pFreq%256));

//先送低字节

outportb(0x306,(unsignedchar)(CLK/*pFreq/256));

//再送高字节

//以上置8253通道2的计数初值

outportb(0x303,0x01);

outportb(0x303,0x0d);//开扬声器

*pr=~*pr;

outportb(0x301,*pr);

//printf("%x",~*pr);

while(*pTimeDelay){};//等待延时到

outportb(0x301,0xff);

outportb(0x303,0x0c);

outportb(0x303,0x00);//关闭扬声器

pFreq++;//获取下一个音频

pTimeDelay++;//获取下一个延时

pr++;//获取下一个音频灯闪烁的数目

}//歌曲结束或按了任意键

outportb(0x303,0x0c);

outportb(0x303,0x00);//再次关闭扬声器

setvect(INTR,oldhandler);//恢复原中断向量

return0;

}

在Playing函数里面,首先做的是保存原中断向量,转载新的中断向量。

然后是就是初始化8255和8253,在通过一个while循环,把歌曲中的每个音符相应的频率取出来放到8253的计数器2中计数。

然后开扬声器播放音乐,在播放音乐的时候,把从文件中读到的音符的闪烁频率送到8255的PB口中。

实现闪烁效果。

直到音乐结束,灯全灭。

最后关闭扬声器,恢复中段向量。

在main函数中,我们编写了一个界面,

voidmain(void)

{

charc;

chars[20];

printf("nowplaymusic!

\n");

printf("strikeESCtoexit\n");

printf("musicmenu:

\n");

printf("meijiujiakafei--------------------------------------1\n");

printf("yifenqian-------------------------------------------2\n");

printf("xiangshuiyoudu--------------------------------------3\n");

printf("tianheihei------------------------------------------4\n");

printf("exit------------------------------------------------5\n");

printf("pleasechoosethesongyouwanttosing\n");

while(c!

='5'){

c=getchar();

if(c=='1'){

s[]=“d:

\\temp.txt”;

pr=read(s);

pf=nFreq1;

pt=nTimeDelay1;

Playing();

}

elseif(c=='2'){

s[]=“d:

\\temp1.txt”;

pr=read(s);

pf=nFreq2;

pt=nTimeDelay2;

Playing();

}

elseif(c=='3'){

s[]=“d:

\\temp2.txt”;

pr=read(s);

pf=nFreq3;

pt=nTimeDelay3;

Playing();}

elseif(c=='4'){

s[]=“d:

\\temp3.txt”;

pr=read(s);

pf=nFreq4;

pt=nTimeDelay4;

Playing();

}

}}

按照输出来的提示信息,输入相应的歌曲的代号来收听你想听的音乐.比如输入一你就会听到动听的美酒加咖啡的美妙旋律,当你按下ESC键时,就是结束当前所听的歌曲,当按下5时则推出程序

4.3具体代码实现

#include//getvect();setvect();

#include//kbhit();

#include//exit(0);

#include//printf();

#ifdef__cplusplus

#define__CPPARGS...

#else

#define__CPPARGS

#endif

shortintnFreq1[]={

//声明歌曲“美酒加咖啡”的音乐频率

196,165,196,220,262,294,330,392,392,440,330,294,262,330,294,294,330,392,330,294,262,220,262,196,220,262,220,196,165,196,220,262,196,196,165,196,220,262,294,330,294,262,294,330,294,330,392,440,392,330,294,262,294,294,330,392,330,294,262,220,196,220,262,294,330,392,294,196,330,294,262,262,294,330,392,294,196,330,294,262,0};

shortintnTimeDelay1[]={

//声明歌曲“美酒加咖啡”的音乐延时

12,4,4,4,4,4,32,8,4,4,4,4,4,4,32,12,4,8,8,4,4,2,2,4,16,8,4,4,4,4,4,4,32,8,4,4,8,8,4,2,2,4,4,16,4,4,4,4,4,4,4,4,32,12,4,8,8,4,4,4,4,16,4,4,4,4,4,4,4,4,32,4,4,4,

4,4,4,4,4,32

};

shortintnFreq2[]={

//声明歌曲“一分钱”的音乐频率

392,523,440,523,392,330,392,294,330,392,330,392,440,523,392,440,392,330,392,262,330,294,330,294,262,294,330,440,392,330,392,440,392,523,440,392,330,392,294,392,294,330,294,262,0};

shortintnTimeDelay2[]={

//声明歌曲“一分钱”的音乐延时

8,8,4,4,8,4,4,4,4,16,4,4,4,4,4,4,4,4,4,8,4,16,4,4,4,4,16,4,4,4,4,16,4,4,4,4,4,4,8,4,4,4,4,16};

shortintnFreq3[]={

//声明歌曲“香水有毒”的音乐频率

196,220,262,262,262,294,330,330,294,262,220,262,196,220,262,262,262,294,330,440,392,330,392,392,330,392,440,440,523,440,392,392,330,294,330,294,294,262,220,220,330,294,294,196,220,262,262,262,294,330,330,294,262,220,262,196,220,262,262,262,294,330,440,392,330,392,392,330,392,440,440,523,440,392,392,330,294,330,294,294,262,220,220,294,262,262,392,440,440,440,330,440,392,392,330,294,262,262,220,262,392,330,330,330,294,262,262,262,262,220,196,392,440,294,392,330,330,440,440,440,440,440,440,392,392,523,588,784,784,784,660,660,523,588,588,588,984,984,984,984,984,392,392,523,523,523,440,523,523,523,440,880,784,523,523,523,523,523,523,523,440,588,523,588,784,784,784,660,660,523,588,588,588,984,984,984,984,984,392,392,523,523,523,440,523,523,523,440,880,784,523,440,523,523,660,660,440,523,588,523,523,523,0};

shortintnTimeDelay3[]={

//声明歌曲“香水有毒”的音乐延时

4,4,4,4,4,4,4,4,4,4,4,12,4,4,4,4,4,4,8,6,2,4,12,8,4,4,12,4,8,8,4,4,8,8,8,4,8,

4,4,4,4,4,16,4,4,4,4,4,4,4,4,4,4,4,12,4,4,4,4,4,4,8,6,2,4,12,8,4,4,12,4,8,8,4,4,8,8,8,4,8,4,4,4,4,4,8,4,4,4,12,4,4,4,16,4,4,4,8,4,4,8,4,16,4,4,4,8,4,4,4,4,

4,4,4,4,12,4,4,4,4,4,8,4,16,16,4,4,4,4,4,4,8,4,4,16,16,4,4,4,4,4,4,4,4,16,16,

4,8,4,8,8,8,4,4,16,4,4,4,4,8,8,16,4,4,4,4,4,4,8,4,4,16,16,4,4,4,4,4,4,4,4,16,16,4,8,4,8,8,8,8,16,4,12,16,4,8,8,4,4,8,16,16};

shortintnFreq4[]={

//声明歌曲“天黑黑”的音乐频率

330,349,392,392,392,330,349,392,440,349,330,349,294,330,349,349,392,349,330,294,330,196,330,349,392,392,392,330,349,392,440,349,330,349,294,330,349,330,349,392,196,294,262,440,392,440,440,294,249,440,392,440,392,440,330,349,392,392,392,330,349,392,440,349,330,349,294,330,349,349,392,349,330,294,330,196,330,349,392,392,392,330,349,392,440,349,330,349,294,330,349,330,349,392,196,294,262,440,392,440,440,294,249,440,392,440,392,440,392,588,524,494,524,588,524,494,392,330,294,330,392,392,588,524,494,524,588,524,494,392,330,294,330,440,392,392,440,524,440,524,524,524,440,524,440,524,392,392,440,588,524,588,524,588,524,588,524,660,588,392,588,524,494,524,588,524,494,392,330,294,330,392,392,588,524,494,524,588,524,494,392,330,294,330,524,392,392,440,524,440,524,524,440,524,440,524,440,524,392,392,440,588,524,588,524,588,524,588,524,588,330,349,392,392,392,330,349,392,440,349,330,349,294,330,349,349,392,349,330,294,330,392,330,349,392,392,392,524,392,440,392,349,349,330,349,294,330,349,330,349,392,247,294,262,294,330,349,330,349,392,247,294,262,294,330,349,330,349,392,247,262,440,392,440,440,294,349,440,392,440,392,440,0};

shortintnTimeDelay4[]={

//声明歌曲“天黑黑”的音乐延时

4,4,8,8,8,4,4,4,4,4,4,8,4,4,8,8,4,4,4,4,8,8,4,4,8,8,8,4,4,4,4,4,4,8,4,4,8,4,4,8,

8,8,8,8,8,16,8,8,16,8,8,16,8,16,4,4,8,8,8,4,4,4,4,4,4,8,4,4,8,8,4,4,4,4,8,8,4,4,

8,8,8,4,4,4,4,4,4,8,4,4,8,4,4,8,8,8,8,8,8,16,8,8,16,8,8,16,8,16,4,4,4,4,4,4,4,4,

4,4,4,8,8,4,4,4,4,4,4,4,4,4,4,4,8,8,4,4,4,8,4,4,8,4,4,8,4,4,4,4,4,4,4,4,4,4,4,8,

4,4,4,4,4,4,4,4,4,4,4,4,4,4,8,8,4,4,4,4,4,4,4,4,4,4,4,8,8,4,4,4,4,4,8,4,4,4,4,8,

4,4,4,4,4,4,4,4,4,4,4,8,4,12,4,4,8,8,8,4,4,4,4,4,4,8,4,4,8,8,4,4,4,4,8,8,4,4,4,8,4,4,8,4,4,4,4,4,8,4,4,8,4,4,8,8,8,8,4,4,8,4,4,8,8,8,8,4,4,8,4,4,8,8,16,8,8,16,8,

8,16,8,8,16,8,16};

constunsignedlongCLK=1193180;//声明时钟频率

constunsignedcharINTR=0X1C;//声明中断号

shortint*pf;//声明指向歌曲频率的指针

shortint*pt;//声明指向歌曲延时的指针

shortint*pFreq;//声明音频指针

shortint*pTimeDelay;//声明延时指针

intbb[300],*pr;//声明灯光数目数组与指针

voidinterrupt(*oldhandler)(__CPPARGS);

voidinterrupthandler(__CPPARGS)

{(*pTimeDelay)--;//延时点数减一

oldhandler();//调用原例程

}

intPlaying(void);

int*read(char*p)

{

inti;

FILE*fp;

intaa[300],*pp;

fp=fopen(p,"r");

while((aa[i]=fgetc(fp))!

=-1)

{

switch(aa[i])

{

case'1':

bb[i]=0x1;break;

case'2':

bb[i]=0x3;break;

case'3':

bb[i]=0x7;break;

case'4':

bb[i]=0xf;break;

case'5':

bb[i]=0x1f;break;

case'6':

bb[i]=0x3f;break;

case'7':

bb[i]=0x7f;break;

}

i++;

}

pp=dd;

returnpp;

}

voidmain(void)

{

charc;

chars[20];

printf("nowplaymusic!

\n");

printf("strikeESCtoexit\n");

printf("musicmenu:

\n");

printf("meijiujiakafei--------------------------------------1\n");

printf("yifenqian-------------------------------------------2\n");

printf("xiangshuiyoudu--------------------------------------3\n");

printf("tianheihei------------------------------------------4\n");

printf("exit------------------------------------------------5\n");

printf("pleasechoosethesongyouwantto

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1