您好,欢迎访问三七文档
让单片机奏乐-单片机电子琴实验让单片机奏乐-单片机电子琴实验实验目的用分立电子元件制作报警器或简易电子琴一直是传统电子入门实验或电子小制作的主打科目。现在,用单片机做此类实验已成为单片机学习入门级的必修课程之一。而且,因单片机自带有定时器,用单片机比分立元件在硬件搭建上要简便。使用超简单单片机学习套材中的音响模块则使这一工作变得更加简单。另外,BASCOM中开发有专门的发生语句:SOUND,使得程序实现也非常简单,因此,这个实验非常适合在较低水平的中小学生中开展。因为可以发声,可以演奏自己喜欢的乐曲,是个充满乐趣的单片机实验,所以这个实验是中小学生学习单片机非常好的入门教材。大多数单片机学习板都是带一个蜂鸣器来做音响实验,蜂鸣器因其自身特点,只适合做一些报警器之类的实验,做音乐方面的实验时,音质实在难以接受。超简单单片机实验套材中的音响模块使用Φ35mm的小喇叭,配有音量调节和耳机插孔,使用者可以控制音量或是戴上耳机而不会影响他人,这就很适合在课堂上开展多人的活动。在调试阶段互不干扰,最后再各自拿出自己的作品予以展示。难度等级:初级电子乐常识物理音高与音乐音高从物理学中声学的角度讲,声音分为噪音和乐音,无规律的振动称为噪音,而有规律的振动则称为乐音。好多个有规律的振动按照一定的关系排列在一起则构成了音列。人类对自然界中的声音经过大量的研究后,从中找到了CDEFGAB这七个基本音级,其中A的频率是440赫兹,我们人为地把A定作标准音,只要振动频率达到440赫兹的音就是A,这个音不但用于乐器当中,就是在生活中应用的也比较多,例如:汽车的喇叭声和电话的振铃声音都是A音。根据这个标准音推算出C的频率为261赫兹等,这种用数学方法算出来的音高我们称之为“物理音高”。现在已有专门测量音高的仪器,选定几个音用仪器去校对,如果同仪器的音一致就不显示,若同仪器的音高不一致则会提示你是偏高或偏低。物理上的音高属于纯理论的音高、是一种物理现象,但在实际生活中,音乐音高与物理音高有很大的差别。我们在演奏之前,先要同标准音A校对,而后再根据五度关系把其它几根弦调准。这个时候如果用频率仪器测量的话,会发现实际音高和测量音高存在差异,实际音高已经比较准了,但测量后的音高有些不准。经研究调查,也证实了实际音高与物理音高存在误差,这个误差一般为四、五个音分左右。我们的耳朵不但听不出来这个误差而且听上去还很和谐。这仅仅是调弦时的音准,在实际演奏乐曲当中随着乐思的变化,实际音高与物理音高不可避免存在许多差异,我们把这种实际音高称为“音乐音高”。音乐是用来表达人或物的思想感情的,无论是自己演奏还是听别人演奏,能充分表达乐曲的思想内涵,音准就显得尤为重要了。由此可以看出,物理音高是一种机械的、单一的,纯理论的音准概念,而音乐音高是一种灵活的、多变的、带有人的思想感情的音准概念。物理音高是音乐音高的基础,音乐音高是物理音高的升华和体现,二者相辅相成、缺一不可。音乐中使用的有固定音高的音(即乐音)的总和称乐音体系。按现在通用的十二平均律,从最低音(每秒振动16次左右)到最高音(每秒振动4186次),整个乐音体系中约有97个音。乐音体系中的音,按照上行即从低到高或下行即由高到低的次序排列起来的音叫做音列。我们在钢琴上可以明显地看出乐音体系中所使用的音和音列。现代标准的钢琴是音域最宽的乐器,有88个键,能奏出88个音高不同的乐音,也就是说钢琴由88个音高各不相同的音。除此之外的音很少用在音乐中。用单片机定时器产生音符的方法要想让单片机发出音乐声,其实很简单,用单片机的定时器产生出与音符频率对应数量的脉冲即可。首先要搞懂几个量值,他们是定时器频率;要发出的乐音或音符的频率;计数脉冲值;和定时器初值。定时器初值与计数脉冲的关系如下:T=K-NK:=0xFFFF+1,即16位定时器发生溢出中断的数值,即十进制的65536T:定时器初值N:计数脉冲值这里定时器一般都工作在溢出中断的模式,对一个16位的定时器来说,定时计数的最大值为0xFFFF,再加1就溢出了,从而发生中断。所以要想在指定的脉冲数发生后产生中断,就要用这个最大值K减需要的脉冲数N,得出定时器初值T。计数脉冲值与音符频率的关系如下:N=Ft/2/FmN:计数脉冲值Ft:定时器时钟频率Fm:要产生的音符频率上式表示的是定时器的工作原理。要产生某个音符的音频脉冲,只要算出这个音频的周期即1/频率,然后将此周期除以2,即为半周期的时间。利用定时器计时这个半周期时间,每当计时到后(发生中断,在中断服务程序中要处理的事情)就将输出脉冲的I/O反相,如此反复就可在I/O脚上得到此频率的50%占空比的脉冲。举例:设K=65536,定时器时钟频率Ft=1MHz(注),给定为1MHz,即内部计时一次为1uS。求低音DO(262Hz)、中音DO(523Hz)、高音DO(1046Hz)的定时器初值。T=65536-N=65536-Ft÷2÷Fm=65536-1000000÷2÷Fm=65536-500000/Fm低音DO的T=65536-500000/262=63627中音DO的T=65536-500000/523=64580高音DO的T=65536-500000/1046=65058注:定时器时钟频率由所选单片机的系统时钟决定,例如AVR的Atmega48缺省系统时钟是8MHz,经8分频后就可以得到1MHz的定时器时钟频率。音符—音符频率—计数脉冲—定时器初值对照表音符FrNT低音12621908636281#27718056373122941701638352#311160863928333015156402143491433641034#37013516418553921276642605#41512056433164401136644006#4661073644637494101264524中音1523956645801#554903646332578865646712#622804647323659759647774698716648204#740676648605784638648985#831602649346880568649686#93253665000798850665030高音11046478650581#11094516508521175426651102#124540265134313183796515741397358651784#14803386519851568319652175#16613016523561760284652526#1865268652687197625365283硬件搭建本实验用超简单单片机实验套材中的AVR主板和音响模块完成。取C型3位跳线一根,一端接AVR实验主板的PORTC.0位置,另一段接音响模块的J1插座。取1位跳线一根,一端插在AVR主板端口PORTD的(PD)0位置,一端悬空。实验开始时,将一线眺线的悬空端接触AVR主板上的GND(地)插针排的任意引脚,即启动演奏。程序代码'----------------------------------------------------------------------------------------------------$regfile=m48def.dat$crystal=8000000DimSAsInteger,FAsIntegerDimAAsByteConfigPind.0=InputPortd.0=1ConfigPortc.0=OutputPortc.0=1DoBitwaitPind.0,ResetRestoreMusic_1DoReadS:ReadFIfS=0AndF=0ThenExitDoSoundPortc.0,S,FLoopPortc.0=1LoopEndMusic_1:Data150%,1276%,50%,1276%Data200%,1137%,200%,1276%Data200%,956%,400%,1012%Data150%,1276%,50%,1276%Data200%,1137%,200%,1276%Data200%,865%,400%,956%Data150%,1276%,50%,1276%Data200%,638%,200%,759%Data200%,956%,200%,1012%Data200%,1136%,150%,717%Data50%,717%,200%,759%Data200%,956%,200%,865%Data400%,956%,0%,0%'目标单片机为ATmega48'使用内部8M晶振'''设置PD0口作为输入口'设置PD0口的上拉电阻有效'设置PC0口作为输出口'PC0输出高电平''等待直到PD0口为低电平'程序指向乐曲数据''读入节拍值和音符值'均为0结束乐曲'演奏乐音''PC0输出高电平'''生日快乐的乐曲数据'''''''''''''程序讲解BASCOM中有关音乐演奏的语句SOUNDpin,duration,pulsespin:是用来产生乐音的I/O口duration:乐音延续时间,也就是节拍pulses:要发出乐音脉冲数(N)本程序非常简单,演奏《生日快乐》歌。端口PORTD.0用作开始演奏的启动开关,程序初始化时,置高电位,然后等待该端口变为低(开关按下)。然后循环从乐曲数据处读取节拍和乐音,从端口PORTC.0发出乐音,直至节拍和乐音都为0,结束。乐曲数据的排放顺序是:节拍、乐音脉冲数。读者可以试着改变节拍的数值,看看效果如何。观看演示//--------------------------------------------------------------------------////源程序大公开////(c)COPYRIGHT2001-2002xuwenjun////AllRightsReserved////V1.00////--------------------------------------------------------------------------////标题:单片机IO口播放乐曲////版本:V1.00////文件名:xwj_lcd16.C////创建人:徐文军E-mail:xuwenjun@21cn.com////日期:02-11-5////描述:单片机利用T1中断在IO口P1.0输出乐曲////声明:////以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处.////如用于商业用途请与作者联系.E-mail:xuwenjun@21cn.com////有问题请mailtoxuwenjun@21cn.com欢迎与我交流!////--------------------------------------------------------------------------////修改人:徐文军E-mail:xuwenjun@21cn.com////日期:02-11-5////说明:////单片机用T1中断在IO口P1.0输出乐曲(在P1.0口与VCC间接一喇叭即可听到)////1.由于输出的是方波,比较难听:-)你也可以将波形细分用DA输出正弦波////2.由于T1频繁中断,任何其他中断发生都会是乐曲打顿,只适合试验////3.优化音符编码:一个字节中包含节拍、音符、升降调,可区分数据和命令////同时人工将音符译为机器码非常容易。(格式看下面实例)////--------------------------------------------------------------------------//#includereg52.h#includeintrins.h#defineFREQ11059200//音乐_编码2--存储器定义//unsignedCHARcodemusic_tab1[]={//音符码格式:|D7|D6D5D4|D3|D2D1D0|//梁祝|变调
本文标题:电子琴详解
链接地址:https://www.777doc.com/doc-76037 .html