信阳企业网站开发,贵阳百度seo点击软件,商标注册号查询入口官网,php高级网站开发音乐盒 主要功能#xff1a;仿真原理图PCB图程序设计#xff1a;设计报告实物图资料清单#xff08;提供资料清单所有文件#xff09;#xff1a;资料下载链接#xff1a; 基于51单片机音乐盒仿真设计( proteus仿真程序原理图PCB报告讲解视频#xff09; 仿真图proteus … 音乐盒 主要功能仿真原理图PCB图程序设计设计报告实物图资料清单提供资料清单所有文件资料下载链接 基于51单片机音乐盒仿真设计( proteus仿真程序原理图PCB报告讲解视频 仿真图proteus 7.8及以上
程序编译器keil 4/keil 5
编程语言C语言
设计编号S0030
主要功能
本次课设是应用单片机原理和控制理论设计音乐演奏控制器的硬件电路并利用C语言进行程序设计。通过控制单片机内部的定时器来产生不同频率的方波驱动喇叭发出不同的音调的音乐在利用延迟来控制发音时间的长短。把乐谱转化成相应的定时常数就可以从发音设备中演奏出悦耳的音乐。
2 设计说明
2.1设计要求
(1)利用I/O口产生一定频率的方波驱动蜂鸣器发出不同的音调从而演奏乐曲
(2)可以实现歌曲顺序播放或单曲循环
(3)存储三首以上歌曲
2.2 附加功能
1用数码管显示当前播放曲目
2) LED花样彩灯随播放音符变换
3通过按键实现下一首歌的切换
以下为本设计资料展示图
仿真 开始仿真
开始仿真后用数码管显示当前播放曲目 LED花样彩灯随播放音符变换通过按键实现下一首歌的切换。通过拨动开关控制单循环还是全部循环。内置音乐《千年之恋》《寂寞沙洲冷》《七子之歌》《感恩的心》
原理图PCB图 程序设计 sbit key1P3^2; /*暂停键 */
sbit key2P3^3; /* 切换歌曲键*/
sbit fmP1^1; /*蜂鸣器口*/
sbit P1_7P1^7;
uchar count21; /*歌曲标志*/
uchar timeh,timel,i;uchar code DSY_table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x70};
uint code tone_delay_table[]{ 64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178};/*每个音符对应的延迟*/
uchar code huayang[]{0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x0f,0xf0,0x00};void delay_ms(uchar x) /*延迟函数*/
{uchar i;while(x--)for(i0;i120;i);
}uchar code qnzl[]{ /*千年之恋*/
0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,
0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,
0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,
0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,
0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,
0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,
0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
0x42,0x63,0x83,0x83,0x91,0x91,
0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,
0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff /*结束标志*/
};
uchar code jmszl[]{ /*寂寞沙洲冷*/
0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,
0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,
0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28,
0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52,
0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,
0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54,
0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,
0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,
0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34,
0x31,0x81,0x81,0x81,0x61,0x91,0x82,
0x51,0x51,0x51,0x51,0x31,0x61,0x53,
0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,
0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52,
0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,
0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,
0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,0xff /*结束标志*/
};
uchar code qizige[]{ /*七子之歌*/
0x54,0x32,0x52,0x32,0x54,0x62,0x52,0x32,0x62,0x54,
0x14,0x12,0x22,0x34,0x52,0x32,0x02,0x32,0x58,
0x52,0x52,0x62,0x52,0x32,0x54,0x52,0x62,0x52,0x82,0x62,0x58,
0x14,0x52,0x32,0x22,0x12,0x24,0x32,0x54,0x2,0x22,0x34,0x1f,0x18,
0x04,0x54,0xa4,0x92,0x81,0x62,0x52,0x54,0x62,0x64,0x52,0x62,0x81,0xa2,0x82,0x9c,
0x02,0x52,0xa4,0x92,0x81,0x62,0x52,0x54,0x62,0x64,0x52,0x64,0xa2,0x92,0x9f,
0xa4,0x92,0x81,0x62,0x52,0x54,0x84,0x62,0x52,0x32,0x22,0x14,
0x04,0x22,0x32,0x58,0x58,0x04,0x52,0x62,0x8f,
0xff /*结束标志*/
};
uchar code ganen[]{ /*感恩的心*/
0x12,0x14,0x22,0x32,0x54,0x32,0x84,0x72,0x62,0x54,
0x02,0x62,0x62,0x52,0x54,0x12,0x22,0x32,0x28,
0x12,0x14,0x22,0x32,0x54,0x32,0x84,0x92,0x82,0x54,
0x32,0x24,0x21,0x61,0x54,0x22,0x32,0x12,0x18,
0x22,0x24,0x12,0x24,0x11,0x21,0x34,0x32,0x21,0x31,0x34,
0x12,0x22,0x22,0x22,0x11,0x21,0x22,0x64,0x52,0x52,0x32,0x38,
0x31,0x52,0x51,0x52,0x31,0x51,0x58,0x31,0x82,0x81,0x82,0x31,0x61,0x68,
0x62,0x62,0x62,0x51,0x61,0x64,0x61,0x82,0x61,0x9c,
0x52,0xa4,0x92,0xa4,0x32,0x84,0x72,0x64,0x62,0x94,0x82,0x94,
0x61,0x81,0x92,0x91,0x91,0x92,0x81,0xa1,0xa2,0x92,0x94,
0x52,0xa4,0x92,0xa4,0x32,0x84,0x72,0x64,
0x52,0x62,0x81,0x81,0x82,0x92,0xa2,0x94,0x82,0x72,0x82,0x88,
0xff /*结束标志*/
};
/*简谱音调对应的定时器初值*/
/*适合11.0592M的晶振*/
uchar code cuzhi[]{0xff,0xff, /*占位*/0xFC,0x8E, /*中央C调1~7*/0xFC,0xED,0xFD,0x43,0xFD,0x6A,0xFD,0xB3,0xFD,0xF3,0xFE,0x2D,0xFE,0x47, /*高八度1~7*/0xFE,0x76,0xFE,0xA1,0xFE,0xC7,0xFE,0xD9,0xFE,0xF9,0xFF,0x16};
void delay1(uint z); /* 延时1MS*/
void delay(uint z); /*延时165ms既16分音符*/
void song();
void beep(); /*蜂鸣器叫一声*/
void main()
{P00xbf;
// KK0;EA1;EX01;IT01;EX11;IT11;TMOD0x01;TH00;TL00;ET01;while(1){if(P1_71){count2;//歌曲递增if(count25)count20;}if(count2!0){song();delay1(1000);}}
}void int0() interrupt 0
{EA0;delay1(1); if(key10){count20;/*暂停音乐*/TR00;}EA1;
} void int1() interrupt 2
{TR0 0; delay1(1); /*去抖*/if(key20){i0;/*从头开始唱*/count2;TR0~TR0;if(count25)count20;}
}void timer0() interrupt 1/*用于产生各种音调*/
{
/* if(count20) {TH0 tone_delay_table[keynum]/256;TL0 tone_delay_table[keynum]%256;fm ~fm;} */if(count2!0) //放音乐{TH0timeh;TL0timel;fm~fm;}
}void song()
{uint temp;uchar jp;i0;while(1){if(count20){break;}if(count21) //选曲tempjmszl[i];if(count22)tempqnzl[i];if(count23)tempqizige[i];if(count24)tempganen[i];if(temp0xff)break;jptemp/16;P2 huayang[jp];P0DSY_table[count2];if(jp!0){timehcuzhi[jp*2];timelcuzhi[jp*21];}else{TR00;fm1;}delay(temp%16);TR00;fm1;delay1(10);TR01;i;}TR00;fm1;
}
设计报告 系统组成框图 本设计采用STC89C516RD作为主控芯片仿真可替换为STC89C51,STC89C52,AT89C51,AT89C52D等51单片机蜂鸣器作为输出设备产生音乐通过MOD键能实现播放模式的控制数码管LED能够实时的显示当前的歌曲号。其中P3.3外接按键P0口用作数码管输出数据端口P2口作LED输出数据端口P1.1蜂鸣器端口。
程序设计
音调、节拍以及编码的确定方法
一般说来单片机演奏音乐基本都是单音频率它不包含相应幅度的谐波频率也就是说不能像电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两个概念即可也就是“音调”和节拍表示一个音符唱多长的时间。
音调的确定
不同音高的乐音是用C、D、E、F、G、A、B来表示这7个字母就是音乐的音名它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7相当于汉字“多来米发梭拉西”的读音这是唱曲时乐音的发音所以叫“音调”即Tone。把C、D、E、F、G、A、B这一组音的距离分成12个等份每一个等份叫一个“半音”。两个音之间的距离有两个“半音”就叫“全音”。在钢琴等键盘乐器上C–D、D–E、F–G、G–A、A–B两音之间隔着一个黑键他们之间的距离就是全音E–F、B–C两音之间没有黑键相隔它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音那些在它们的左上角加上﹟号或者b号的叫变化音。﹟叫升记号表示把音在原来的基础上升高半音b叫降记音表示在原来的基础上降低半音。例如高音DO的频率1046Hz刚好是中音DO的频率523Hz的一倍中音DO的频率523Hz刚好是低音DO频率266 Hz的一倍同样的高音RE的频率1175Hz刚好是中音RE的频率587Hz的一倍中音RE的频率587Hz刚好是低音RE频率294 Hz的一倍。
要产生音频脉冲只要算出某一音频的周期1/频率然后将此周期除以2即为半周期的时间。利用定时器计时这半个周期时间每当计时到后就将输出脉冲的I/O反相然后重复计时此半周期时间再对I/O反相就可在I/O脚上得到此频率的脉冲。利用AT89C51的内部定时器使其工作在计数器模式MODE1下改变计数值TH0及TL0。此外结束符和休止符可以分别用代码00H和FFH来表示若查表结果为00H则表示曲子终了若查表结果为FFH则产生相应的停顿效果。例如频率为523Hz其周期T1/5231912us因此只要令计数器计时956us/1us956在每次技术956次时将I/O反相就可得到中音DO523Hz。
节拍的确定
若要构成音乐光有音调是不够的还需要节拍让音乐具有旋律固定的律动而且可以调节各个音的快满度。“节拍”,即Beat简单说就是打拍子就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s则1/4 拍为0.125s。至于1拍多少s并没有严格规定就像人的心跳一样大部分人的心跳是每分钟72下有些人快一点有些人慢一点只要听的悦耳就好。音持续时间的长短即时值一般用拍数表示。休止符表示暂停发音。
一首音乐是由许多不同的音符组成的而每个音符对应着不同频率这样就可以利用不同的频率的组合加以与拍数对应的延时构成音乐。了解音乐的一些基础知识我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说产生不同频率的脉冲是非常方便的利用单片机的定时/计数器来产生这样的方波频率信号。因此需要弄清楚音乐中的音符和对应的频率以及单片机定时计数的关系。
音符编码
do re mi fa so la si分别编码为1~7重音do编为8,重音re编为9停顿编为0。播放长度以十六分音符为单位在本程序中为165ms一拍即四分音符等于4个十六分音符编为4,其它的播放时间以此类推。音调作为编码的高4位而播放时间作为低4位如此音调和节拍就构成了一个编码。以0xff作为曲谱的结束标志。比如音调do,发音长度为两拍即二分音符将其编码为0x18。
歌曲播放的设计。先将歌曲的简谱进行编码储存在一个数据类型为unsigned char 的数组中。程序从数组中取出一个数然后分离出高4位得到音调接着找出相应的值赋给定时器0使之定时操作蜂鸣器得出相应的音调接着分离出该数的低4位得到延时时间接着调用软件延时。
主程序流程图 实物图 资料清单提供资料清单所有文件
仿真代码原理图PCB设计报告讲解视频
资料下载链接