可振动感应切换的电子音乐_第1页
可振动感应切换的电子音乐_第2页
可振动感应切换的电子音乐_第3页
可振动感应切换的电子音乐_第4页
可振动感应切换的电子音乐_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

-可振动感应的电子音乐一、设计目的1、通过无源蜂鸣器与振动传感器外接模块实现电子音乐的切换功能。2、学习相关器件的知识,更深入的了解单片机的构成及作用,并能运用单片机处理生活中的问题。二、硬件原理1、振动传感器三、软件原理1、按键消抖原理:当按键被按下的时候,电路导通接地,I/O口为低电平;当按键未被下时,电路断开,I/O口保持高电平的。但一般的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,假如不加以处理,会导致按键被识别为按下多次。为了不产生这种现象而作的措施就是按键消抖。方法1:使用延时如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。2、定时器中断原理:中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。当中央处理机正在处理*事件时外界发生紧急请求,CPU将暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的工程则为中断。. z.-定时器0和1的中断请求标志位是TF0和TF1,当定时器寄存器出现溢出时,溢出标志位会被置位,如果定时器0/1的中断被打开,则定时器中断发生,当单片机去处理该中断时,定时器的溢出标志位会被硬件清除。3、振动感应播放原理:振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。每一个音符的发声频率是不同的,我们需要用计时器来精确计时,用以产生方波,这样才能发出不用的音符声音。C调各音符频率与计数值如图1所示,以下的简谱码是在晶振为12MHz的情况下计算的,换算为16进制的简谱码如程序中quzi[]数组所示。图1C调各音符频率与计数值本程序中,数组music[]即是要播放的音乐,格式为音符,节拍,音符,节拍,如此循环下去。音符为要发出的音调,而节拍则是声音的持续时间。如图,在数组music[]中,音符表示的格式为:十位代表是低八度,中八度还是高八度,1代表高八度,2代表中八度,3代表高八度,个位代表简谱的音符,例如,0*15代表低八度的S0,如图即是低5S0,0*21代表中八度的DO,如图即是中1D0。音符中,0*00代表结束符,表示整首歌曲演唱完毕,而0*ff代表休止符,表示要休止100ms。遇到这两种情况,都应该重新执行循环中的第一步。其余情况则是正常播放。在定时器中断中进行振动/倒置传感器的检测,因为每播放完一个音节(产生一个方波),都重新启动了定时器。相当于在每个音节播放完就检测1次振动/倒置传感器的状态。程序烧入单片机后,会自动进行演奏。相比基础篇,在去除了按键控制后,在其中添加了振动切歌的新功能。4、芯片振动传感器相关引脚:4芯片振动传感器相关引脚四、软件流程与相关代码1、软件流程a.创建工程文件b.编写代码c.编译运行. z.-d.创建He*文件e.下载编程2、相关代码/**********************文件名称:v_music.c作者:机智的璐璐璐璐说明:进行音乐播放的例程,按下key1键后开始播放音乐修改记录:***********************//**********************基于STC15F2K60S2系列单片机C语言编程实现使用如下头文件,不用另外再包含"REG51.H"***********************/#include<STC15F2K60S2.h>#defineuintunsignedint#defineucharunsignedcharsbitKey1=P3^2; //Key1对应触发外部中断0sbitbeep=P3^4; //蜂鸣器sbitvibrate=P2^4; //振动传感器uchartimeh,timel,jindu=0,gequ=0,zanting=0; //定义定时器的重装值bitflag;//播放标志位ucharcodemusic1[]={//音乐代码,歌曲为《生日快乐》,格式为:音符,节拍,音符,节拍,//音符的十位代表是低八度,中八度还是高八度,1代表高八度,2代表中八度,3代表高. z.-八度//个位代表简谱的音符,例如0*15代表低八度的S0,0*21代表中八度的DO。//节拍则是代表音长,例如:0*10代表一拍,0*20代表两拍,0*05代表1/2拍0*15,0*05,0*15,0*05,0*16,0*10,0*15,0*10,0*31,0*10,0*17,0*20,0*15,0*05,0*15,0*05,0*16,0*10,0*15,0*10,0*32,0*10,0*31,0*20,0*15,0*05,0*15,0*05,0*35,0*10,0*33,0*10,0*31,0*10,0*17,0*10,0*16,0*10,0*34,0*05,0*34,0*05,0*33,0*10,0*31,0*10,0*32,0*10,0*31,0*10,0*00,0*00};ucharcodemusic2[]={ //歌曲为小毛驴0*21,0*05,0*21,0*05,0*21,0*05,0*23,0*05,0*25,0*05,0*25,0*05,0*25,0*05,0*25,0*05,0*26,0*05,0*26,0*05,0*26,0*05,0*31,0*05,0*25,0*20,0*24,0*05,0*24,0*05,0*24,0*05,0*26,0*05,0*23,0*05,0*23,0*05,0*23,0*05,0*23,0*05,0*22,0*05,0*22,0*05,0*22,0*05,. z.-0*22,0*05,0*25,0*15,0*25,0*05,0*21,0*05,0*21,0*05,0*21,0*05,0*23,0*05,0*25,0*05,0*25,0*05,0*25,0*05,0*25,0*05,0*26,0*05,0*26,0*05,0*26,0*05,0*31,0*05,0*25,0*20,0*24,0*05,0*24,0*05,0*24,0*05,0*26,0*05,0*21,0*05,0*21,0*05,0*21,0*05,0*23,0*05,0*25,0*05,0*25,0*05,0*25,0*05,0*25,0*05,0*26,0*05,0*26,0*05,0*26,0*05,0*31,0*05,0*25,0*20,0*24,0*05,0*24,0*05,0*24,0*05,0*23,0*03,0*23,0*03,0*23,0*03,0*23,0*03,0*23,0*05,0*23,0*05,0*22,0*05,0*22,0*05,0*22,0*05,0*23,0*05,0*21,0*20,0*00,0*00};ucharcodemusic3[]={ //歌曲为天空之城0*16,0*05,0*17,0*05,0*21,0*15,0*17,0*05,0*21,0*10,0*23,0*10,0*17,0*30,0*23,0*10,. z.-0*16,0*15,0*15,0*05,0*16,0*10,0*21,0*10,0*15,0*30,0*13,0*10,0*14,0*15,0*13,0*05,0*14,0*05,0*21,0*05,0*21,0*10,0*13,0*30,0*21,0*10,0*17,0*10,0*14,0*05,0*14,0*10,0*17,0*10,0*17,0*20,0*ff,0*16,0*05,0*17,0*05,0*21,0*15,0*17,0*05,0*21,0*10,0*23,0*10,0*17,0*30,0*13,0*05,0*13,0*05,0*16,0*15,0*15,0*05,0*16,0*10,0*21,0*10,0*15,0*30,0*13,0*10,0*14,0*10,0*21,0*05,0*17,0*05,0*17,0*10,0*21,0*10,0*22,0*10,0*23,0*05,0*21,0*20,0*ff,0*21,0*05,0*17,0*05,0*16,0*10,0*17,0*10,0*15,0*10,0*16,0*20,0*ff,0*21,0*05,0*22,0*05,0*23,0*15,0*22,0*10,0*23,0*10,0*24,0*10,0*25,0*05,0*22,0*30,. z.-0*15,0*10,0*22,0*03,0*21,0*03,0*17,0*03,0*21,0*03,0*21,0*10,0*21,0*05,0*22,0*10,0*23,0*05,0*23,0*40,0*16,0*05,0*17,0*05,0*21,0*10,0*17,0*05,0*21,0*05,0*22,0*10,0*21,0*15,0*15,0*05,0*15,0*20,0*24,0*10,0*23,0*10,0*22,0*10,0*21,0*10,0*23,0*30,0*16,0*05,0*17,0*05,0*21,0*15,0*17,0*05,0*21,0*10,0*23,0*10,0*17,0*30,0*13,0*10,0*16,0*15,0*15,0*05,0*16,0*10,0*21,0*10,0*15,0*30,0*13,0*10,0*14,0*10,0*21,0*05,0*17,0*05,0*17,0*10,0*21,0*10,0*22,0*10,0*23,0*05,0*21,0*05,0*21,0*20,0*21,0*05,0*17,0*05,0*16,0*10,0*17,0*10,0*15,0*10,0*16,0*40,0*00,0*00};ucharcodequzi[]={//此数组数据为各个音符在定时器中的重装值,第一列是高位,第二列是低位. z.-0*f8,0*8c,0*f9,0*5b,0*fa,0*15,0*fa,0*67,0*fb,0*04,0*fb,0*90,0*fc,0*0c,0*fc,0*44,0*fc,0*ac,0*fd,0*09,0*fd,0*34,0*fd,0*82,0*fd,0*c8,0*fe,0*06,0*fe,0*22,0*fe,0*56,0*fe,0*6e,0*fe,0*9a,0*fe,0*c1,0*fe,0*e4,0*ff,0*03

//低八度,低1//低3//低5//低7//中央C调//中2//中4//中6//高八度,高1//高3//高5//高7};/**********************函数名称:voiddelay(unsignedint*ms)功能描述:延时入口参数:*ms:输入需要延时的毫秒值出口参数:无备注:***********************/voiddelay(unsignedint*ms). z.-{uinti,j;for(i=*ms;i>0;i--)for(j=124;j>0;j--);}/**********************函数名称:ucharquyin(uchartem)功能描述:在quzi数组中,找到music数组定义的简谱音符的重装值,并返回其在quzi数组中的位置入口参数:tem:music数组中定义的简谱音符出口参数:返回的是tem音符在quzi数组中的位置值备注:***********************/ucharquyin(uchartem){ucharqudiao,jp,weizhi; //定义曲调,音符和位置qudiao=tem/16; //高4位是曲调值jp=tem%16; //低4位是音符if(qudiao==1) //当曲调值为1时,即是低八度,低八度在quzi数组中基址为0qudiao=0;elseif(qudiao==2) //当曲调值为2时,即是中八度,中八度在quzi数组中基址为14qudiao=14;elseif(qudiao==3) //当曲调值为3时,即是高八度,高八度在quzi数组中,基址为28qudiao=28;weizhi=qudiao+(jp-1)*2; //通过基址加上音符作为偏移量,即可定位此音符在quzi数组中的位置returnweizhi; //返回这一个位置值}.

z.-/**********************函数名称:voidplaymusic()功能描述:播放音乐入口参数:无出口参数:无备注:***********************/voidplaymusic(){ucharp,m,tem; //m为节拍while(1){ while(zanting)beep=0;if(gequ==0) //歌曲选择位为0,则播放第一首歌{p=music1[jindu]; //如果碰到结束符,延时1秒,回到开始再来一遍if(p==0*00){jindu=0;delay(1000);break;}elseif(p==0*ff) //若碰到休止符,延时100ms,继续取下一音符{jindu=jindu+1;delay(100);TR0=0;break;}else //正常情况下取音符和节拍. z.-{tem=quyin(music1[jindu]); //取出当前音符在quzi数组中的位置值timeh=quzi[tem];//把音符相应的计时器重装载值赋予timeh和timeltimel=quzi[tem+1];jindu++;TH0=timeh;//把timeh和timel赋予计时器TL0=timel;m=music1[jindu];//取得节拍jindu++;}TR0=1;delay(m*180);TR0=0;

//开定时器1//等待节拍完成,通过P3^4口输出音频//关定时器1}elseif(gequ==1)

//歌曲选择位为1,则播放第二首歌{p=music2[jindu];

//如果碰到结束符,延时1秒,回到开始再来一遍if(p==0*00){jindu=0;delay(1000);break;}elseif(p==0*ff)

//若碰到休止符,延时100ms,继续取下一音符{jindu=jindu+1;delay(100);TR0=0;break;}.

z.-else //正常情况下取音符和节拍{tem=quyin(music2[jindu]); //取出当前音符在quzi数组中的位置值timeh=quzi[tem];//把音符相应的计时器重装载值赋予timeh和timeltimel=quzi[tem+1];jindu++;TH0=timeh;//把timeh和timel赋予计时器TL0=timel;m=music2[jindu];//取得节拍jindu++;}TR0=1;delay(m*300);TR0=0;

//开定时器1//等待节拍完成,通过P3^4口输出音频//关定时器1}elseif(gequ==2)

//歌曲选择位为2,则播放第三首歌{p=music3[jindu];

//如果碰到结束符,延时1秒,回到开始再来一遍if(p==0*00){jindu=0;delay(1000);break;}elseif(p==0*ff) //若碰到休止符,延时100ms,继续取下一音符{jindu=jindu+1;delay(100);TR0=0;break;. z.-}else //正常情况下取音符和节拍{tem=quyin(music3[jindu]);//取出当前音符在quzi数组中的位置值timeh=quzi[tem];//把音符相应的计时器重装载值赋予timeh和timeltimel=quzi[tem+1];jindu++;TH0=timeh;//把timeh和timel赋予计时器TL0=timel;m=music3[jindu];//取得节拍jindu++;}TR0=1;delay(m*200);TR0=0;

//开定时器1//等待节拍完成,通过P3^4口输出音频//关定时器1}}}/**********************函数名称:voidinit_sys()功能描述:系统初始化,功能是配置IO口入口参数:无出口参数:无备注:***********************/voidinit_sys(){P0M0=0*ff;P0M1=0*00;P2M0=0*08;. z.-P2M1=0*00;P3M0=0*10;P3M1=0*00;P4M0=0*00;P4M1=0*00;P5M0=0*00;P5M1=0*00;}/**********************函数名称:voidinit()功能描述:定时器和外部中断的初始化入口参数:无出口参数:无备注:***********************/voidinit(){TMOD=0*01;TH0=0*D8;TL0=0*EF;IE=0*87;//IP=0*02;IP=0*

温馨提示

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

评论

0/150

提交评论