微机与接口技术课程设计音乐发生器实验Word格式文档下载.docx
- 文档编号:16832647
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:16
- 大小:99.56KB
微机与接口技术课程设计音乐发生器实验Word格式文档下载.docx
《微机与接口技术课程设计音乐发生器实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《微机与接口技术课程设计音乐发生器实验Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
对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;
3'
bb[i]=0x7;
4'
bb[i]=0xf;
5'
bb[i]=0x1f;
6'
bb[i]=0x3f;
case'
7'
bb[i]=0x7f;
}
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++;
//获取下一个音频灯闪烁的数目
}//歌曲结束或按了任意键
//再次关闭扬声器
setvect(INTR,oldhandler);
//恢复原中断向量
return0;
在Playing函数里面,首先做的是保存原中断向量,转载新的中断向量。
然后是就是初始化8255和8253,在通过一个while循环,把歌曲中的每个音符相应的频率取出来放到8253的计数器2中计数。
然后开扬声器播放音乐,在播放音乐的时候,把从文件中读到的音符的闪烁频率送到8255的PB口中。
实现闪烁效果。
直到音乐结束,灯全灭。
最后关闭扬声器,恢复中段向量。
在main函数中,我们编写了一个界面,
voidmain(void)
charc;
chars[20];
printf("
nowplaymusic!
\n"
strikeESCtoexit\n"
musicmenu:
meijiujiakafei--------------------------------------1\n"
yifenqian-------------------------------------------2\n"
xiangshuiyoudu--------------------------------------3\n"
tianheihei------------------------------------------4\n"
exit------------------------------------------------5\n"
pleasechoosethesongyouwanttosing\n"
while(c!
='
){
c=getchar();
if(c=='
s[]=“d:
\\temp.txt”;
pr=read(s);
pf=nFreq1;
pt=nTimeDelay1;
Playing();
}
elseif(c=='
\\temp1.txt”;
pf=nFreq2;
pt=nTimeDelay2;
\\temp2.txt”;
pf=nFreq3;
pt=nTimeDelay3;
}
\\temp3.txt”;
pf=nFreq4;
pt=nTimeDelay4;
}}
按照输出来的提示信息,输入相应的歌曲的代号来收听你想听的音乐.比如输入一你就会听到动听的美酒加咖啡的美妙旋律,当你按下ESC键时,就是结束当前所听的歌曲,当按下5时则推出程序
4.3具体代码实现
#include<
dos.h>
//getvect();
setvect();
conio.h>
//kbhit();
stdlib.h>
//exit(0);
stdio.h>
//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;
//声明灯光数目数组与指针
{(*pTimeDelay)--;
oldhandler();
//调用原例程
intPlaying(void);
inti;
FILE*fp;
intaa[300],*pp;
fp=fopen(p,"
while((aa[i]=fgetc(fp))!
{
switch(aa[i])
{
case'
}
i++;
pp=dd;
returnpp;
pleasechoosethesongyouwanttosing\
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 接口 技术 课程设计 音乐 发生器 实验