




免费预览已结束,剩余13页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
郑州航空工业管理学院单片机课程设计说明书 14 届 电子信息工程 专业 82 班级题 目 学 号 姓 名 指导教师 二一六年 十二 月 二十三 日目 录摘要3一、电子琴的基本原理41.设计的内容2.整体的工作原理3.发音原理二、电子时钟的硬件设计51.硬件原理图2.键盘设计3.时钟电路4.复位电路5.元件清单6.数码管显示部分7.发音部分设计8.硬件调试三、电子时钟的软件设计91.键盘扫描程序2.功能转移程序3.琴键处理程序4.自动播放歌曲程序5.程序流程图6.设计源程序四、课程设计总结与指导教师评语18摘要随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。我们都会抽空欣赏世界名曲,作为对精神的洗礼。本论文设计一个基于单片机的简易电子琴。我们对于电子琴如何实现其功能,如音色选择、声音强弱控制、节拍器、自动放音功能等等也很好奇。电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用AT89S51单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。 关键词:AT89S51单片机 音色 节拍器 自动放音1、 电子琴的基本原理1、本次设计的内容是:利用所给键盘的16,15,14,13,12,11,10,9七个键,能够发出7个不同的音调,而且8,7,6按键可以自动播放歌曲,要求按键按下时发声,当系统扫描到键盘按下,则快速检测出是哪一个按键被按下,然后单片机的定时器启动,发出一定频率的脉冲,该频率的脉冲经喇叭驱动电路放大滤波后,就会发出相应的音调,p1.7控制着蜂鸣器发出声音,在此基础上我们组又增加了数码管显示部分,当发出1,2,3,4,5,6,7音调时通过p2口控制数码管是分别显示1,2,3,4,5,6,7当播放音乐时数码管分别显示1,2,3 。 2、整体工作原理:采用AT89C52单片机作为主控芯片,设置键盘、蜂鸣器等外围器件,另外还用到一些简单器件如:两位数码管,和NPN型三极管及电阻等。利用按键实现音符和音调的输入;两位的数码管进行被操作的按键显示;用NPN型三极管8550实现低音频功率放大;最后用蜂鸣器发音。AT89C52单片机是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。同时具有强大的控制功能和灵活的编程实现特性,由于本设计主要用于人们娱乐方面,因此在设计上尽量使其安全以及简单易操作。具有经济可行性、技术可行性、实物应用性。 3、 发音原理:若要产生音频脉冲,只要算出某一音频的周期(频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将P1.7反相,然后重复计时再反相。就可在P1.7引脚上得到此频率的脉冲。利用STC89C52的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。计算举例,频率为523Hz,其周期T1/5231912s,因此只要令计数器计时956s/1s956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。计数脉冲值与频率的关系式是:Nfi2fr,式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率。其计数初值T的求法如下:T65536N65536fi2fr例如:设K65536,fi1MHz,求中音DO(261Hz)。T65536N65536fi2fr6553610000002fr65536500000/fr,中音DO的T65536500000/52364580STC89C52单片机为12MHZ晶振,中音符与计数T0相关的计数值如表所示: 音符 频率(HZ)计数值(T值)音符频率(HZ)计数值(T值)低1DO 26263628#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高3MI131865157低7SI49464524高4FA139765178中1DO52364580#4FA#149065198#1DO#55464633高5SO156865217中2RE58764633#5SO#166165235#2RE#62264884高6LA176065252中3MI65964732#6LA#186565268中4FA69864820高7SI196765283 用单片机播放音乐,或者弹奏电子琴,实际上是按照特定的频率,输出一连串的方波。为了输出合适的方波,首先应该知道音符与频率的关系。 2、 电子时钟的硬件设计1、 硬件原理图: 本系统有主控芯片STC89C52、发音单元、显示模块、按键模块组成。硬件电路要以单片机作为主控芯片,实现按键输入音符和音调,四位数码管的显示以及低音频功率放大和蜂鸣器发音。 2、键盘设计 单片机系统中,若按键较多时,通常采用矩阵式(也称行列式)键盘。矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上。显然,在按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O口。矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。图-矩阵键盘3、时钟电路 单片机内部具有一个高增益反相放大器,用于构成振荡器。通常在引脚Xl和X2跨接石英晶体和两个补偿电容构成自激振荡器,选择12MHz频率的石英晶体,补偿电容通常选择20pF左右的瓷片电容。4、复位电路单片机小系统常采用上电自动复位和手动按键复位两种方式实现系统的复位操作。上电复位要求接通电源后,自动实现复位操作。手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。上电自动复位通过电容C3充电来实现。手动按键复位是通过按键将电阻R1与VCC接通来实现。5、元件清单 6、 数码管显示部分当发出1,2,3,4,5,6,7音调时通过p2口控制数码管是分别显示1,2,3,4,5,6,7当播放音乐时数码管分别显示1,2,3 。7、发音部分设计 如下图所示,发音电路是由蜂鸣器、三极管、上拉电阻构成。由三极管来驱动扬声器发音的,同时加上拉电阻增强驱动电流,提高驱动能力。图4发音电路8、硬件调试 硬件调试主要是针对单片机部分进行的调试。在上电之前,先确保电路中不存在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况的任务。注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。在确保硬件电路正常且无异常情况(断路或短路)的情况下方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要是检测单片机控制部分、数码管点亮部分、和音频转换电路硬件调试,3、 电子时钟的软件设计1、键盘扫描程序: 检测是否有按键按下,有按键按下则记录按下键的键值,并跳转至功能转移程序;无按键按下,则返回键盘扫描程序继续检测。 2、功能转移程序: 对检测到的按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即音色调节功能和自动播放乐曲的功能。 3、琴键处理程序:根据检测到的按键值,查询音调表,给计时器赋值,使发出相应频率的声音。 4、自动播放歌曲程序:检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放的歌曲,歌曲播放完毕之后自动返回至键盘扫描程序,继续等待是否有按键按下。 5、程序流程图 图5 流程图 6、设计源程序: /*说明* 曲谱存贮格式 unsigned char code MusicName音高,音长,音高,音长., 0,0;末尾:0,0 表示结束(Important)音高由三位数字组成:个位是表示 17 这七个音符 ;十位是表示音符所在的音区:1-低音,2-中音,3-高音;百位表示这个音符是否要升半音: 0-不升,1-升半音。音长最多由三位数字组成: 个位表示音符的时值,其对应关系是: |数值(n): |0 |1 |2 |3 | 4 | 5 | 6 |几分音符: |1 |2 |4 |8 |16 |32 |64 音符=2n 十位表示音符的演奏效果(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 SYSTEM_OSC 12000000/定义晶振频率12000000HZ#define SOUND_SPACE 4/5 /定义普通音符演奏的长度分率,/每4分音符间隔#define uchar unsigned char sbit P2_0 = P20;sbit P2_1 = P21;sbit P2_2 = P22;sbit P2_3 = P23;sbit P2_4 = P24;sbit P2_5 = P25;sbit P2_6 = P26;sbit P2_7 = P27;sbit BeepIO = P17;/定义输出管脚uchar code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90;unsigned int 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 delay(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 |= 0x11;ET0 = 1;ET1 = 0;TR0 = 0;TR1 = 0;EA = 1;void BeepTimer0(void) interrupt 1/音符发生中断BeepIO = !BeepIO;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,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 != 0x00)/计算歌曲长度SoundLength+=2;Point = 0;Tone = 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; /高音Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);/计算计数器初值Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%256; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0 + 12; /加12是对中断延时的补偿 SLen=LengthTabLength%10; /算出是几分音符XG=Length/10%10; /算出音符类型(0普通1连音2顿音) FD=Length/100;LDiv=LDiv0/SLen; /算出连音音符演奏的长度(多少个10ms)if (FD=1) LDiv=LDiv+LDiv/2;if(XG!=1)if(XG=0) /算出普通音符的演奏长度 if (SLen0;i-) /发规定长度的音 while(TF1=0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;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/*Music*unsigned char code sound1= 0x15,0x02, 0x00,0x00 ;/1unsigned char code sound2= 0x16,0x02, 0x00,0x00 ;/2unsigned char code sound3= 0x17,0x02, 0x00,0x00 ;/3unsigned char code sound4= 0x18,0x02, 0x00,0x00 ;/4unsigned char code sound5= 0x19,0x02, 0x00,0x00 ;/5unsigned char code sound6= 0x1A,0x02, 0x00,0x00 ;/6unsigned char code sound7= 0x1B,0x02, 0x00,0x00 ;/7unsigned char key;/小毛驴 unsigned char code Music_Xiao=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,0x02, 0x18,0x03, 0x18,0x03, 0x1A,0x03, 0x1A,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03,0x16,0x03, 0x16,0x03, 0x16,0x03, 0x16,0x03,0x6A,0x02, 0x19,0x02, 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,0x02, 0x19,0x02,0x18,0x03, 0x18,0x03, 0x1A,0x03, 0x1A,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03,0x16,0x03, 0x16,0x03, 0x16,0x03, 0x16,0x03,0x15,0x02,0x00,0x00,0x00,;/找朋友unsigned char code Music_Zhao=0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x1A,0x03,0x19,0x02, 0x19,0x03, 0x1F,0x03,0x1B,0x03,0x1A,0x03,0x19,0x02, 0x17,0x02, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x02,0x19,0x03, 0x19,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x02,0x15,0x03, 0x18,0x03, 0x17,0x03, 0x16,0x03,0x15,0x03,0x16,0x03,0x15,0x02,0x00, 0x00,0x00;/两只老虎 unsigned char code Music_Two =0x15,0x02, 0x16,0x02, 0x17,0x02, 0x15,0x02, 0x15,0x02, 0x16,0x02, 0x17,0x02, 0x15,0x02, 0x17,0x02, 0x18,0x02, 0x19,0x02, 0x17,0x02, 0x18,0x02, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x19,0x02, 0x18,0x03, 0x17,0x02, 0x15,0x02, 0x15,0x02, 0x16,0x02, 0x17,0x02, 0x15,0x02, 0x15,0x02, 0x16,0x02, 0x17,0x02, 0x15,0x02, 0x17,0x02, 0x18,0x02, 0x19,0x02, 0x17,0x02, 0x18,0x02, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x19,0x02, 0x18,0x03, 0x17,0x02, 0x15,0x02, 0x17,0x02, 0x0f,0x02, 0x15,0x02, 0x17,0x02, 0x0f,0x02, 0x15,0x02, 0x17,0x02, 0x0f,0x02, 0x15,0x02, 0x19,0x03, 0x1A,0x03, 0x19,0x02, 0x18,0x03, 0x17,0x02, 0x15,0x02, 0x19,0x03, 0x1A,0x03, 0x19,0x02, 0x18,0x03, 0x17,0x02, 0x15,0x02, 0x17,0x02, 0x0f,0x02, 0x15,0x02, 0x17,0x02, 0x0f,0x02, 0x15,0x02,0x00, 0x00,;/*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=0xf0;if (P3!=0xf0) delayms(10); if (P3!=0xf0) x=P3&0xf0; P3=0x8f; y=P3&0x8f; key=x|y; while(P3!=0x8f); switch (key) case 0xe7: 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 0xeb: 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 0xed: key=14; P0=table3;P2_5 = 0;delay(5);P2_5= 1; P0=table3;P2_4 = 0;delay(5);P2_4= 1; Play(sound3,0,3,360); break; case 0xee: 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 0xd7: 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); break; case 0xdb: 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 0xdd: 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 0xb7: 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); break; case 0xbb: key=7; P0=table2;P2_7 = 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 货场仓储物流项目概况
- 法学引领社会进步
- 老旧厂区改造项目总体规划
- 双创教育在学院建设中的实践与推动
- 本科生涯回顾与展望
- 农机买卖保障协议书
- 2025年自建房屋购房合同示范文本
- 2025财产保险代理合同模板参考:量身定制您的保险代理协议
- 早产儿护理重点
- 你好英文测试题及答案
- 工程测试技术试题及答案
- 2025年下半年湖南永州蓝山县事业单位招聘工作人员38人易考易错模拟试题(共500题)试卷后附参考答案
- 火锅店员工合同协议书
- 雇人包工免责协议书
- 船舶应急部署表及船员应变卡
- 2025年下半年山东能源集团权属企业内蒙古荣信化工限公司社会招聘易考易错模拟试题(共500题)试卷后附参考答案
- 陕西邮政校招笔试题及答案
- 山东省济南市2025届高三三模历史试卷(含答案)
- 小学语文大单元整体教学设计讲座
- 风力发电场调试规程
- 2024-2025学年广东省深圳市高一数学下学期7月期末考试(附答案)
评论
0/150
提交评论