单片机课程设计基于单片机的电子琴设计.docx
- 文档编号:28766605
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:15
- 大小:188.19KB
单片机课程设计基于单片机的电子琴设计.docx
《单片机课程设计基于单片机的电子琴设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计基于单片机的电子琴设计.docx(15页珍藏版)》请在冰豆网上搜索。
单片机课程设计基于单片机的电子琴设计
单片机课程设计
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 基于 电子琴 设计