简易电子琴.docx
- 文档编号:15947436
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:20
- 大小:1.11MB
简易电子琴.docx
《简易电子琴.docx》由会员分享,可在线阅读,更多相关《简易电子琴.docx(20页珍藏版)》请在冰点文库上搜索。
简易电子琴
电子工程学院课外学分设计报告
题目:
简易电子琴设计
姓名:
学号:
35
专业:
电子信息工程实验室:
开放实验室
班级:
1211
设计时间:
年月日——年月日
评定成绩:
审阅教师:
1.设计任务、目的
1.硬件电路设计(制作实物,行列键盘输入,至少21键,扬声器输出)
2.驱动程序设计:
扬声器驱动函数,键盘扫描函数
3.结合驱动程序设计程序实现如下功能:
-按键发声
-音乐播放(3首以上
2.方案设计与论证(或基本原理与论证)
音乐是有由不同的音阶组成的,而不同的音阶又是由不同的频率发出的,那么产生不同的频率,就可以发出不同的音乐了。
而利用单片机就可以产生不同的频率的方波,因此选择单片机为为主来设计。
通过程序编写实现单片机输出不同的频率,输出的方波信号再通过功放输出声音。
同时电子琴加入led用来显示。
本设计的主要工作是程序编写和焊电路板,通过程序让电子琴实现音乐演奏,歌曲播放以及记录已按下的音符,并播放,最后实现led显示。
而硬件主要有单片机最小系统,键盘模块,发声模块,还有一个电源模块。
图2.1总体方案图
3.硬软件设计
3.1硬件电路设计
图3.1硬件电路图
本系统有主控单片机、按键、led显示模块、扬声器模块以及电源组成。
1.单片机最小系统
单片机最小系统由STC89C51芯片、晶振、电容组成。
2.按键设计
按键采用4*6扫描;4根行线接P10-P13,六根列线接P14-P17以及P20,P21口共24个按键,0-20代表音符键,0-6代表低音1,2,3,4,5,6,7;7-13代表中音1,2,3,4,5,6,7;14-20代表高音1,2,3,4,5,6,7;21号按键表示播放歌曲键,当按下21号键,进入播放歌曲函数,当按下22号键时,播放下一首歌曲,当按下23键时,退出播放返回主程序。
而在主程序中时,代表演奏状态,当按下23号键时,进入录音状态,此时有个绿色的指示灯会亮。
而进入录音后,再按一次23键,指示灯灭,退出录音状态,返回主程序。
3.Led灯设计
7个绿色的LED代表按键的音符DO,RE,MI...分别接到P0口的各个I端口音符DO时,一个LED亮,音符MI时,2个LED亮…以此类推。
有一个绿色LED指示当前状态,当电子琴处于录音时,LED亮,否则,灭。
4.扬声器模块
扬声器模块由扬声器、三极管和电阻组成。
经过三极管的放大作用驱动扬声器发声。
3.2软件设计
3.2.1主函数流程图如下:
图3.2主函数流程图
3.2.2音乐播放函数流程图如下:
图3.3音乐播放流程图
3.2.3按键扫描程序流程图如下:
图3.4按键扫描流程图
3.2.4led流水灯流程图
图3.5判断低中高音符流程图
图3.6led显示低中高音符流程图
4.实现与测试(或调试)
4.1硬件调试
硬件调试主要是针对焊的板子进行调试。
在上电之前,先确保电路中不存在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。
在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况的任务。
注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。
在确保硬件电路正常且无异常情况(断路或短路)的情况下方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确。
LED电路调试:
接通电源,随机按下按钮可以看到LED亮。
键盘单片机控制部分调试:
上电后,随机按动键盘可以发现各个按键对应的音正确。
4.2软件调试
软件调试是一个重要的任务,当电子琴没有出现预期的功能时,通过反复研究程序的逻辑是否正确,哪些功能实现,哪些功能没实现,是哪一个模块出了问题。
实际中往往一个小小的变量没赋予正确的值,其功能完全出不来,通过去修改代码,再利用protus仿真,去看结果是否真确。
5.分析与总结
按下按键1~21扬声器输出中高低对应的声音,led流水灯也随之变化;按下按键22播放音乐,led灯随音乐的节拍和音节亮;按下按键23,播放下一首音乐;按下按键24退出音乐播放功能.
结果如图:
总体来说,此次课外学分我收获良多,虽然课外学分的过程中遇到了很多困难与问题,如起初对音乐的一点不懂开始,到器件难找,到硬件焊好后在完善等等,但最终还是完成了设计的任务及要求。
这次课外学分设计中,经过努力,在仿真软件和实物上都实现了高、中、低21个音符的发声和音乐的自动播放,使我有了一定的成就感,也使我进一步熟悉和掌握了单片机的内部结构和工作原理,了解了单片机应用系统设计的基本方法和步骤,掌握了单片机仿真软件Proteus的使用方法和键盘、显示器在的单片机控制系统中的应用,同时也掌握了撰写课程设计报告的方法。
总之,通过这次课程设计,自己的能力得到进一步的提升。
参考文献:
[1]黄友锐.单片机原理与应用.合肥:
工业大学出版社,2014
[2]蓝正.单片机原理及实用技术.成都:
西南交通大学,2014.
[3]李朝青.单片机原理及接口技术.北京:
北京航空航天大学出版社,2013
[4]陈洪财.单片机原理与应用技术.哈尔滨:
哈尔滨工程大学出版社.2012
[5]周坚.单片机轻松入门.北京:
北京航天航空大学出版社.2014
程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineledP0
sbitBeep=P3^0;//波形输出口
ucharKeyNo,th0,tl0,flag_yinfu_dizhonggao,yuzhi;//按键按下键值、定时器初值、音符低中高标志位、音符DO、RE...
ucharcont=0,cont1=0xff;//控制占空比变量
unsignedcharcodeMusicYinFu[]={0xFF,0xFF,0xFB,0x90,0xFC,0x0C,0xFC,0x44,0xFC,0xAC,0xFD,0x09,0xFD,
0x34,0xFD,0x82,0xFD,0xC8,0xFE,0x06,0xFE,0x22,0xFA,0X15,0XFB,0x04,0xFA,0x67,0xFE,0x85};
unsignedcharcodeMusic_One[]={0X54,0XC4,0X12,0X32,0X34,//<<宁夏>>
0X52,0X52,0X52,0X52,0X42,0X32,0X34,0XC1,0XC2,0X52,0XC2,0X12,
0X32,0X34,0X11,0X12,0X31,0X12,0XC2,0X78,0X72,0X52,0X52,0X42,
0X32,0X42,0X52,0X11,0XC1,0XC4,0XC1,0XC1,0XC1,0XC1,0X12,0X32,0X32,0X12,
0X42,0X42,0X44,0XC2,0X12,0X32,0X42,0X52,0X72,0X72,0X82,0X41,0X51,0X42,
0X48,0X42,0X12,0X3C,0X72,0XC2,0X42,0XC2,0XC4,0X34,0X32,0X42,0X52,0XC2,
0XC4,0XD2,0XC2,0X12,0X22,0X38,0X12,0X22,0X32,0X42,0X48,0xFF};
unsignedcharcodeMusic_Two[]={0x52,0x62,//<<阳光总在风雨后>>
0x74,0x74,0x74,0x34,0x42,0x34,0x52,0x56,0x42,0x34,0x34,0x14,0x32,0x12,0x12,0xC2,0xC4,0x04,0x52,0x62,
0x74,0x74,0x74,0x34,0x42,0x34,0x52,0x56,0x42,0x34,0x32,0x12,0x12,0x34,0x42,0x4C,0x52,0x42,0x34,0x32,0x42,
0x32,0x12,0x12,0xC2,0xC2,0x54,0x52,0x54,0x52,0x52,0x42,0x32,0x32,0x12,0x32,0x42,0x32,0x52,0x5C,0x52,0x42,0x34,0x32,0x42,0x32,0x12,0x12,0xC2,0xC2,0x54,0x52,0x54,0x02,0x52,0x52,0x42,0x32,0x12,0x32,0x84,0x72,0x7F,0x0F,0x74,0x72,0x52,0x54,0x74,0x82,0x52,0x52,0x72,0x78,0x34,0x32,0x32,0x42,0x54,0x72,0x7F,0x86,0x82,0x72,0x52,0x54,0x72,0x84,0x32,0x36,0x52,0x42,0x52,0x42,0x32,0x34,0x12,0x32,0x32,0x42,0x4C,0x86,0x82,0x72,0x52,0x54,0x72,0x84,0x52,0x56,0x52,
0x42,0x52,0x72,0x82,0x52,0x34,0x12,0x12,0x32,0x3C,0xFF};
unsignedcharcodeMusic_Three[]={0x12,0x52,0x52,0x52,0x56,0x42,0x32,0x42,0x32,0x22,0x18,
0x82,0x82,0x82,0x82,0x86,0x72,0xB2,0x72,0x72,0x62,0x58,0x52,0x82,0x82,0x72,0x56,0x42,
0x32,0x42,0x32,0x22,0x16,0xB2,0xB2,0x32,0x32,0x22,0x16,0x52,0x42,0x32,0x22,0xC2,0x88,0xFF};//兰花草
ucharcodeLED_Dis[]={0x1f,0x3f,0x7f,0x01,0x03,0x07,0x0f};//LED显示音符
//DO,RE,MI,FA,SO,LA,SI
uintcodeTone_Delay_Table[]={63628,63835,64021,64103,64260,64400,64524,
64580,64633,64732,64820,64898,64968,65030,
64289,65110,65157,65178,65217,65252,65283};//21个音符的频率对应的T值
ucharcodeIO_P1[]={0xef,0xdf,0xbf,0x7f,0xff,0xff};//送P1值
ucharcodeIO_P2[]={0xff,0xff,0xff,0xff,0xfe,0xfd};//送P2值
ucharcodeIO_Input[]={0x0e,0x0d,0x0b,0x07};//判断输入IO口的值
voidDelayms(uintx)//延时
{
uchari;
while(x--)for(i=0;i<120;i++);
}
voidkey_scan(void)//按键行列扫描
{
uchari,j,temp;
for(i=0;i<6;i++)
{
P1=IO_P1[i];
P2=IO_P2[i];
temp=P1&0x0f;
for(j=0;j<4;j++)
{
if(temp==IO_Input[j])
KeyNo=i+j*6;
}
}
}
ucharKeyState(void)//判断有无按键按下
{
uchartemp;
P1=0x0f;
P2&=0xfc;
temp=P1&0x0f;
if(temp!
=0x0f)
{
Delayms(6);
if(temp!
=0x0f)
return1;
}
return0;
}
voidYinFu_DiZhongGao_Flag(ucharkeyval)
{
if(keyval<7)
flag_yinfu_dizhonggao=1;//低音
elseif(keyval<14&&keyval>7)
flag_yinfu_dizhonggao=2;//中音
elseif(keyval<21&&keyval>14)
flag_yinfu_dizhonggao=3;//高音
}
voidPlayMusic(void)
{
ucharyinfu,jiepai,yinfu_led;
uchari,j;//循环变量
uchar*p1=Music_One,*p2=MusicYinFu;
for(i=0;*(p1+i)!
=0xff;i++)
{
yinfu=((*(p1+i))>>4);//取出音符对应的序号
jiepai=((*(p1+i))&0x0f);//取出节拍数
yinfu_led=yinfu%7;//音符对应LED显示号
if(yinfu!
=0)
{
th0=*(p2+(yinfu)*2);
tl0=*(p2+(yinfu)*2+1);
TR0=1;
ET0=1;
}
else
{
TR0=0;
Beep=1;
}
for(j=jiepai;j>0;--j)
{
led=LED_Dis[yinfu_led-1];
Delayms(100);
key_scan();
if(KeyNo==23)
{ET0=1;break;}
elseif(KeyNo==22)
{
if(p1==Music_One)
{ET0=0;p1=Music_Two;}
elseif(p1==Music_Two)
{ET0=0;p1=Music_Three;}
else
{ET0=0;p1=Music_One;}
i=0;
KeyNo=26;//一定要改变KeyNo的值,否则只播放一个音符
Delayms(2000);
break;
}
}
if(*(p1+i+1)==0xff)
{
ET0=0;
Beep=0;
if(p1==Music_One)
{
i=0;
p1=Music_Two;
Delayms(3000);
}
elseif(p1==Music_Two)
{
i=0;
p1=Music_Three;
Delayms(3000);
}
else
{
i=0;
p1=Music_One;
Delayms(3000);
}
}
TR0=0;
ET0=0;
if(KeyNo==23)
{
ET0=1;break;
}
}
ET0=1;
}
voidTimer_Init()
{
TMOD=0x11;//定时器T0,T1设置为方式1,
TH1=0xd8;//10ms中断一次
TL1=0xf0;
TH0=th0;
TL0=tl0;
IE=0x82;//开启总中断和定时器T0,T1溢出中断
ET1=1;
IP=0x02;//T0优先于T1
}
voidmain()
{
ucharKeystate=0;
Timer_Init();
led=0x00;//初始化led
while
(1)
{
Keystate=KeyState();
if(Keystate)
{
key_scan();
if(KeyNo<21)
{
yuzhi=(KeyNo+3)%7;//判断DOREMIFA...
th0=Tone_Delay_Table[KeyNo]/256;
tl0=Tone_Delay_Table[KeyNo]%256;
YinFu_DiZhongGao_Flag(KeyNo);
TR0=1;//Turnontimer
TR1=1;
}
elseif(KeyNo==21)//
{PlayMusic();Delayms(2000);}
}
else
{
TR0=0;//关闭定时器
TR1=0;
led=0x00;
cont=0;
}
Delayms
(2);
}
}
voidplay_Tone()interrupt1using0//定时器T0溢出中断,产生不同频率的矩形波
{
TH0=th0;
TL0=tl0;
Beep=~Beep;
}
voidplay_LED()interrupt3using2
{
if(flag_yinfu_dizhonggao==1||flag_yinfu_dizhonggao==3)//低音或高音
{//低音占空比为1/4、高音占空比为
if((cont==3&&flag_yinfu_dizhonggao==1)||flag_yinfu_dizhonggao==3){
led=LED_Dis[yuzhi];
}
elseled=0x00;
}
if(flag_yinfu_dizhonggao==2)
{
if(cont1)//控制占空比为1/2
{cont1=~cont1;led=LED_Dis[yuzhi];}
else
{led=0x00;cont1=~cont1;}
}
cont++;
if(cont>3)cont=0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 电子琴