基于单片机的电子琴设计_第1页
基于单片机的电子琴设计_第2页
基于单片机的电子琴设计_第3页
基于单片机的电子琴设计_第4页
基于单片机的电子琴设计_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、郑州航空工业管理学院单片机课程设计说明书14 届电子信息工程专业82班级 TOC o 1-5 h z 题目学号姓名指导教师二。一六年十二月二十三日目录摘要3一、电子琴的基本原理4.设计的内容.整体的工作原理.发音原理 HYPERLINK l bookmark4 o Current Document 二、电子时钟的硬件设计 5.硬件原理图.键盘设计.时钟电路.复位电路.元件清单6,数码管显示部分.发音部分设计.硬件调试三、电子时钟的软件设计9.键盘扫描程序.功能转移程序.琴键处理程序.自动播放歌曲程序.程序流程图.设计源程序四、课程设计总结与指导教师评语18摘要随着社会的发展进步,音乐逐渐成为我

2、们生活中很重要的一部分,有 人曾说喜欢音乐的人不会向恶。我们都会抽空欣赏世界名曲,作为对精神 的洗礼。本论文设计一个基于单片机的简易电子琴。我们对于电子琴如何 实现其功能,如音色选择、声音强弱控制、节拍器、自动放音功能等等也 很好奇。电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。 它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编 程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本 文的主要内容是用AT89S51单片机为核心控制元件,设计一个电子琴。以 单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主 控模块上设有16个按键和扬声器。本

3、系统运行稳定,具优点是硬件电路 简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值关键词:AT89S51单片机 音色 节拍器 自动放音一、电子琴的基本原理1、本次设计的内容是:利用所给键盘的16,15,14,13,12,11,10,9七个键,能够发出7个不同的音调,而且8,7,6按键可以自动播放歌曲,要求按键按下时发声,当 系统扫描到键盘按下,则快速检测出是哪一个按键被按下,然后单片机的 定时器启动,发出一定频率的脉冲,该频率的脉冲经喇叭驱动电路放大滤 波后,就会发出相应的音调,p1.7控制着蜂鸣器发出声音,在此基础上我 们组又增加了数码管显示部分,当发出 1,2,3,4

4、,5,6,7 音调时通过p2 口 控制数码管是分别显示1,2,3,4,5,6,7 当播放音乐时数码管分别显示1,2,3 。2、整体工作原理:采用AT89C52I片机作为主控芯片,设置键盘、蜂鸣器等外围器件, 另外还用到一些简单器件如:两位数码管,和NPN三极管及电阻等。利用按键实现音符和音调的输入;两位的数码管进行被操作的按键显示;用 NPNE三极管8550实现低音频功率放大;最后用蜂鸣器发音。AT89C5单片 机是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价 格低廉、稳定可靠、应用广泛的特点。同时具有强大的控制功能和灵活的 编程实现特性,由于本设计主要用于人们娱乐方面,因此在

5、设计上尽量使 其安全以及简单易操作。具有经济可行性、技术可行性、实物应用性。3、发音原理:若要产生音频脉冲,只要算出某一音频的周期(频率),再将此 周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后 就将P1.7反相,然后重复计时再反相。就可在P1.7引脚上得到此频率的脉冲。利用STC89C5的内部定时器使其工作计数器模式(MOD61下,改变计数值TH吸TL0以产生不同频率的方法产生不同音阶。计算举例,频率为523Hz,其周期T= 1/523 = 1912 s,因此只要令 计数器计时956 ps/1 ps=956,每计数956次时将I/O反相,就可得到中 音DO(523Hz

6、)。计数脉冲值与频率的关系式是:Nhfi +2 + fr ,式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHZ ; fr是想要产生的频率。其计数初值 T的求法如下:T= 65536- N= 65536 fi +2 + fr例如:设 K= 65536, fi =1MHz 求中音 DO(261Hz:) 。 T= 65536-N = 65536-fi +2 + fr =655361000000+ 2+ fr =65536 500000/fr ,中音 DO的 T= 65536 500000/523 = 64580STC89C弹片机为12MHZ1振,中音符与计数T0相关的计数值

7、如表所示:音符访(HZ)计数值(T值)音符访(HZ)计数值(T值)低1DO26263628#4FA#74064860#1DO#27763737中5SO78464898低2RE29463835#5SO#83194934#2RE#31163928中6LA88064948低3MI33064021#中 6LA#93264494低FA34964103中7SI96865030#4FA#37064185低1DO104665058低SO39264260#1DO#110965085#5SO#41564331高2RE117565110低6LA44064400#2RE#124565134#6LA#46664463高

8、3MI131865157低7SI49464524高4FA139765178中1DO52364580#4FA#149065198#1DO#55464633高5SO156865217中2RE58764633#5SO#166165235#2RE#62264884高6LA176065252中3MI65964732#6LA#186565268中4FA69864820高7SI196765283用单片机播放音乐,或者弹奏电子琴,实际上是按照特定的频 率,输出一连串的方波。为了输出合适的方波,首先应该知道音符与频率 的关系。二、电子时钟的硬件设计1、硬件原理图:本系统有主控芯片STC89C52发音单元、显示模

9、块、按键模块组成 硬件电路要以单片机作为主控芯片,实现按键输入音符和音调,四位数码 管的显示以及低音频功率放大和蜂鸣器发音。2、键盘设计单片机系统中,若按键较多时,通常采用矩阵式(也称行列式)键盘。 矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上。显然,在 按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O 口。矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉 电阻接到+5V上.当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。这 是识别按键是否按下的关键。图-矩阵键盘3、时钟电路单片机内部具有一个高增益

10、反相放大器,用于构成振荡器。通常在引 脚XI和X2跨接石英晶体和两个补偿电容构成自激振荡器,选择12MH颁率的石英晶体,补偿电容通常选择 20pF左右的瓷片电容。4、复位电路单片机小系统常采用上电自动复位和手动按键复位两种方式实现系 统的复位操作。上电复位要求接通电源后,自动实现复位操作。手动复位 要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机 复位。上电自动复位通过电容 C3充电来实现。手动按键复位是通过按键 将电阻R1与VCC通来实现。5、元件清单6、 数码管显示部分当发出1,2,3,4,5,6,7 音调时通过p2 口控制数码管是分别显示 1,2,3,4,5,6,7当播放

11、音乐时数码管分别显示1,2,3 。7、发音部分设计如下图所示,发音电路是由蜂鸣器、三极管、上拉电阻构成。由三极 管来驱动扬声器发音的,同时加上拉电阻增强驱动电流,提高驱动能力。图4发音电路8、硬件调试硬件调试主要是针对单片机部分进行的调试。在上电之前,先确保电路中不存在断路或短路情况,这一工作是整个 调试工作的第一步,也是非常重要的一个步骤。在这部分调试中主要使用 的工具是万用表,用来完成检测电路中是否存在断路或者短路情况的任 务。注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确 保没有开路以及短路的现象出现。在确保硬件电路正常且无异常情况 (断路或短路)的情况下方可上电 调试,上

12、电调试的目的是检验电路是否接错, 同时还要检验原理是否正确,在本次设计中,上电调试主要是检测单片机控制部分、数码管点亮部分、 和音频转换电路硬件调试,三、电子时钟的软件设计1、键盘扫描程序:检测是否有按键按下,有按键按下则记录按下键的键值,并跳转至功 能转移程序;无按键按下,则返回键盘扫描程序继续检测。2、功能转移程序:对检测到的按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即音色调节功 能和自动播放乐曲的功能。3、琴键处理程序:根据检测到的按键值,查询音调表,给计时器赋值,使发出相应频率的声音。4、自动播放歌曲程序:检测到按键按下的是自

13、动播放歌曲功能键后执行该程序,电子琴会自 动播放事先已经存放的歌曲,歌曲播放完毕之后自动返回至键盘扫描程 序,继续等待是否有按键按下。5、程序流程图图5流程图6、设计源程序:/*说明*曲谱存贮格式 unsigned char code MusicName音高,音长,音高,音长 .,0,0; 末尾:0,0 表示结束(Important)音高由三位数字组成:个位是表示17这七个音符;十位是表示音符所在的音区:1-低音,2-中音,3-高音;百位表示这个音符是否要升半音:0-不升,1-升半音。音长最多由三位数字组成:个位表示音符的时值,其对应关系是:| 数值(n): |0 |1 |2 |3 | 4 |

14、 5 | 6| 几分音符:|1 |2 |4 |8 |16 |32 |64音符=2An十位表示音符的演奏效果(0-2): 0- 普通,1-连音,2-顿音百位是符点位:0-无符点,1-有符点调用演奏子程序的格式Play(乐曲名,调号,升降八度,演奏速度);|乐曲名 : 要播放的乐曲指针,结尾以(0,0)结束;|调号(0-11):是指乐曲升多少个半音演奏;|升降八度(1-3): 1:降八度,2:不升不降,3:升八度;|演奏速度(1-12000):值越大速度越快;#define _SOUNDPLAY_H_REVISION_FIRST_#include *#define SOUND_SPACE 4/5/

15、定义普通音符演奏的长度分率,/每4分音符间隔#define uchar unsigned charsbit P2_0 = P2A0;sbit P2_1 = P2A1;sbit P2_2 = P2A2;sbit P2_3 = P2A3;sbit P2_4 = P2A4;sbit P2_5 = P2A5;sbit P2_6 = P2A6;sbit P2_7 = P2A7;sbit BeepIO = Pi7;/定义输出管脚uchar code table=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;unsigned int

16、code FreTab12 = 262,277,294,311,330,349,369,392,415,440,466,494 ; /原始频率表unsigned char code SignTab7 = 0,2,4,5,7,9,11 ;/17 在频率表中的位置unsigned char code LengthTab7= 1,2,4,8,16,32,64 ;unsigned char Sound_Temp_TH0,Sound_Temp_TL0; / 音符定时器初值暂存unsigned char Sound_Temp_TH1,Sound_Temp_TL1; / 音长定时器初值暂存*void del

17、ay(uchar i)uchar j,k;for(j=i;j0;j-)for(k=125;k0;k-);void InitialSound(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 |= 0 x11;ET0 = 1;ET1= 0;TR0=

18、 0;TR1 = 0;EA = 1;void BeepTimerO(void) interrupt 1/音符发生中断BeepIO =旧eepIO;TH0 = Sound_Temp_TH0;TL0 = Sound_Temp_TL0;*void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)unsigned int NewFreTab12;unsigned char i,j;/新的频率表unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,

19、LDiv4,CurrentFre,Temp_T,SoundLength;unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;for(i=0;i 11) j = j-12;NewFreTabi = FreTabj*2;elseNewFreTabi = FreTabj;if(Octachord = 1)NewFreTabi=2;else if(Octachord = 3)NewFreTabi=2;SoundLength = 0;while(SoundSoundLength != 0 x00)/计算歌曲长度SoundLength+=2;Point = 0;To

20、ne = SoundPoint;Length = SoundPoint+1;/读出第一个音符和它时时值LDiv0 = 12000/Speed;/算出1分音符的长度(几个10ms)LDiv4 = LDiv0/4;/算出4分音符的长度LDiv4 = LDiv4-LDiv4*SOUND_SPACE;/普通音最长间隔标准TR0 = 0;TR1 = 1;/计算出音符while(Point = 2;/低音if (SM=3) CurrentFre = 2;Sound_Temp_TH0 = Temp_T/256;/高音Sound_Temp_TL0 = Temp_T%256;TH0 = Sound_Temp_T

21、H0;TL0 = Sound_Temp_TL0 + 12; / 力口 12是对中断延时的补偿SLen=LengthTabLength%10; /算出是几分音符XG=Length/10%10;FD=Length/100;/算出音符类型(0普通1连音2顿音)LDiv=LDiv0/SLen;/算出连音音符演奏的长度(多少个10ms)if (FD=1)LDiv=LDiv+LDiv/2;if(XG!=1)if(XG=0)/算出普通音符的演奏长度SM=Tone/10%10;if (SLen0;i-)while(TF1=0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1

22、;TF1=0;if(LDiv2!=0)TR0=0; BeepIO=1;for(i=LDiv2;i0;i-)/ 音符间的间隔 while(TF1=0); TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1;TF1=0;Point+=2;Tone=SoundPoint;Length=SoundPoint+1;BeepIO = 1;* #endif #include #include SoundPlay.h unsigned char code sound1口= 0 x15,0 x02, 0 x00,0 x00 ;/1/*Music*unsigned char co

23、de sound2口= 0 x16,0 x02, 0 x00,0 x00 ;/2unsigned char code sound3口= 0 x17,0 x02, 0 x00,0 x00 ;/3unsigned char code sound4口= 0 x18,0 x02, 0 x00,0 x00 ;/4unsigned char code sound5口= 0 x19,0 x02, 0 x00,0 x00 ;/5unsigned char code sound6= 0 x1A,0 x02, 0 x00,0 x00 ;/6unsigned char code sound7口= 0 x1B,0 x

24、02, 0 x00,0 x00 ;/7unsigned char key;小毛驴unsigned char code Music_Xiao口=0 x15,0 x03, 0 x15,0 x03, 0 x15,0 x03, 0 x17,0 x03,0 x19,0 x03, 0 x19,0 x03, 0 x19,0 x03, 0 x19,0 x03,0 x1A,0 x03, 0 x1A,0 x03, 0 x1A,0 x03, 0 x1F,0 x03,0 x19,0 x02,0 x18,0 x03, 0 x18,0 x03, 0 x1A,0 x03, 0 x1A,0 x03,0 x17,0 x03,

25、0 x17,0 x03, 0 x17,0 x03, 0 x17,0 x03,0 x16,0 x03, 0 x16,0 x03, 0 x16,0 x03, 0 x16,0 x03,0 x6A,0 x02, 0 x19,0 x02,0 x15,0 x03, 0 x15,0 x03, 0 x15,0 x03, 0 x17,0 x03,0 x19,0 x03, 0 x19,0 x03, 0 x19,0 x03, 0 x19,0 x03,0 x1A,0 x03, 0 x1A,0 x03, 0 x1A,0 x03, 0 x1F,0 x03,0 x19,0 x02, 0 x19,0 x02,0 x18,0

26、x03, 0 x18,0 x03, 0 x1A,0 x03, 0 x1A,0 x03,0 x17,0 x03, 0 x17,0 x03, 0 x17,0 x03, 0 x17,0 x03,0 x16,0 x03, 0 x16,0 x03, 0 x16,0 x03, 0 x16,0 x03,0 x15,0 x02,0 x00,0 x00,0 x00,;/找朋友unsigned char code Music_Zhao=0 x19,0 x03, 0 x1A,0 x03, 0 x19,0 x03, 0 x1A,0 x03, 0 x19,0 x03, 0 x1A,0 x03,0 x19,0 x02,

27、0 x19,0 x03, 0 x1F,0 x03,0 x1B,0 x03,0 x1A,0 x03,0 x19,0 x02, 0 x17,0 x02, 0 x19,0 x03, 0 x19,0 x03, 0 x17,0 x03, 0 x18,0 x03, 0 x19,0 x03, 0 x19,0 x03, 0 x17,0 x02,0 x19,0 x03, 0 x19,0 x03, 0 x17,0 x03, 0 x18,0 x03, 0 x19,0 x03, 0 x19,0 x03, 0 x17,0 x02,0 x15,0 x03, 0 x18,0 x03, 0 x17,0 x03, 0 x16,

28、0 x03,0 x15,0 x03,0 x16,0 x03,0 x15,0 x02,0 x00, 0 x00,0 x00;/两只老虎unsigned char code Music_Two口 =0 x15,0 x02, 0 x16,0 x02, 0 x17,0 x02, 0 x15,0 x02,0 x15,0 x02, 0 x16,0 x02, 0 x17,0 x02, 0 x15,0 x02,0 x17,0 x02, 0 x18,0 x02, 0 x19,0 x02,0 x17,0 x02, 0 x18,0 x02, 0 x19,0 x02,0 x19,0 x03, 0 x1A,0 x03,

29、 0 x19,0 x02, 0 x18,0 x03, 0 x17,0 x02, 0 x15,0 x02,0 x15,0 x02, 0 x16,0 x02, 0 x17,0 x02, 0 x15,0 x02,0 x15,0 x02, 0 x16,0 x02, 0 x17,0 x02, 0 x15,0 x02,0 x17,0 x02, 0 x18,0 x02, 0 x19,0 x02,0 x17,0 x02, 0 x18,0 x02, 0 x19,0 x02,0 x19,0 x03, 0 x1A,0 x03, 0 x19,0 x02, 0 x18,0 x03, 0 x17,0 x02, 0 x15

30、,0 x02,0 x17,0 x02, 0 x0f,0 x02, 0 x15,0 x02,0 x17,0 x02, 0 x0f,0 x02, 0 x15,0 x02,0 x17,0 x02, 0 x0f,0 x02, 0 x15,0 x02,0 x19,0 x03, 0 x1A,0 x03, 0 x19,0 x02, 0 x18,0 x03, 0 x17,0 x02, 0 x15,0 x02,0 x19,0 x03, 0 x1A,0 x03, 0 x19,0 x02, 0 x18,0 x03, 0 x17,0 x02, 0 x15,0 x02,0 x17,0 x02, 0 x0f,0 x02,

31、 0 x15,0 x02,0 x17,0 x02, 0 x0f,0 x02, 0 x15,0 x02,0 x00, 0 x00,;*void delayms(unsigned int z)unsigned int x,y;for (x = z; x0; x-) for(y=110; y0; y-);void keyscan()/矩阵键盘扫描函数unsigned char x,y;P3=0 xf0;if (P3!=0 xf0)delayms(10);if (P3!=0 xf0)x=P3&0 xf0;P3=0 x8f;y=P3&0 x8f;key=x|y;while(P3!=0 x8f);swit

32、ch (key)case 0 xe7: key=16;P0=table1;P2_7 = 0;delay(5);P2_7 = 1;P0=table1;P2_6 = 0;delay(5);P2_6 = 1;Play(sound1,0,3,360);break;case 0 xeb: key=15;P0=table2;P2_6 = 0;delay(5);P2_6 = 1;P0=table2;P2_5 = 0;delay(5);P2_5 = 1;Play(sound2,0,3,360);break;case 0 xed: key=14;P0=table3;P2_5 = 0;delay(5);P2_5=

33、 1;P0=table3;P2_4 = 0;delay(5);P2_4= 1;Play(sound3,0,3,360);break;case 0 xee: key=13;P0=table4;P2_4 = 0;delay(5);P2_4 = 1;P0=table4;P2_3 = 0;delay(5);P2_3 = 1;Play(sound4,0,3,360);break;case 0 xd7: key=12;P0=table5;P2_3 = 0;delay(5);P2_3 = 1;P0=table5;P2_2 = 0;delay(5);P2_2 = 1;Play(sound5,0,3,360);

34、break;case 0 xdb: key=11;P0=table6;P2_2 = 0;delay(5);P2_2 = 1;P0=table6;P2_1 = 0;delay(5);P2_1 = 1;Play(sound6,0,3,360);break;case 0 xdd: key=10;P0=table7;P2_1 = 0;delay(5);P2_1 = 1;P0=table7;P2_0 = 0;delay(5);P2_0 = 1;Play(sound7,0,3,360);break;case 0 xb7: key=8;P0=table1;P2_7 = 0;delay(5);P2_7 = 0;P0=table1;P2_6 = 0;delay(5);P2_6 = 0;P0=table1;P2_5 = 0;delay(5);P2_5 = 0;P0=table1;P2_4 = 0;delay(5);P2_4 = 0;P0=table1;P2_3 = 0;delay(5);P2_3= 0;P0=table1;P2_2 = 0;delay(5);P2_2 = 0;P0=table1;P2_1 = 0;delay(5);P2_1 = 0;P0=table1;P2_0 = 0;delay(5);P2_0 = 0;Play(Music_Two,0,3,360);br

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论