音乐发生器实验.doc_第1页
音乐发生器实验.doc_第2页
音乐发生器实验.doc_第3页
音乐发生器实验.doc_第4页
音乐发生器实验.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

音乐发生器实验目 录1前言22需求分析221原理222要求223任务224运行环境225开发工具23概要设计331系统流程图:332音符文件读取程序流程图333播放子程序434延时子程序44详细设计541歌曲编排542分析和设计543具体代码实现85课程设计的总结与体会136致谢137参考资料131 前言编写一个程序来初始化8253定时/计数器和8255并行通信接口芯片。通过接口控制音乐发声器的播放和灯光的闪烁,实现通过运行在MFDI平台运行程序对硬件电路的控制。2 需求分析21 原理编写程序对8253和8255芯片进行初始化,按照音符来设定频率和8253定时/计数器的延时时间。对8255芯片pc0和pc6口的置0和1来控制扬声器的开关,对pc4口的置0和1控制LED灯的闪烁。22 要求(1)熟悉电路,理解各个元件之间的控制流程。(2)熟悉MFDI平台的运行环境。(3)熟练掌握C语言,调用中断子程序和端口函数对端口进行读写数据的操作。(4)理解乐谱知识,熟悉音频转换表和节拍的延长时间23 任务(1)曲谱转换(2)分析电路图(3)画出程序流程图(4)编写代码(5)程序分析与调试(6)测试24 运行环境(1)WINDOWS2000/XP系统(2)MFDI实验平台(3)VC编译环境25 开发工具C语言3 概要设计31 系统流程图(如图3.1):YNYNYYNNN等于1?等于2?等于3?输入一个字符这个数字是否等于5?读文件子程序1播放子程序1读文件子程序2播放子程序2等于4?读文件子程序4播放子程序4读文件子程序3播放子程序3开始结束启动界面Y图3.1 系统流程图32 音符文件读取程序流程图(如图3.2):N文件是否存在?读取文件的字符N是否读完?打印报错信息开始结束结束y图3.2 音符文件读取流程图33 播放子程序流程图(如图3.3):取下一个音符的频率和时延开始初始化歌曲的频率及延时取歌曲的第一个音符的频率和时延初始化8255和8253置8255的pc6、pc0为0,再次关闭扬声器结束根据频率计算计数初值并送往8253置8255的pc6、pc0为1,使扬声器发声调用延时子程序置8255的pc6、pc0为0,关闭扬声器返回DOS是否按了任意键或遇到了音符频率的结束?YN图3.3 播放流程图34 延时子程序流程图(如图3.4):获取并保存中断ICH的中断向量音符的延时次数已到?向中断ICH装入新的中断向量恢复中断ICH原来的中断向量NY开始结束图3.4 延时流程图4 详细设计41 歌曲编排根据歌曲的音符来获取它的频率和延时时间,具体介绍请参考音乐发声器-音乐篇42 分析和设计在程序的开头部分是声明了四首歌曲的频率和延时时间然后分别定义了指向频率数组和延时数组的指针,void interrupt (*oldhandler)(_CPPARGS);void interrupt handler(_CPPARGS) (*pTimeDelay) - ; / 延时点数减一 oldhandler(); / 调用原例程 这个函数表示的是调用的延时子程序。然后声明了4个Playing函数,来调用4首歌的播放子程序。下面是编写的4个read函数,分别是从文件里读出4首歌的音符。通过转换表转换成16进制的数字(如表4.1)。表4.1 音符灯光闪烁频率表音符1234567灯光闪烁频率0x10x30x70xf0x1f0x3f0x7f说明当音符为1时,相应的闪烁一个灯为0x1,音符为2时,相应的闪烁两个灯为0x3,依次规律类推。int * read(char *p)int i; FILE * fp; int aa300,* pp; fp=fopen(p,r); while(aai= fgetc(fp)!=-1) switch(aai) case 1:bbi=0x1;break; case 2:bbi=0x3;break; case 3:bbi=0x7;break; case 4:bbi=0xf;break; case 5:bbi=0x1f;break; case 6:bbi=0x3f;break;case 7:bbi=0x7f;break;i+;pp = dd; return pp; 这个程序主要是从文件中读取音符,然后把读到的音符通过音符灯光闪烁频率表转化成相应的16进制。读完了后放到一个数组中,然后返回一个数组指针。int Playing(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, (unsigned char)(CLK / *pFreq % 256); / 先送低字节 outportb( 0x306, (unsigned char)(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); / 恢复原中断向量 return 0;在Playing函数里面,首先做的是保存原中断向量,转载新的中断向量。然后是就是初始化8255和8253,在通过一个while循环,把歌曲中的每个音符相应的频率取出来放到8253的计数器2中计数。然后开扬声器播放音乐,在播放音乐的时候,把从文件中读到的音符的闪烁频率送到8255的PB口中。实现闪烁效果。直到音乐结束,灯全灭。最后关闭扬声器,恢复中段向量。在main函数中,我们编写了一个界面,void main(void) char c; char s20; printf(now play music!n); printf(strike ESC to exitn); printf(music menu:n); printf(meijiujiakafei-1n); printf(yifenqian-2n); printf(xiangshuiyoudu-3n); printf(tianheihei-4n); printf(exit-5n); printf(please choose the song you want to singn); while(c!=5)c = getchar();if(c=1)s = “d:temp.txt”;pr = read(s);pf = nFreq1;pt = nTimeDelay1;Playing();else if(c=2)s = “d:temp1.txt”;pr = read(s);pf = nFreq2;pt = nTimeDelay2;Playing();else if(c=3)s = “d:temp2.txt”;pr = read(s);pf = nFreq3;pt = nTimeDelay3;Playing();else if(c=4)s = “d:temp3.txt”;pr = read(s);pf = nFreq4;pt = nTimeDelay4;Playing();按照输出来的提示信息,输入相应的歌曲的代号来收听你想听的音乐.比如输入一你就会听到动听的美酒加咖啡的美妙旋律,当你按下ESC键时,就是结束当前所听的歌曲,当按下5时则推出程序43 具体代码实现#include /getvect(); setvect();#include /kbhit();#include /exit(0);#include /printf();#ifdef _cplusplus #define _CPPARGS .#else #define _CPPARGS#endifshort int nFreq1 = /声明歌曲“美酒加咖啡”的音乐频率 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;short int nTimeDelay1 = /声明歌曲“美酒加咖啡”的音乐延时 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;short int nFreq2 = /声明歌曲“一分钱”的音乐频率 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;short int nTimeDelay2 =/声明歌曲“一分钱”的音乐延时 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;short int nFreq3 = /声明歌曲“香水有毒”的音乐频率 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;short int nTimeDelay3 = /声明歌曲“香水有毒”的音乐延时 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;short int nFreq4 = /声明歌曲“天黑黑”的音乐频率 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;short int nTimeDelay4 = /声明歌曲“天黑黑”的音乐延时 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;const unsigned long CLK = 1193180; / 声明时钟频率const unsigned char INTR = 0X1C; / 声明中断号short int *pf; / 声明指向歌曲频率的指针short int *pt; / 声明指向歌曲延时的指针short int *pFreq; / 声明音频指针short int *pTimeDelay; / 声明延时指针int bb300,*pr; / 声明灯光数目数组与指针void interrupt (*oldhandler)(_CPPARGS);void interrupt handler(_CPPARGS) (*pTimeDelay) - ; / 延时点数减一 oldhandler(); / 调用原例程int Playing(void);int * read(char *p) int i; FILE * fp; int aa300,* pp; fp=fopen(p,r); while(aai= fgetc(fp)!=-1) switch(aai) case 1:bbi=0x1;break; case 2:bbi=0x3;break; case 3:bbi=0x7;break; case 4:bbi=0xf;break; case 5:bbi=0x1f;break; case 6:bbi=0x3f;break; case 7:bbi=0x7f;break; i+; pp = dd; return pp; void main(void) char c; char s20; printf(now play music!n); printf(strike ESC to exitn); printf(music menu:n); printf(meijiujiakafei-1n); printf(yifenqian-2n); printf(xiangshuiyoudu-3n); printf(tianheihei-4n); printf(exit-5n); printf(please choose the song you want to singn); while(c!=5)c = getchar();if(c=1)s = “d:temp.txt”;pr = read(s);pf = nFreq1;pt = nTimeDelay1;Playing();else if(c=2)s = “d:temp1.txt”;pr = read(s);pf = nFreq2;pt = nTimeDelay2;Playing();else if(c=3)s = “d:temp2.txt”;pr = read(s);pf = nFreq3;pt = nTimeDelay3;Playing();else if(c=4)s = “d:temp3.txt”;pr = read(s);pf = nFreq4;pt = nTimeDelay4;Playing();int Playing(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, (unsigned char)(CLK / *pFreq % 256); / 先送低字节 outportb( 0x306, (unsigned char)(CLK / *pFreq / 256); / 再送高字节

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论