单片机课程设计报告(利用蜂鸣器播放音乐).doc
.成绩 课程设计:电子设计题目名称:音乐流水灯姓 名:戴锦超 学 号:08123447 班 级:信科12-3班 完成时间:2014年10月23日 1设计的任务 设计内容:动手焊接一个51单片机设计目标:利用单片机上的蜂鸣器以及二极管实现音乐播放以及根据音乐的节奏而规律性闪亮的二极管。并且通过程序调节音乐节奏的快慢。2 设计的过程2.1 基本结构1.STC89C52RC在本次的试验中采用了STC89C52RC单片机,STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期,工作电压:5.5V3.3V(5V单片机)/3.8V2.0V(3V单片机),工作频率范围:040MHz,相当于普通8051的080MHz,实际工作频率可达48MHz,用户应用程序空间为8K字节。 (STC89C52RC引脚图)STC89C52RC单片机的工作模式:(1) 典型功耗<0.1A,可由外部中断唤醒,中断返回后,继续执行原程序(2) 空闲模式:典型功耗2mA(3) 正常工作模式:典型功耗4Ma7mA(4) 唤醒,适用于水表、气表等电池供电系统及便携设备2.蜂鸣器及其工作原理:蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。本实验采用的是电磁式蜂鸣器。蜂鸣器按其是否带有信号源又分为有源和无源两种类型。有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。无源蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。本实验采用的是有源蜂鸣器。(蜂鸣器与单片机连接电路图)2.2 软件设计过程1. 蜂鸣器发声原理本实验由于采用有源蜂鸣器,只需将引脚端口P14清零,蜂鸣器即可发声;P14置位,蜂鸣器停止发声。采用置1置0的方法只能使蜂鸣器发声或停止发声,想要使蜂鸣器发出声音,必须对蜂鸣器发出声音的音频和节拍进行控制。(音乐基础音调:不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone。把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。两个音之间的距离有两个“半音”,就叫“全音”。在钢琴等键盘乐器上,CD、DE、FG、GA、AB两音之间隔着一个黑键,他们之间的距离就是全音;EF、BC两音之间没有黑键相隔,它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上号或者b号的叫变化音。叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。例如高音DO的频率(1046Hz)刚好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)刚好是低音DO频率(266 Hz)的一倍;同样的,高音RE的频率(1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音RE的频率(587Hz)刚好是低音RE频率(294 Hz)的一倍。节拍:节拍是让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s,则1/4 拍为0.125s。至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。)1) 控制发声频率要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。利用STC89C52RC的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0从而产生不同频率。此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为0x00,则表示曲子终了;若查表结果为0xff,则产生相应的停顿效果。以标准音高A为例,A的频率是440Hz,周期T=1/440=2272us。在占空比为50%的情况下,导通时间=断开时间=半周期t=2272us/2=1136us,利用P34端口的位操作,经过不断地反相变换即可得到标准音高A的音频脉冲。端口导通时间与断开时的时间利用定时器实现。具体的方法是将单片机定时器的中断触发时间设为半周期t,这样每隔半周期端口反相,输出连续的对应音高的频率。设晶振的频率为f0,中断触发时间(半周期)为t,定时器工作在模式1时计数器的初值为THL,高8位为THL,低8位为TL。时钟周期即为1/f0,定时器每一次累加用去一个机器周期,一个机器周期包含12个时钟周期,即定时器每次加一所用时间是12/f0。定时器在模式1下计时采用16位数,最大计数为216-1(65535),再次加一(65536)溢出触发中断。根据以上分析可得如下关系:音频对应定时器初值的高8位TH=THL/(28)=(65536-t*f/12)/256;音频对应定时器初值的低8位TL=THL%(28)=(65536-t*f/12)%256;附:八度12音阶定时器初值表(只含自然音)低音音名频率Hz晶振12MHz中音音名频率Hz晶振12MHz高音音名频率Hz晶振12MHzDo2620xF885Do5230xFC43Do10460xFE21Re2940xF95ARe5870xFCADRe11750xFE56Mi3300xFA13Mi6590xFD0AMi13180xFE85Fa3490xFA68Fa6980xFD34Fa13970xFE9ASo3920xFB04So7840xFD82So15680xFEC1La4400xFB90La8800xFDC8La17600xFEE4Si4940xFC0CSi9880xFE06Si19760xFF032)控制发声节拍每个音符的节拍可通过延时一定的时间来实现,在具体实现时需要有一个基本的带参延时程序,用于主函数根据不同的音符调用不同的时延。若以十六分之一音符的时长为基本延时时间,则十六分音符只需调用一次延时程序,八分音符则需调用两次延时程序,以此类推。*简谱编码将简谱中的每个音符进行编码,每个音符用一个unsigned char字符类型表示,简谱可用一个unsigned char字符数组表示。字符的前四位表示音频,可以表示0-f共十六个音符。本实验中采用了中音区和高音区。中音do-si分别编码为17,高音do-si分别编码为8E,停顿编为0。字符的后四位表示节拍,节拍以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。以0xff作为曲谱的结束标志。程序从数组中取出一个数,然后分离出高4位得到音调 ,将值赋给定时器0,得到音调;接着分离出该数的低4位,得到节拍。本实验中播放音乐使用简谱如下:将其编码成:uchar code sb=/定义送别简谱0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x00,0x00,0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,0x18,0x00,0x00,0x64,0x84,0x88,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x62,0x52,0x32,0x12,0x28,0x00,0x00,0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,0x18,0x00,0x00,0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x00,0x00,0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,0x18,0x00,0x00;2.3 程序流图及说明(主程序流程图)程序代码:#include <reg52.h>#define uchar unsigned char#define uint unsigned intuint a=0;/全局变量控制速度变换sbit fm=P14;/蜂鸣器控制端口sbit int0=P32;sbit int1=P33;uchar timeh,timel;/用于存放定时器的高8位和低8位uchar code sb=/定义送别简谱0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x00,0x00,0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,0x18,0x00,0x00,0x64,0x84,0x88,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x62,0x52,0x32,0x12,0x28,0x00,0x00,0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,0x18,0x00,0x00,0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x00,0x00,0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,0x18,0x00,0x00;/适合12M的晶振定时器初值表,高低8位分开uchar code chuzhi= 0xff,0xff,/占位 0xFC,0x43,/中央C调1-7 0xFC,0xad, 0xFd,0x0a, 0xFD,0x34, 0xFD,0x82, 0xFD,0xc8, 0xFE,0x06, 0xFe,0x21,/高音 0xFe,0x56, 0xFe,0x85, 0xFe,0x9a, 0xFe,0xc1, 0xFe,0xe4, 0xFf,0x03, 0xFc,0x0c /0xF8,0x18,/高八度1-7 ;void timer0() interrupt 1 /定时器0中断服务程序TH0=timeh;/将timeh赋给计时器的高8位TL0=timel; /将timel赋给计时器的低8位fm=fm; /定时器每次到时将蜂鸣器反相void delay(uint z)/延时165MS,即十六分音符uint y;for(z;z>0;z-) for(y=19000-a;y>0;y-);/大致时间void delay1(uint z)/延时1MSuint y;for(z;z>0;z-) for(y=112;y>0;y-);/大致时间void main()uint temp;/存放简谱数组中的每一个音符的临时变量uint lightTemp;/存放音符uchar i=0;uchar jp;/jp用于取出temp中的高8位和低8位IT0=1;/INT0IT1=1; /INT1TMOD=0x01;/设置定时器T0工作于方式1IE=0x87; /允许T0中断while(1)temp=sbi;if(temp=0xff)break;jp=temp/16; /取数的高4位,音频数值lightTemp=(1<<jp)-1;P2=lightTemp/0x100;P0=lightTemp%0x100;if(jp!=0)timeh=chuzhijp*2;/构造定时器初值高8位timel=chuzhijp*2+1; /构造定时器初值低8位TR0=1; /开定时器elseTR0=0; /关定时器fm=1; /关蜂鸣器delay(temp%16); /取数的低4位,节拍(音符总时延)TR0=0; /唱完一个音停5MSfm=1;delay1(5); i+;TR0=0;/关定时器fm=1;/关蜂鸣器void delay_ms(uint a)int i,j;for(i=a;i>=0;i-)for(j=110;j>=0;j-)void INT0_svr(void) interrupt 0 delay_ms(10);if(int0=0)a+=2000;if(a>18000)a=0;void INT1_svr(void) interrupt 2delay_ms(10);if(int1=0)a-=2000;if(a<=0)a=0;3 运行结果或者测试结果 测试结果:利用蜂鸣器实现了播放音乐的功能,并有节奏的闪灭二极管,可以进行速度的变换。达到了预期的目标,测试成功。4 遇到的问题及解决的方法在设计的过程中主要遇到以下问题:1.计算机与单片机的连接不上问题计算机与单片机的连接需要在电脑端安装相应的USB转串的驱动,由于我组没有使用实验室windows xp系统,而使用的是个人计算机windows 7系统,所以需要针对win 7 的驱动。后来联网搜索下载相应的驱动之后解决了这一问题。2.如何使蜂鸣器发出声音而非Be-Be声为了解决这个问题,我们深入研究了蜂鸣器发声原理与乐谱相关的知识。通过学习相关知识发现,不同的音符对应不同的音高,音高取决于发声频率。所以可以通过构造不同频率的方波来使蜂鸣器发出不同频率的声音,具体实现时利用定时器计时,定时器每一次累加消耗一个机器周期,即12个时钟周期。本实验采用晶振频率为12MHz,即定时器每一次累加消耗1us,通过设置定时器初值设定蜂鸣器取法的时间间隔,从而产生相应的音频。每个音符不但有频率属性,还有节拍属性。对不同节拍的控制可以采用延迟一定的时间来得到。3.音乐节奏的调节 设置全局变量a,似的程序每循环一次就让音符的延时减一次a或加一次a,并利用中断让按键来控制。5 总结 在本次课程设计中,我们进一步加深了对小型嵌入式系统的认识。实验初期单片机需要自己焊接,通过亲手焊接电路板,了解了如何将实验原理图转化为具体的硬件实物连接。通过使用TN单片机开发板和STC89C52RC系统,对单片机应用开发有了初步的熟悉。在实验的过程中,使用到了C51的编译环境Keil C和单片机通讯程序STC_ISP,两者是单片机开发所不可缺少的工具。在具体实施的过程中,通过一一解决遇到的问题,增强了动手实践能力。 .页脚.