预览加载中,请您耐心等待几秒...
1/9
2/9
3/9
4/9
5/9
6/9
7/9
8/9
9/9

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

多功能电子琴 作品简介: 漂亮的外观,清澈洪亮的声音,闪闪发亮的彩灯,相信早已吸引住你的眼球!这是一款纯手工打造的电子琴,实为接近MM、生日礼物必备佳品。其成本不会超过20元。 作品功能: ★通过8个按钮可以演奏出基本的8种音调:Do、Re、Mi、Fa、SO、La、Si、高音Do; ★演奏的同时会以数字显示出当前的音调,利于培养乐感; ★可以自动演示这8个音调; ★可以演奏内置生日快乐歌。 ★自动演奏时,LED进行节拍指示。 使用方法: 通过按下方的8个音调键演奏乐曲; 按演示按钮可以自动演奏这8种音调; 按奏乐按钮可以演奏生日快乐歌; 在自动演示和奏乐的过程中按停止键则中断演奏; 音量调节按钮可以选择音量大和小。 基本原理: 一定频率产生声音,频率高低决定音调。利用单片机输出脉冲信号经放大后送给喇叭,便可发出声音。本制作中巧妙地利用了单片机的定时器,让定时器中断一次就对改变喇叭的状态一次,即形成矩形方波,这也是数字电路产生声音的方法。 本作品使用AT89S52型单片机,ISP在线下载使得修改芯片里面的内容相当简单,便于作品的升级与优化。 硬件电路: 51单片机最小系统部分: 8颗独立按键加上两颗功能键,按键需接上拉电阻。S1~S8为音调按钮,S9、S10为演奏按钮: 喇叭驱动电路,speaker接单片机的P1.0口,喇叭安装在箱体中: LED电路,led接单片机的P1.1口。注意,这里的LED是那种通电自己会闪的,这样才能有视频中的效果: 数码管电路,选用共阳数码管,A~DP依次接单片机P0.0~P0.7: 软件设计: /*************************************************** 程序名称:多功能电子琴 简要说明:P1.0口输出各音调的频率方波 本程序可方便地更改内置音乐的内容 编写:JiangX.net 更新时间:08/10/18晚 ***************************************************/ #include<AT89X52.h> #defineSPKP1_0//定义方波输出口 #defineLEDP1_1 #defineshumaguanP0//定义数码管段码输出 unsignedinttone1,tone2; /*****标准音符表*****/ //用于使定时器初值变化以产生相应频率的定时 unsignedcharcodeyinfu[]={0xfb,0xe9,//Do 0xfc,0x5c,//Re 0xfc,0xc1,//Mi 0xfc,0xef,//Fa 0xfd,0x45,//So 0xfd,0x92,//La 0xfd,0xd0,//Si 0xfd,0xee,//Do# 0x00,0x00//音符之间的间隔,只要间隔时间小于65ms时, //喇叭不会发出声音,用作拍子之间的短暂停顿 }; /*****生日快乐歌音调表*****/ unsignedcharcodeshengri_tone[]={1,0,1,2,1,4,3,0, 1,0,1,2,1,5,4,0, 1,0,1,8,6,4,3,2,0, 7,0,7,6,4,5,4,0//0代表不发声,即停顿;数字即为音调 }; /*****生日快乐歌节拍表*****/ unsignedcharcodeshengri_beat[]={24,1,24,48,48,48,72,5, 24,1,24,48,48,48,72,5, 24,1,24,48,48,48,48,72,5, 24,1,24,48,48,48,72,5//节拍,即tone表各音调的延时 }; /*****自动演示音调表*****/ unsignedcharcodeyanshi_tone[]={1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0, 8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0 }; /*****自动演示节拍表*****/ unsignedcharcodeyanshi_beat[]={48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,2, 48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,2 }; /*****15ms延时子程序,用于节拍*****/ voiddelay(void) { unsignedcharn=15; while(n--) { unsignedchari; for(i=0;i<125;i++); } } /*****定时器0初始化*****/ voidinitTimer(void) { TMOD=0x01;//定时器0,工作方式1;定时器1,工作方式1 TH0=tone1;