音乐发生器的设计与实现_第1页
音乐发生器的设计与实现_第2页
音乐发生器的设计与实现_第3页
音乐发生器的设计与实现_第4页
音乐发生器的设计与实现_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、实验课程名称:监测控制系统应用实验项目名称:音乐发生器的设计与实现实验者:同组者: 一实验内容实验五实验成绩:专业班级:电信 130 班实验日期:周四 34节课掌握单片机片内定时器应用设计技巧,会确定定时器的时间常数,能够进行定时器掌握利用微处理器设计音乐发生器的方法二探究内容1 .利用定时器产生特定的频率信号,设计一个音乐发生器,可以循环播放音乐,候 选乐曲 3 首。2 .用按键选择播放哪一首音乐。有音乐播放的启停键。3 .用8 个 LED 灯随节拍闪烁(选做)4扩展内容(选做),用 7 个按键分别产生音阶1、 2、 3、 4、 5、 6、 7,按一下键,即产生一个节拍的相应音符,也就是设计

2、电子琴。三实验设计:1 .设计要求具体任务:( 1) 设计一个音乐发生器,候选音乐有三种,K1 可启动停止音乐,K2 用于选择音乐段;( 2)用proteous仿真电路,保证设计的正确性;( 3) 基于开发板完成实物制作。( . 探究内容:( 1)如何利用音阶计算定时器的时间常数?( 2)音乐声音的洪亮稳定如何保证?( 3)节拍如何实现?三、实验设计:1.设计音乐发生器的基本任务的基本任务:( 1)研究产生音阶1、 2、 3、 4、 5、 6、 7 的方法,计算7 个音阶对应的时间常数( 2)设计产生单首乐曲循环的软件,调试后下载到开发板( 3)设计产生3 首乐曲的音乐发生器,用按键选择循环的

3、单曲,调试后下载到开发板,运行。2.相关知识介绍2.3 音阶对应频率计数初值的计算单片机的振荡频率为fosc 12MHz ,通过定时器T0 溢出后对P3.0 口取反产生方波,故定时器溢出时间为1/2f 。由:(216 Xn) 121, 则定时初值为:Xn216foscnfosc2 fnn24fn12 10624 52364580 FC 44H以音阶“ 1”为例:f 523 Hz,则T 1/f定时初值:Xn 216fosc21624fn用同一方法可求出其它音阶所对应的频率定时初值,将其制表放在程序中,通过查表向定时器T0 装入所要求的定时初值,即可产生某一音阶所对应的频率的方波信号。C调的音阶及

4、其频率、在单片机中的定时初值对应如下:1. 音乐播放器原理图K1、 K2按键用来进行上一曲和下一曲的选择,K3为暂停/开始按键,P2.0 接蜂鸣器,P1 口接LED灯,用LED灯显示节拍。2. 电子琴原理图五实验结果音乐播放器仿真和实物都能正常的播放音乐,并且能够实现上一曲、下一曲的选六、结果分析及总结( 1)如何利用音阶计算定时器的时间常数?单片机的振荡频率为波,故定时器溢出时间为由: (216 Xn)12foscfosc 12MHz ,通过定时器T0 溢出后对P3.0 口取反产生方1/2f 。1 , 则定时初值为:Xn 216fosc2 fnn24fn以音阶“ 1”为例:f 523 Hz,

5、则T 1/ff12 106定时初值:Xn216 fosc21612 1064580 FC 44Hn24fn24 523用同一方法可求出其它音阶所对应的频率定时初值,将其制表放在程序中,通过查表向定时器 T0装入所要求的定时初值,即可产生某一音阶所对应的频率的方波信号。( 2)节拍如何实现?取乐曲节拍的长度为0.4s , 即 1 拍 0.4s , 由定时器T1 控制延时。设置定时器T1的定时中断T 50ms ,采用定时方式1。由: (216 X) 12 T ,则定时初值X 3C0BHfosc因此 1 拍0.4s 8*50ms,即通过定时器T1 的定时中断8 次,产生8*50ms 的定时,就可以满

6、足1 节拍的定时要求。以此类推,通过定时中断N 次,可产生N*50ms 的定时以满足 1/4 拍、 1/2 拍、 1 拍、 2 拍等不同节拍的定时要求。由此可知,节拍值只能是整数值。( 3)音乐声音的洪亮稳定如何保证?这里的 “源” 不是指电源。而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K5K的方波去驱动它。此次设计初,由于没意识到蜂鸣器驱动分为有源驱动和无源驱动,在使用网上的乐谱和相应的函数设计音乐播放器时,不能正确产生音乐,后来查资料才发现有无源和有源之分,有源和无源蜂鸣器的发声原理不同,故其乐谱会有

7、所不同。乐谱可以放在一个乐谱表中,通过查表来实现音乐的播放,要想循环播放一首歌,可以加一句查询语句,因为一条语句的执行时间非常短,对乐曲的演奏没有影响,在判断乐曲播放完后,继续回到乐曲开始,便可实现循环播放。附录:音乐播放器程序#include<reg52.h>/*硬件端口定义*/sbit SPK=P20; /定义音乐输出端口sbit key1=P32; /定义按键用于暂停sbit key2=P33; /定义按键用于切换unsigned char W=0,T;/用于选择音乐unsigned char Timer0_H,Timer0_L,Time;void delay5ms(void

8、)/误差0usunsigned char a,b;for(b=185;b>0;b-)for(a=12;a>0;a-);void delay500ms(void)/误差0usunsigned char a,b,c;for(c=205;c>0;c-)for(b=116;b>0;b-) for(a=9;a>0;a-);/世上只有妈妈好数据表音谱 ,高中低音 ,音长code unsigned char MUSIC102=6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2

9、,1,2,1,6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0;/送别数据表 音谱 ,高中低音,音长code unsigned char MUSIC1174=5,2,2,3,2,1,5,2,1,1,3,4,6,2,2,1,3,2,5,2,4,5,2,2,1,2,1,2,2,1,3,2,2,2,2,1,1,2,1,2,2,8,5,2,2,3,2,1,5,2,1,1,3,3,7,2,1,6,2,2,1,3,2,

10、5,2,4,5,2,2,2,2,1,3,2,1,4,2,3,7,1,1,1,2,8,6,2,2,1,3,2,1,3,4,7,2,2,6,2,1,7,2,1,1,3,4,6,2,1,7,2,1,1,3,1,6,2,1,6,2,1,5,2,1,3,2,1,1,2,1,2,2,8,5,2,2, 3,2,1,5,2,1,1,3,3, 7,2,1,6,2,2,1,3,2,5,2,4,5,2,2,2,2,1,3,2,1,4,2,3,7,1,1,1,2,8;/新年好 数据表音谱,高中低音,音长code unsigned char MUSIC290=1,2,1,1,2,1,1,2,2,5,1,2,3,2,1,

11、3,2,1,3,2,2,1,2,2,1,2,1,3,2,1,5,2,2,5,2,2,4,2,1,3,2,1,2,2,4,2,2,1,3,2,1,4,2,2,4,2,2,3,2,1,2,2,1,3,2,2,1,2,2,1,2,1,3,2,1,2,2,2,5,1,2,7,1,1,2,2,1,1,2,4;/童年数据表 音谱,高中低音,音长code unsigned char MUSIC3423=5,1,1,5,1,1,3,1,1,5,1,2,3,1,1,5,1,2,6,1,1,6,1,1,1,2,1,6,1,2,6,1,1,1,2,2,2,2,1,2,2,1,3,2,1,2,2,25,1,16,1,

12、15,1,11,2,1,1,2,1,5,1,1,1,2,11,2,11,2,21,2,11,2,1,5,1,2,1,2,1,6,1,15,1,13,1,12,1,1,1,1,2,3,1,1,5,1,1,5,1,25,1,13,1,16,1,1,6,1,1,1,2,1,6,1,1,6,1,16,1,16,1,15,1,11,2,2,1,2,1,1,2,1,1,2,16,1,11,2,16,1,15,1,2,0,2,1,3,1,1,6,1,11,2,16,1,15,1,13,1,1,2,1,1,3,1,1,5,1,15,1,25,1,13,1,16,1,1,6,1,1,1,2,1,6,1,16,1

13、,16,1,16,1,15,1,1,1,2,2,1,2,1,1,2,11,2,16,1,16,1,11,2,1,2,2,2,0,2,1,5,1,12,2,15,2,12,2,25,2,1,5,2,2,5,2,1,5,2,15,2,13,2,12,2,11,2,1,1,2,2,6,1,1,6,1,11,2,16,1,11,2,12,2,1,2,2,1,2,2,1,2,2,12,2,11,2,13,2,12,2,1,2,2,8,3,2,1,3,2,23,2,13,2,22,2,21,2,1,1,2,2,1,2,1,2,2,11,2,16,1,15,1,15,1,1,5,1,2,5,1,1,6,1,

14、15,1,12,2,13,2,11,2,8,1,2,1,5,1,2,1,2,16,1,15,1,13,1,12,1,1,1,2,6,0,2,2;/ 音阶频率表高八位code unsigned char FREQH=0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, ; /1,2,3,4,5,6,7,8,i/ 音阶频率表低八位code unsigned char F

15、REQL=0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B, 0x8F,0xEE,0x44,0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16, ;/1,2,3,4,5,6,7,8,i/*uS 延时函数,含有输入参数unsigned char ,无返回值tunsigned char 是定义无符号字符变量,其值的范围是0255 这里使用晶振12M ,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS*/void DelayUs2x(unsign

16、ed char t) while(-t);/*mS 延时函数,含有输入参数unsigned char ,无返回值tunsigned char 是定义无符号字符变量,其值的范围是0255 这里使用晶振12M ,精确延时请使用汇编*/void DelayMs(unsigned char t)while(t-)/大致延时1mSDelayUs2x(245);DelayUs2x(245);/*节拍延时函数各调 1/4 节拍时间:调 4/4 125ms调 2/4 250ms调 3/4 187ms*/void delay(unsigned char t)unsigned char i;for(i=0;i&l

17、t;t;i+)DelayMs(250);TR0=0;/*定时器 0 中断*/void TIM0_ISR() interrupt 1TR0=0;SPK=!SPK;TH0=Timer0_H;TL0=Timer0_L;TR0=1;/*歌曲处理函数*/void Song()TH0=Timer0_H;/赋值定时器时间,决定频率TL0=Timer0_L;TR0=1;/打开定时器delay(Time); /延时所需要的节拍/*主函数*/void led(unsigned char a);void main(void)unsigned int i;unsigned char k;TMOD|=0x01; /置定

18、时器0 工作方式1EA=1;/打开全局中断ET0=1;/打开定时器 0 中断EX0=1;/打开外部中断0中断IT0=1;/设置为下降沿中断EX1=1;/打开外部中断1中断IT1=1;/设置为下降沿中断PX1=1;/设置外部中断1为高优先级while(1)/i=0;if(W=0)T=W;for(i=0;i<100;i=i+3)/音乐数组长度,唱完从头再来led(MUSICi);k=MUSICi+7*MUSICi+1-1;/ 去音符振荡频率所需数据Timer0_H=FREQHk;Timer0_L=FREQLk;Time=MUSICi+2;/节拍时长/ i=i+3;Song();if(T!=W

19、) break;if(W=1)T=W;for(i=0;i<174;i=i+3)/音乐数组长度,唱完从头再来led(MUSIC1i);k=MUSIC1i+7*MUSIC1i+1-1;/ 去音符振荡频率所需数据Timer0_H=FREQHk;Timer0_L=FREQLk;Time=MUSIC1i+2;/节拍时长/ i=i+3;Song();if(T!=W) break;if(W=2)T=W;for(i=0;i<90;i=i+3)/音乐数组长度,唱完从头再来led(MUSIC2i);k=MUSIC2i+7*MUSIC2i+1-1;/ 去音符振荡频率所需数据Timer0_H=FREQHk

20、;Timer0_L=FREQLk;Time=MUSIC2i+2;/节拍时长/ i=i+3;Song();if(T!=W) break;if(W=3)T=W;for(i=0;i<423;i=i+3)/音乐数组长度,唱完从头再来led(MUSIC3i);k=MUSIC3i+7*MUSIC3i+1-1;/ 去音符振荡频率所需数据Timer0_H=FREQHk;Timer0_L=FREQLk;Time=MUSIC3i+2;/节拍时长/ i=i+3;Song();if(T!=W) break;/ 频谱函数void led(unsigned char a)switch(a)case 0:P1=0xf

21、f;break;case 1:P1=0x7f;break;case 2:P1=0x7e;break;case 3:P1=0x7c;break;case 4:P1=0x78;break;case 5:P1=0x70;break;case 6:P1=0x60;break;case 7:P1=0x40;break;case 8:P1=0x00;break;/ 外部中断0 中断服务程序用于暂停void zhongduan0() interrupt 0delay5ms(); /按键去抖if(!key1)while(!key1);/松手检测while(key1&&T=W); /检测按键是否

22、按下delay5ms();/按键去抖while(key1&&T=W); /检测按键是否按下while(!key1&&T=W); /松手检测/ 外部中断1 中断服务程序void zhongduan1() interrupt 2delay5ms(); /按键去抖if(!key2)if(W=3)W=0;elseW+;while(!key2);/松手检测delay500ms();电子琴程序#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint un

23、signed int sbit Beep=P10;/*子函数声明*/void Run();void PlayKey();void KeyScan();void KeyScan1();/*手动弹奏按键定义*/sbit key1=P20;sbit key2=P21;sbit key3=P22;sbit key4=P23;sbit key5=P24;sbit key6=P25;sbit key7=P26;sbit key8=P27;/* 播放模式下按键定义*/sbit s3=P35;/暂停/播放键uchar Th0,Tl0;uchar key=0;/按键代号uchar yinfu,jiepai,i,

24、j,m;uchar gaodi=0;uchar flag=0;/暂停、开始 uchar num;/全局变量uchar s1num;/暂停/播放键按下的次数 /歌曲音符/*uchar code MusicCode=0xfc,0x0b,0xfc,0x43,0xfc,0xab,0xfd,0x08,0xfd,0x33,0xfd,0x81,0xfd,0xc7,0xfe,0x05,0xfe,0x21,0xfb,0x8f,0xfb,0x03;*/uchar code MusicCode=0xfc,0x44,0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82, 0xfd,0xc8,

25、0xfe,0x06,0xfb,0x04,0xfb,0x90,0xfc,0x0c,0xfe,0x22,0xf9,0x5b,0xfa,0x15;/按键音符uchar code KeyCode=0xf8,0x8b,0xf9,0x5b,0xfa,0x14,0xfa,0x66,0xfb,0x03,0xfb,0x8f,0xfc,0x0b,/*低音 */0xfc,0x43,0xfc,0xab,0xfd,0x08,0xfd,0x33,0xfd,0x81,0xfd,0xc7,0xfe,0x05,/*中音*/0xfe,0x21,0xfe,0x55,0xfe,0x84,0xfe,0x99,0xfe,0xc0,0xf

26、e,0xe3,0xff,0x02/*高音*/;/* 使能中断*/void interrupt0() interrupt 0 /外部终端0flag=flag;/* 曲目选择外部中断*/void interrupt1() interrupt 2/外部终端1flag1=1;/* 延时子程序*/ void delay_1ms(uint i) uint k,x;for(x=0;x<i;x+)for(k=0;k<110;k+);/* 手动弹奏按键扫描子程序*/void KeyScan()if(key8=0)/如果 P2.2=0delay_1ms(5);if(key8=0)/while(!key8)gaodi+;if(gaodi>2)gaodi=0;else if(key1=0)delay_1ms(5);if(key1=0)while(!key1);key=1;else if(key2=0)delay_1ms(5);if(key2=0)while(!key2);key=2;else if(key3=0)delay_1ms(5

温馨提示

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

最新文档

评论

0/150

提交评论