简易电子琴.docx

上传人:b****5 文档编号:5973767 上传时间:2023-01-02 格式:DOCX 页数:17 大小:251.27KB
下载 相关 举报
简易电子琴.docx_第1页
第1页 / 共17页
简易电子琴.docx_第2页
第2页 / 共17页
简易电子琴.docx_第3页
第3页 / 共17页
简易电子琴.docx_第4页
第4页 / 共17页
简易电子琴.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

简易电子琴.docx

《简易电子琴.docx》由会员分享,可在线阅读,更多相关《简易电子琴.docx(17页珍藏版)》请在冰豆网上搜索。

简易电子琴.docx

简易电子琴

 

电子工程学院课外学分设计报告

 

题目:

简易电子琴设计

 

姓名:

学号:

35

专业:

电子信息工程实验室:

开放实验室

班级:

1211

设计时间:

年月日——年月日

评定成绩:

审阅教师:

 

目录

1.设计任务、目的1

2.方案设计与论证(或基本原理与论证)1

3.硬软件设计1

4.实现与测试(或调试)5

5.分析与总结6

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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1