单片机课程设计基于单片机的电子琴设计.docx

上传人:b****6 文档编号:16394858 上传时间:2023-07-13 格式:DOCX 页数:15 大小:188.19KB
下载 相关 举报
单片机课程设计基于单片机的电子琴设计.docx_第1页
第1页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第2页
第2页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第3页
第3页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第4页
第4页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第5页
第5页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第6页
第6页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第7页
第7页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第8页
第8页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第9页
第9页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第10页
第10页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第11页
第11页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第12页
第12页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第13页
第13页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第14页
第14页 / 共15页
单片机课程设计基于单片机的电子琴设计.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机课程设计基于单片机的电子琴设计.docx

《单片机课程设计基于单片机的电子琴设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计基于单片机的电子琴设计.docx(15页珍藏版)》请在冰点文库上搜索。

单片机课程设计基于单片机的电子琴设计.docx

单片机课程设计基于单片机的电子琴设计

 

单片机课程设计

 

09届电子信息工程专业......班级

 

题目基于单片机的电子琴设计

学号..................

姓名...........

指导教师..........

 

二О一一年一月五日

一、电子琴的基本原理

设计要求:

1、具有7个基本音符的按键,能够弹奏简单乐曲;

2、能够播放存贮在内存中的3首乐曲;

3、可以将弹奏乐曲存储在内存中并回放;

分析上述的设计要求结合单片机的功能,一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,而乐音就是固定频率的声音。

这样我们就可以利用不同的频率的组合,构成我们想演奏的那首曲目。

当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样的方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系编写正确就可以达到我们想要的曲目。

二、电子琴的硬件设计

总体硬件组成框图

 

该设计方案是通过按键随意按下所要表达的音符,作为电平送给主体电路,中央处理器通过识别,解码输出音符,在扬声器中发出有效的声音。

通过这样可以不断的弹奏我们想要的音符或者是音调,电路由复位电路,指示灯电路,和功能按键电路组成,通过功能键可以选择播放音乐或者弹奏音节。

元器件列表

元器件清单

序号

器件名称

参数

数量

1

USB座

1

2

   USB线

1

3

双排针

2

2

4

跳帽

3

5

104电容

0.1uF

7

6

LED灯

1

7

电阻

2K

1

8

40针座

1

9

STC89C52

1

10

晶振

12MHZ

1

11

电容

20pF

2

12

复位键

1

13

电阻

10K

1

14

蜂鸣器

1

15

三极管9015

9

16

电阻

330

9

17

16针座

1

18

MAX232

1

19

串口

1

20

单排针

3

1

21

LED

4位

1

22

电阻

4.7K

8

23

按键

表1元件列表

三、电子琴的软件设计

针对原理图做出软件设计分析,根据学过的矩阵键盘相关知识,可以设计扫描式键盘,本设计中总共用到12个按键,分别控制暂停,播放(3个按键),蜂鸣器用到p1.6口,键盘用p3口,只需要把对应的行线和列线连接起来就可以了。

基本按照硬件电路设计的规则去设计软件电路,因为protus仿真会用到电路图,所以这也属于软件设计的一部分。

接下来就是编程,然后用keil生成hex文件可以下到板子里调试,也可以先用仿真软件仿真然后再调试,最终实现功能。

程序:

#include

#defineMUSICNUMBER3//歌曲的数目

/*****************************************************/

#defineSYSTEM_OSC12000000//定义晶振频率12000000HZ

#defineSOUND_SPACE4/5//定义普通音符演奏的长度分率,//每4分音符间隔

sbitBeepIO=P1^6;//定义输出管脚

unsignedcharMusicIndex=0;

unsignedintcodeFreTab[12]={262,277,294,311,330,349,369,392,415,440,466,494};

unsignedcharcodeSignTab[7]={0,2,4,5,7,9,11};

unsignedcharcodeLengthTab[7]={1,2,4,8,16,32,64};

unsignedintSound_Temp_TH0,Sound_Temp_TL0;

unsignedintSound_Temp_TH1,Sound_Temp_TL1;

/**********************************************************/

unsignedchartempkey,key=0;unsignedintTemp_T;

/***********************************************************/

voidDelay1ms(unsignedintcount);unsignedcharkeydisp();

unsignedchargetkey(unsignedchartempkey);voidInitialSound(void);

voidPlay(unsignedchar*Sound,unsignedcharSignature,unsignedOctachord,unsignedintSpeed);

unsignedchar*SelectMusic(unsignedcharSoundIndex);

voidPlayMusic(void);

/***********************************************************/

voidDelay1ms(unsignedintcount)

{unsignedinti,j;for(i=0;i

unsignedcharkeydisp()

{unsignedchartemp,temp1;P3=0xf0;Delay1ms(5);temp=P3;

if(temp!

=0xf0){temp1=P3&0xf0;Delay1ms

(1);

P3=0x0f;Delay1ms(3);temp=P3&0x0f;temp=temp+temp1;

temp=~temp;}returntemp;}

unsignedchargetkey(unsignedchartempkey)

{unsignedcharkey1;switch(tempkey)

{case0x82:

key1=0x21;P0=0xF9,P2=0x30;break;

case0x42:

key1=0x22;P0=0xA4,P2=0x30;break;

case0x22:

key1=0x23;P0=0xB0,P2=0x30;break;

case0x12:

key1=0x24;P0=0xBF,P2=0x30;break;

case0x84:

key1=0x31;P0=0xF9,P2=0xC0;break;

case0x44:

key1=0x32;P0=0xA4,P2=0xC0;break;

case0x24:

key1=0x33;P0=0xB0,P2=0xC0;break;

case0x14:

key1=0x34;P0=0x99,P2=0xC0;break;

case0x88:

key1=0x41;P0=0x92,P2=0xC0;break;

case0x48:

key1=0x42;P0=0x82,P2=0xC0;break;

case0x28:

key1=0x43;P0=0xF8,P2=0xC0;break;

case0x18:

key1=0x44;P0=0XBF,P2=0xC0;break;

default:

break;}

returnkey1;}

voidInitialSound(void)

{BeepIO=1;

Sound_Temp_TH1=(65535-(1/1200)*SYSTEM_OSC)/256;//计算TL1应装入的初值(10ms的初装值)

Sound_Temp_TL1=(65535-(1/1200)*SYSTEM_OSC)%256;//计算TH1应装入的初值

TH1=Sound_Temp_TH1;TL1=Sound_Temp_TL1;

TMOD|=0x11;ET0=1;ET1=0;TR0=0;TR1=1;

EA=1;}

voidBeepTimer0(void)interrupt1//音符发生中断

{BeepIO=!

BeepIO;

TH0=Sound_Temp_TH0;

TL0=Sound_Temp_TL0;}

//*****************************Music*****************龙的传人

unsignedcharcodeMusic_Code[]={0x10,0x02,0x11,0x03,0x15,0x03,0x16,0x02,0x17,0x03,0x16,0x03,0x15,0x02,0x15,0x04,0x11,0x04,0x10,0x01,0x10,0x02,0x11,0x04,0x15,0x04,0x16,0x02,0x17,0x03,0x16,0x03,0x15,0x02,0x15,0x04,0x16,0x04,0x17,0x01,0x10,0x02,0x11,0x03,0x15,0x03,0x16,0x02,0x17,0x03,

0x16,0x03,0x15,0x02,0x15,0x04,0x11,0x04,0x10,0x01,0x11,0x02,0x11,0x02,0x11,0x02,0x15,0x03,0x11,0x03,0x10,0x02,0x10,0x04,0x0F,0x04,0x10,0x01,0x17,0x02,0x17,0x02,0x17,0x02,0x16,0x03,0x15,0x03,0x16,0x02,0x16,0x04,0x17,0x04,0x16,0x01,0x15,0x02,0x15,0x02,0x11,0x02,0x15,0x04,0x11,0x04,0x10,0x02,0x10,0x04,0x0F,0x04,0x10,0x01,0x00,0x00};//小毛驴

unsignedcharcodeMusic_Dode[]={0x15,0x03,0x15,0x03,0x15,0x03,0x17,0x03,0x19,0x03,0x19,0x03,0x1A,0x03,0x1A,0x03,0x1A,0x03,0x1F,0x03,0x19,0x00,0x18,0x03,0x18,0x03,0x1A,0x03,0x1A,0x03,0x17,0x03,0x17,0x03,0x17,0x03,0x17,0x03,0x16,0x03,0x16,0x03,0x16,0x03,0x16,0x03,0x19,0x66,0x19,0x03,0x15,0x03,0x15,0x03,0x15,0x03,0x17,0x03,0x19,0x03,0x19,0x03,0x19,0x03,0x19,0x03,0x1A,0x03,0x1A,0x03,0x1A,0x03,0x1F,0x03,0x19,0x00,0x18,0x03,0x18,0x03,0x18,0x03,0x1A,0x03,0x17,0x03,0x17,0x04,0x17,0x04,0x17,0x03,0x17,0x03,0x16,0x03,0x16,0x03,0x16,0x03,0x17,0x03,0x15,0x00,0x00,0x00};//两只蝴蝶

unsignedcharcodeMusic_Two[]={0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x10,0x0E,0x15,0x04,0x0F,0x01,0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x15,0x03,0x16,0x01,0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x10,0x0E,0x15,0x04,0x0F,0x01,0x17,0x03,0x19,0x03,0x19,0x01,0x19,0x03,0x1A,0x03,0x19,0x03,0x17,0x01,0x16,0x03,0x16,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x10,0x0D,0x15,0x00,0x19,0x03,0x19,0x03,0x1A,0x03,0x1F,0x03,0x1B,0x03,0x1B,0x03,0x1A,0x03,0x17,0x0D,0x16,0x03,0x16,0x03,0x16,0x0D,0x17,0x01,0x17,0x03,0x17,0x03,0x19,0x03,0x1A,0x02,0x1A,0x02,0x10,0x03,0x17,0x0D,0x16,0x03,0x16,0x01,0x17,0x03,0x19,0x03,0x19,0x03,0x17,0x03,0x19,0x02,0x1F,0x02,0x1B,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x17,0x02,0x1A,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x1A,0x03,0x19,0x03,0x17,0x03,0x16,0x03,0x17,0x0D,0x16,0x03,0x17,0x03,0x19,0x01,0x19,0x03,0x19,0x03,0x1A,0x03,0x1F,0x03,0x1B,0x03,0x1B,0x03,0x1A,0x03,0x17,0x0D,0x16,0x03,0x16,0x03,0x16,0x03,0x17,0x01,0x17,0x03,0x17,0x03,0x19,0x03,0x1A,0x02,0x1A,0x02,0x10,0x03,0x17,0x0D,0x16,0x03,0x16,0x01,0x17,0x03,0x19,0x03,0x19,0x03,0x17,0x03,0x19,0x03,0x1F,0x02,0x1B,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x17,0x02,0x1A,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x17,0x16,0x1A,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x1A,0x03,0x19,0x03,0x17,0x03,0x16,0x03,0x0F,0x02,0x10,0x03,0x15,0x00,0x00,0x00};

//***********************************************************

main()

{unsignedchargao_di;InitialSound();while

(1)

{key=getkey(keydisp());while(key==0x21)

{MusicIndex=0x00;InitialSound();

Play(SelectMusic(MusicIndex),0,3,360);}

while(key==0x22){MusicIndex=0x01;InitialSound();

Play(SelectMusic(MusicIndex),0,3,360);}

while(key==0x23){MusicIndex=0x02;InitialSound();

Play(SelectMusic(MusicIndex),0,3,360);}

while(key==0x24){TR0=0;BeepIO=1;key=getkey(keydisp());}

while(key==0x31){InitialSound();if(gao_di==0)

Temp_T=65536-(50000/FreTab[SignTab[0]])*10;//计算计数器初值

else

Temp_T=65536-(50000/FreTab[SignTab[0]])*5;//计算计数器初值

Sound_Temp_TH0=Temp_T/256;Sound_Temp_TL0=Temp_T%256;

TH0=Sound_Temp_TH0;TL0=Sound_Temp_TL0;Delay1ms

(1);TR0=1;

key=getkey(keydisp());if(key!

=0x31)TR0=0;}

while(key==0x32){InitialSound();if(gao_di==0)

Temp_T=65536-(50000/FreTab[SignTab[1]])*10;//计算计数器初值elseTemp_T=65536-(50000/FreTab[SignTab[1]])*5;//计算计数器初值Sound_Temp_TH0=Temp_T/256;Sound_Temp_TL0=Temp_T%256;

TH0=Sound_Temp_TH0;TL0=Sound_Temp_TL0;Delay1ms

(1);TR0=1;

key=getkey(keydisp());if(key!

=0x31)TR0=0;}

while(key==0x33){InitialSound();if(gao_di==0)

Temp_T=65536-(50000/FreTab[SignTab[2]])*10;//计算计数器初值

elseTemp_T=65536-(50000/FreTab[SignTab[2]])*5;//计算计数器初值Sound_Temp_TH0=Temp_T/256;Sound_Temp_TL0=Temp_T%256;

TH0=Sound_Temp_TH0;TL0=Sound_Temp_TL0;Delay1ms

(1);TR0=1;

key=getkey(keydisp());if(key!

=0x33)TR0=0;}while(key==0x34)

{InitialSound();if(gao_di==0)

Temp_T=65536-(50000/FreTab[SignTab[3]])*10;//计算计数器初值

elseTemp_T=65536-(50000/FreTab[SignTab[3]])*5;//计算计数器初值Sound_Temp_TH0=Temp_T/256;Sound_Temp_TL0=Temp_T%256;

TH0=Sound_Temp_TH0;TL0=Sound_Temp_TL0;Delay1ms

(1);TR0=1;

key=getkey(keydisp());if(key!

=0x34)TR0=0;}

while(key==0x41){

InitialSound();if(gao_di==0)

Temp_T=65536-(50000/FreTab[SignTab[4]])*10;//计算计数器初值elseTemp_T=65536-(50000/FreTab[SignTab[4]])*5;//计算计数器初值Sound_Temp_TH0=Temp_T/256;

Sound_Temp_TL0=Temp_T%256;

TH0=Sound_Temp_TH0;TL0=Sound_Temp_TL0;Delay1ms

(1);TR0=1;

key=getkey(keydisp());

if(key!

=0x41)TR0=0;}

while(key==0x42){InitialSound();

if(gao_di==0)

Temp_T=65536-(50000/FreTab[SignTab[5]])*10;//计算计数器初值else

Temp_T=65536-(50000/FreTab[SignTab[5]])*5;//计算计数器初值Sound_Temp_TH0=Temp_T/256;

Sound_Temp_TL0=Temp_T%256;

TH0=Sound_Temp_TH0;

TL0=Sound_Temp_TL0;

Delay1ms

(1);TR0=1;

key=getkey(keydisp());

if(key!

=0x42)TR0=0;}while(key==0x43){InitialSound();

if(gao_di==0)

Temp_T=65536-(50000/FreTab[SignTab[6]])*10;//计算计数器初值else

Temp_T=65536-(50000/FreTab[SignTab[6]])*5;//计算计数器初值Sound_Temp_TH0=Temp_T/256;

Sound_Temp_TL0=Temp_T%256;

TH0=Sound_Temp_TH0;TL0=Sound_Temp_TL0;

Delay1ms

(1);TR0=1;

key=getkey(keydisp());

if(key!

=0x43)TR0=0;}

while(key==0x44){

gao_di=(gao_di++)%2;

key=getkey(keydisp());

if(key!

=0x31)

TR0=0;}}}

unsignedchar*SelectMusic(unsignedcharSoundIndex){

unsignedchar*MusicAddress=0;

switch(SoundIndex){

case0x00:

MusicAddress=&Music_Code[0];//龙的传人

break;case0x01:

MusicAddress=&Music_Dod

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

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

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2