1、1实验课程名称:监测控制系统应用 实验五实验项目名称:音乐发生器的设计与实现 实验成绩: 实验者: 专业班级: 电信 130 班 同组者: 111 实验日期: 周四 34 节课 一实验内容掌握单片机片内定时器应用设计技巧,会确定定时器的时间常数,能够进行定时器的初始化编程。掌握利用微处理器设计音乐发生器的方法二探究内容1.利用定时器产生特定的频率信号,设计一个音乐发生器,可以循环播放音乐,候选乐曲 3 首。2.用按键选择播放哪一首音乐。有音乐播放的启停键。3.用 8 个 LED 灯随节拍闪烁(选做)4扩展内容(选做) ,用 7 个按键分别产生音阶 1、2、3、4、5、6、7,按一下键,即产生一
2、个节拍的相应音符,也就是设计电子琴。3实验设计:1.设计要求具体任务:(1)设计一个音乐发生器,候选音乐有三种,K1 可启动停止音乐,K2 用于选择音乐段;(2)用 proteous 仿真电路,保证设计的正确性;(3) 基于开发板完成实物制作。2. 探究内容:(1)如何利用音阶计算定时器的时间常数?(2)音乐声音的洪亮稳定如何保证?(3)节拍如何实现?23、实验设计:1.设计音乐发生器的基本任务的基本任务:(1)研究产生音阶 1、2、3、4、5、6、7 的方法,计算 7 个音阶对应的时间常数(2)设计产生单首乐曲循环的软件,调试后下载到开发板(3) 设计产生 3 首乐曲的音乐发生器,用按键选择
3、循环的单曲,调试后下载到开发板,运行。2.相关知识介绍2.3 音阶对应频率计数初值的计算单片机的振荡频率为 fosc12MHz ,通过定时器 T0 溢出后对 P3.0 口取反产生方波,故定时器溢出时间为 1/2f 。由: , 则定时初值为:noscnfX21)2(16 1624oscnnfX以音阶“1”为例:f523 Hz,则 T1/f 定时初值:6161604582423oscnnf FCH用同一方法可求出其它音阶所对应的频率定时初值,将其制表放在程序中,通过查表向定时器 T0 装入所要求的定时初值,即可产生某一音阶所对应的频率的方波信号。C 调的音阶及其频率、在单片机中的定时初值对应如下:
4、四原理图1.音乐播放器原理图3因为开发板上面的蜂鸣器为无源蜂鸣器,所以设计时要适应开发板的情况进行设计。K1、K2 按键用来进行上一曲和下一曲的选择,K3 为暂停/开始按键,P2.0 接蜂鸣器,P1 口接 LED 灯,用 LED 灯显示节拍。2.电子琴原理图上面七个键按下分别发出哆嘞咪发嗦啦嘻的音,第八个按键选择音调的高低。最下面的按键用来控制使用和暂停。4五实验结果音乐播放器仿真和实物都能正常的播放音乐,并且能够实现上一曲、下一曲的选择,并且有暂停和播放的功能,电子琴也能够正常发音,可以演奏音乐。5六、结果分析及总结(1)如何利用音阶计算定时器的时间常数?单片机的振荡频率为 fosc12MH
5、z ,通过定时器 T0 溢出后对 P3.0 口取反产生方波,故定时器溢出时间为 1/2f 。由: , 则定时初值为:noscnfX21)2(16 1624oscnnfX以音阶“1”为例:f523 Hz,则 T1/f 定时初值:61616045843oscnnf FCH用同一方法可求出其它音阶所对应的频率定时初值,将其制表放在程序中,通过查表向定时器 T0 装入所要求的定时初值,即可产生某一音阶所对应的频率的方波信号。(2)节拍如何实现?取乐曲节拍的长度为 0.4s ,即 1 拍0.4s ,由定时器 T1 控制延时。设置定时器T1 的定时中断 T50ms ,采用定时方式 1。由: ,则定时初值
6、X3C0BHfXosc12)(16因此 1 拍0.4s8*50ms,即通过定时器 T1 的定时中断 8 次,产生 8*50ms 的定时,就可以满足 1 节拍的定时要求。以此类推,通过定时中断 N 次,可产生 N*50ms 的定时以满足 1/4 拍、1/2 拍、1 拍、2 拍等不同节拍的定时要求。由此可知,节拍值只能是整数值。(3)音乐声音的洪亮稳定如何保证?6这里的“源”不是指电源。而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。 而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用 2K5K 的方波去驱动它。 此次设计初,由于没意识到蜂鸣器驱动分为有源驱动和无
7、源驱动,在使用网上的乐谱和相应的函数设计音乐播放器时,不能正确产生音乐,后来查资料才发现有无源和有源之分,有源和无源蜂鸣器的发声原理不同,故其乐谱会有所不同。乐谱可以放在一个乐谱表中,通过查表来实现音乐的播放,要想循环播放一首歌,可以加一句查询语句,因为一条语句的执行时间非常短,对乐曲的演奏没有影响,在判断乐曲播放完后,继续回到乐曲开始,便可实现循环播放。附录:音乐播放器程序#include /*-硬件端口定义-*/sbit SPK=P20; /定义音乐输出端口sbit key1=P32; /定义按键 用于 暂停sbit key2=P33; /定义按键 用于 切换unsigned char W
8、=0,T; /用于选择音乐unsigned char Timer0_H,Timer0_L,Time;void delay5ms(void) /误差 0usunsigned char a,b;for(b=185;b0;b-)for(a=12;a0;a-);void delay500ms(void) /误差 0usunsigned char a,b,c;7for(c=205;c0;c-)for(b=116;b0;b-)for(a=9;a0;a-);/世上只有妈妈好 数据表 音谱,高中低音,音长code unsigned char MUSIC102= 6,2,3, 5,2,1, 3,2,2, 5,2
9、,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, 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
10、,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,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,
11、 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, 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
12、,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,83,2,1, 2,2,2, 5,1,1, 6,1,1, 5,1,1, 1,2,1, 1,2,1,5,1,1, 1,2,1, 1,2,1, 1,2,2, 1,2,1, 1,2,1, 5,1,2,1,2,1, 6,1,1, 5,1,1, 3,1,1, 2,1,1, 1,1,2, 3,1,1,5,1,1,
13、 5,1,2, 5,1,1, 3,1,1, 6,1,1, 6,1,1, 1,2,1,6,1,1, 6,1,1, 6,1,1, 6,1,1, 5,1,1, 1,2,2, 1,2,1,1,2,1, 1,2,1, 6,1,1, 1,2,1, 6,1,1, 5,1,2, 0,2,1,3,1,1, 6,1,1, 1,2,1, 6,1,1, 5,1,1, 3,1,1, 2,1,1,3,1,1, 5,1,1, 5,1,2, 5,1,1, 3,1,1, 6,1,1, 6,1,1,1,2,1, 6,1,1, 6,1,1, 6,1,1, 6,1,1, 5,1,1, 1,2,2,1,2,1, 1,2,1, 1,2,
14、1, 6,1,1, 6,1,1, 1,2,1, 2,2,2,0,2,1, 5,1,1, 2,2,1, 5,2,1, 2,2,2, 5,2,1, 5,2,2,5,2,1, 5,2,1, 5,2,1, 3,2,1, 2,2,1, 1,2,1, 1,2,2,6,1,1, 6,1,1, 1,2,1, 6,1,1, 1,2,1, 2,2,1, 2,2,1,2,2,1, 2,2,1, 2,2,1, 1,2,1, 3,2,1, 2,2,1, 2,2,8,3,2,1, 3,2,2, 3,2,1, 3,2,2, 2,2,2, 1,2,1, 1,2,2,1,2,1, 2,2,1, 1,2,1, 6,1,1, 5,
15、1,1, 5,1,1, 5,1,2,5,1,1, 6,1,1, 5,1,1, 2,2,1, 3,2,1, 1,2,8, 1,2,1,5,1,2, 1,2,1, 6,1,1, 5,1,1, 3,1,1, 2,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,
16、; /1,2,3,4,5,6,7,8,i/ 音阶频率表 低八位code unsigned char FREQL=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 t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0255 这里使用晶振 12M,
17、精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS -*/void DelayUs2x(unsigned char t) while(-t);9/*-mS 延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0255 这里使用晶振 12M,精确延时请使用汇编-*/void DelayMs(unsigned char t) while(t-)/大致延时 1mSDelayUs2x(245);DelayUs2x(245);/*-节拍延时函数各调 1/4 节拍时间:调 4/4 125ms调 2/4 250ms调 3/4
18、187ms-*/void delay(unsigned char t)unsigned char i;for(i=0;it;i+)DelayMs(250);TR0=0;/*-定时器 0 中断-*/void TIM0_ISR() interrupt 1TR0=0; SPK=!SPK;TH0=Timer0_H;TL0=Timer0_L;TR0=1;/*-歌曲处理函数-*/void Song()10TH0=Timer0_H;/赋值定时器时间,决定频率TL0=Timer0_L;TR0=1; /打开定时器delay(Time); /延时所需要的节拍 /*-主函数-*/void led(unsigned
19、char a);void main(void)unsigned int i;unsigned char k;TMOD|=0x01; /置定时器 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;i100;i=i+3) /音乐数组长度 ,唱完从头再来led(MUSICi);k=MUSICi+7*MUSICi+1-1;/去音符振荡频率所需数据Timer0_H=FREQHk;Timer0_L=FREQLk;Time=MUSICi+2; /节拍时长/ i=i+3;Song();