1、目 录摘 要目 录1第一章 绪论21.1课程设计目的21.2课程设计任务21.3课程设计要求21.4课程设计的意义2第二章 设计原理及总体方案选择32.1 基本原理简述32.2 关于音乐的原理知识4第三章 音乐播放器硬件电路的设计和调试63.1 硬件原理电路的设计63.1.1 时钟与复位模块63.1.2 按键选择模块63.1.3 数码管显示模块73.1.4 下载电路模块73.1.5 US供电模块83.1.6 蜂鸣器模块83.1.7 整个原理图93.2 ATMEL 89C51简介103.2.1 AT89C51单片机103.2.2 引脚介绍10第四章 软件编程设计与综合测试114.1 编程思路简述
2、114.2 编程方案的设计134.2.1 软件功能选择134.2.2 程序流程图134.2.3 程序清单154.2.4 软件调试15参考文献20心得体会21第一章 绪论1.1课程设计目的应用单片机,利用它的原理组成一个音乐播放器。利用按键进行音调选择,即不同的按键产生不同的音调,蜂鸣器发出1234567音调,并在数码管上显示。编写2支歌曲,并可进行选择播放。1.2课程设计任务1) 以单片机为核心部件组成一个音乐播放器。2) 利用单片机的定时器产生乐谱的各种频率方波,由蜂鸣器发出声音。3) 自行定义按键盘,每按一键,可以发出对应的音调,或者可选择按键进行歌曲播放。4) 在数码管上显示Do、Re、
3、Mi、Fa、Sol、La、Si音调所对应的1、2、3、4、5、6、7。1.3课程设计要求1)硬件电路的搭建是用采用AltiumDesigner6.9。2)采用单片机C语言进行编程。3)完成硬件与软件调试综合调试,实现预定功能,并写出课程设计报告。1.4课程设计的意义 通过自己动手设计制作单片及组成的器件,深入了解了单片机的实际应用,能更深地理解课堂上所学的内容,使得单调的理论知识与实际联系起来,帮助我们更好的理解。同时学会PCB制版的过程,熟悉AltiumDesigner6.9这个软件。 第二章 设计原理及总体方案选择2.1 基本原理简述声音是通过振动产生的。单片机对某一引脚以一定的频率循环置
4、1置0,该引脚便产生一定频率的方波,方波通过放大,作用于一定的物理实件(蜂鸣器),就产生了一定频率的声音。若改变输出方波的频率,产生的声音随之改变。通过控制输出方波的时间长短,声音的长短也可以得到控制,因此,根据乐谱,以类似的音及同样的节拍,单片机就可以产生电子音乐。音乐的播放模式及选择可以通过按键的输入得以实现。为简便起见,以一定的频率方波产生的音在其每个周期内高低幅值得时间各占一半因此,输出引脚在每个方波周期内要动作两次:一次升高,一次降低。即输出引脚的频率是原音频率的两倍。方波的产生由定时器控制。定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。必须考虑到中断响应时间的
5、影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。一般中断响应时间为36个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表1中所给的定时初值就是考虑中断响应后的定时常数。另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。音乐播放器的基本硬件电路有六部分组成:单片机、时钟与复位电路、选择按键输入电路、音频发生器、蜂鸣器、数码管显示。音乐播放器硬件电路设计框图如图2.1所示。数码管对应显示时钟与复位电路单片机音频发生器选择按键输入电路蜂
6、鸣器图2.1 音乐播放器硬件电路设计框图利用单片机内部定时器/计数器T0与P2.0引脚配合,构成音频发生器,与外置电路组成音频放大器,驱动蜂鸣器输出。选择按键通过P1.0 至P1.7。 2.2 关于音乐的原理知识 在音乐中使用的各个固定频率的音叫音级1。常用符号C、D、E、F、G、A、B、c、d、e、a1、b1、c2、d2表示,它们对应于钢琴上的白键。两音之间音高的距离叫音程。在上述音级中,E与F、B与C之间音高的距离仅为其它相邻音级之间距离的一半,称它们之间的音程为半音音程,而称其它相邻各音之间的距离为全音音程。在这些全音音程之间又加入新的半音音级,用符号C、D、F、G、A、c、d、f、表示
7、,对应于钢琴上的黑键。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。表2.1 各音符及对应频率音符低DO低#DO低RE低#RE低MI低EA简谱码DO_LDO#_LRE_LRE#_LMI_LFA_L频率262HZ277HZ294HZ311HZ330HZ349HZ音符低#FA低SO低#SO低LA低#LA低SI简谱码FA#_LSO_LSO#_LLA_LLA#_LSI_L频率370HZ393HZ415HZ440HZ466HZ494HZ音符中DO中#DO中RE中#RE中MI中EA简谱码DODO#RERE#MIFA频率523HZ554HZ587HZ622HZ659HZ698HZ音符中#FA中
8、SO中#SO中LA中#LA中SI简谱码FA#SOSO#LALA#SI频率740HZ785HZ831HZ880HZ932HZ988HZ音符高DO高#DO高RE高#RE高MI高EA简谱码DO_HDO#_HRE_HRE#_HMI_HFA_H频率1047HZ1109HZ1174HZ1245HZ1318HZ1397HZ音符高#FA高SO高#SO高LA高#LA高SI简谱码FA#_HSO_HSO#_HLA_HLA#_HSI_H频率1480HZ1568HZ1661HZ1760HZ1865HZ1976HZ每个音符分为简谱码和节拍码。简谱码为D0-L到SI-H,节拍码为1到16。对应的节拍表如表2.2所示。对应的
9、拍子: 2/2。以二分音符为一拍,每小节有两拍(二分音符代表一拍)2/4。以四分音符为一拍,每小节有两拍(四分音符代表一拍)3/4。以四分音符为一拍,每小节有三拍(四分音符代表一拍)4/4。以四分音符为一拍,每小节有四拍(四分音符代表一拍)表2.2 节拍表拍数字符拍数字符 1/8 00H 2 08H 1/4 01H 5/2 09H 1/2 02H 3 0AH 3/4 03H 7/2 0BH 1 04H 4 0CH 5/4 05H 5 0DH 3/2 06H 6 0EH 7/4 07H 8 0FH第三章 音乐播放器硬件电路的设计和调试3.1 硬件原理电路的设计3.1.1 时钟与复位模块由电容,电
10、位器,按键组成复位电路部分,该电路接于单片机的RESET端可以通过按键达到手动复位的效果,也可以通过电位器和电容组成上电复位电路。通过复位电路使单片机回到初始状态。图 3.1 复位电路图 3.2 晶振时钟电路3.1.2 按键选择模块 利用P1.0到P1.7与构成按键阵列,可以扫描十六个按键,但本次设计只用到九个按键。图3.3矩阵键盘3.1.3 数码管显示模块 图3.4数码管3.1.4下载电路模块图3.5下载电路3.1.5 USB供电模块图3.6 USB供电电路3.1.6 蜂鸣器模块图3.7 蜂鸣器3.1.7 整个原理图综合以上功能模块,连接于单片机,绘制原理图如图3.8所示。图 3.8 音乐播
11、放器电路原理图PCB完成版:3.2 ATMEL 89C51简介3.2.1 AT89C51单片机AT89C51是美国ATMEL公司推出的系列单片机,将多种功能的8位CPU与FPEROM(快闪可编程/擦除只读存储器)结合在一个芯片上,是一种低功耗、高性能的CMOS控制器,为很多嵌入式控制应用提供了非常灵活而又价格适宜的方案,其性能价格比远高于同类芯片。它与MCS-51指令系统兼容,片内FPEROM允许对程序存储器在线重复编程,也可用常规的EPROM编程器编程,可循环写入/擦除1000次。89C51内含4KB的FPEROM,一般的EEPROM的字节擦除时间和写入时间基本上均为10ms,对于任一个实时
12、控制系统来说,这样长的时间是不可能在线修改程序的。3.2.2 引脚介绍图3.7 引脚图第四章 软件编程设计与综合测试4.1 编程思路简述要产生音频信号,只要算出某一音频的周期(频率的倒数),将此周期除以2即为半周期的时间,利用定时器计时此半周期时间,计时到后取反输出,重复此过程即得到此频率的声音信号。此信号从P2.0脚输出。定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。一般中断响应时间为36个机器周期,经过反复试验取5个机器
13、周期作为校正最为恰当,表2.1中所给的定时初值就是考虑中断响应后的定时常数。另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。本设计中单片机晶振频率为11.0592MHz。每个音符使用两个字节。低位字节(偶地址)代表音级,00H表示不发音(休止符),01H30H依次表示的音级为c、c、d、d、e、f、a3、a3、b3 ,详见表2.1。高位字节(奇地址)代表音符的时值(拍数),00H0FH依次表示拍数为1/8拍(0.10s)8拍(6.40s),见表2.2。乐曲的结束标志是两个字节:0FFH,0FFH。设计延时程序50
14、ms,来控制节拍,改变延时程序的延迟时间,即可实现歌曲的快慢演奏。主程序的任务是按顺序读取数据表中的字节,根据情况调用音级子程序和演唱子程序,启动定时器T0;通过延时控制节拍,并循环回音级子程序,等待演唱完毕。要编写的乐谱按要求以音符字节数据表的形式存放在程序中,改变乐曲就是通过改变该数据表的内容来实现的。定时器T0的中断服务程序任务是取反P2.0输出产生方波,重新为TH0,TL0送初值。蜂鸣器产生音乐的2个关键参数是频率和音长。一个节拍的时间大概是400-500ms之间。用定时器定时50ms,8个定时时间就是一个节拍,即为Rhythm。音调频率如下表:C调1234567低(Hz)262293
15、329349392440494中(Hz)523586658697783879987高(Hz)1045110613161393156317551971根据表中的频率计算出周期T=1/f;则T/2就是电平的持续时间;得到的T/2再除以15us就可以得到带参延时函数delay_15us的入口参数,即为Tone:C调1234567低12711310195857567中63565047423733高31282523211916依次按照音调,节拍,音调,节拍的顺序写入到数组中,并在结尾处加入休止符0即可完成整个音乐的播放。4.2 编程方案的设计4.2.1 软件功能选择1)对于九个按键的功能设计,按键07控
16、制Do、Re、Mi、Fa、Sol、La、Si,其余按键8和按键9对应两首歌曲。九个按键通过P1口八条引脚构成行列扫描结构,对用户的按键位置进行判断。2)通过以上的分析思考,我们看到想实现音乐的输出是并不困难。这也就基本上完成了我们既定的基本方案。可是如何让数码管同步显示1、2、3、4、5、6、7。在用户按键之后由按键控制模块判断选择的歌曲,通过CPU控制显示程序中已有的歌曲或者音调和数码管显示。4.2.2 程序流程图开 始初始化(LCD设置,定时器、终端等设置)设置相关标志值以及数码管提示显示(操作1) N 是否有按键 Y全局指针Do =127,10,0按键1全局指针Re =113,10,0按
17、键2全局指针Mi =101,10,0按键3全局指针Fa =95,10,0按键4全局指针Sol=85,10,0按键5全局指针La =75,10,0按键6全局指针Si =67,10,0按键7全局指针 小苹果按键8全局指针 清明雨上按键9调数码管显示函数,显示指针指向数组表示的数字根据music指向的数组数据装载定时器0并开启以及延时播放 中断0是否发生中断歌曲停止,返回到初始,即操作1,且继续等待按键选歌 结 束 图 4.1 音乐播放器程序流程图4.2.3 程序清单主程序(main.c):#include#includePlayMusic.h#includeKeyScan.h#define Seg
18、Ports P0/数码管接口unsigned char nTimes;unsigned char Seg_Code=0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0xff,0xff;/1-7的共阳极段码显示int main(void)char KeyTemp;TH0 =(65536-50000)/256;TL0 =(65536-50000)%256;TMOD=0x01;ET0 =1;EA =1;TR0 =1;while(1) KeyTemp=KeyScan();/暂存按键值if(KeyTemp =-1|(KeyTemp=9) continue;/当按键值等于返回值-1或
19、者按到按键矩阵上未用到的按键,则不往下执行!SegPorts=Seg_CodeKeyTemp;/如果按键值与按键矩阵相对应,则往下执行并显示相对应的音调MusicPlayer(KeyTemp);/相对应的音乐return 0;void Tone_Long()interrupt 1TH0 =(65536-50000)/256; /50ms的定时,对应相应节拍,查资料知道一个节拍对应400ms500msTL0 =(65536-50000)%256;nTimes+;按键扫描程序头文件(KeyScan.h):#include#define KeyPorts P1 /键盘接口char KeyScan(v
20、oid);/按键扫描函数extern void delay_15us(unsigned char n);/延时时间计算T=(15*n)usC文件(KeyScan.c):#includeKeyScan.hchar KeyScan()char KeyValue;KeyPorts=0x0f; /行扫描while(KeyPorts != 0x0f)delay_15us(100);while(KeyPorts !=0x0f) switch(KeyPorts) case 0x0e: KeyValue=0; break;case 0x0d: KeyValue=1; break;case 0x0b: KeyV
21、alue=2; break;case 0x07: KeyValue=3; break;default:break; KeyPorts=0xf0;/列扫描delay_15us(100);switch(KeyPorts) case 0xe0: KeyValue=KeyValue*4; break;case 0xd0: KeyValue=KeyValue*4+1;break;case 0xb0: KeyValue=KeyValue*4+2;break;case 0x70: KeyValue=KeyValue*4+3;break;default:break;while(KeyPorts!=0xf0);
22、/松手检测return KeyValue; return -1;void delay_15us(unsigned char n) /n*15+8=T/2,用来设置音调的unsigned char x,y;x=n;while(x!=0) y=4;while(y!=0) y-;x-;音乐播放程序头文件(PlayMusic.h):#include#includeKeyScan.hsbit Voice=P20; /蜂鸣器接口extern unsigned char nTimes; /全局变量voidMusicPlayer(char Music_Channel);C文件(PlayMusic.c):#in
23、cludePlayMusic.hunsigned char Do =127,10,0; /对应音调n,节拍,停止unsigned char Re =113,10,0;unsigned char Mi =101,10,0;unsigned char Fa =95,10,0;unsigned char Sol=85,10,0;unsigned char La =75,10,0;unsigned char Si =67,10,0;unsigned char code Music_1=31,28,37,4,31,28,42,24,37,4,42,4,37,36,31,28,37,4,31,28,42,
24、4,42,20,37,4,42,4,37,4,37,32,37,12,33,4,31,4,25,8,38,4,31,4,33,4,37,4,33,4,37,4,33,16,42,12,37,4,33,4,28,4,31,4,33,4,37,4,42,4,37,4,42,4,37,16,37,12,33,4,31,4,25,4,28,4,31,4,33,4,37,4,33,4,37,4,33,16,42,12,37,4,33,4,28,4,31,4,33,4,25,8,31,8,28,8,37,8,25,4,28,4,31,4,28,4,37,16,25,18,31,8,28,16,21,4,2
25、5,4,33,8,31,8,31,4,33,4,37,8,16,4,31,4,28,8,42,8,19,4,21,4,25,20,28,4,31,8,28,8,25,4,28,4,25,4,28,4,21,4,21,32,0; /小苹果unsigned char code Music_2=56,4,50,2,42,6,37,4,56,4,50,2,42,6,37,4,50,8,56,8,63,16,37,12,42,8,50,4,56,4,50,4,56,4,63,2,50,18,56,4,50,2,46,2,37,8,56,4,50,2,42,6,37,4,50,4,56,4,50,4,56
26、,4,63,16,37,12,42,8,50,4,56,4,50,4,56,4,63,2,50,18,56,4,50,2,42,6,37,4,56,4,50,6,37,4,50,4,56,4,50,4,42,4,63,12,37,12,42,8,50,4,56,2,50,4,56,2,63,16,50,2,42,4,50,2,42,4,50,4,37,8,50,4,56,4,63,4,37,4,63,4,42,4,50,16,37,12,42,4,37,8,25,4,31,4,28,16,42,4,37,4,21,4,25,6,37,4,28,12,31,4,33,4,42,4,28,4,25
27、,4,31,12,28,4,25,4,28,6,31,4,28,4,31,4,21,4,19,4,25,16,42,4,37,4,21,4,25,6,19,4,28,12,31,4,3,4,42,4,28,4,25,3,31,8,37,4,25,4,31,4,31,2,37,6,25,4,31,8,37,8,31,12,0; /清明雨上void MusicPlayer(char Music_Channel)unsigned char *p; unsigned char Tone,Rhythm;switch(Music_Channel) case 0: p=Do; break; case 1:
28、p=Re; break; case 2: p=Mi; break; case 3: p=Fa; break; case 4: p=Sol;break; case 5: p=La; break; case 6: p=Si; break; case 7: p=Music_1; break; case 8: p=Music_2; break; /指向不同的数组,播放不同的音乐 default :return;Tone=*p; /音调p+;Rhythm=*p; /节拍p+;while(Tone != 0) /0x00作为休止符nTimes=0;while(nTimes != Rhythm) Voice
29、=Voice;delay_15us(Tone);Tone=*(p+); Rhythm=*(p+);4.2.4软件调试调试过程主要是在Keil4软件中进行Debug,查找语法错误。首先测试矩阵键盘程序是否正常,按下按键看能否显示正确的数值。测试正常后加入音乐播放模块,按下1-7听到Do,Re,Mi,Fa,Sol,La,Si的音调。最后再按下8或9和并和原始音乐对比。参考文献1 杨恢先,黄辉先.单片机原理及应用M.北京:人民邮电出版社,2006.2 胡洪波.单片机原理及应用实验教程M.湖南:湘潭大学出版社,2009.3 陈海燕.51单片机原理及应用M.北京:北京航空航天大学出版社,2010.4 郭
30、天祥.新概念51单片机C语言教程M.北京:电子工业出版社,2009.心得体会首先感谢*老师。在这个星期中,我遇到了许多的困难和挑战,在*老师的精心指导和同学的帮助下,完成了课程设计的任务。课程设计的同时,我也发现了一些自己在学习和实践中存在的一些问题。刚开始课设的时候,还是显得有些茫然。但随着时间推移,自己在对问题的理解方面更加深入。尽管遇到了各种各样的问题,但最终还是在不懈努力下得以解决。忙碌了一个星期,在大家的共同努力下,我总算实现了最初的设计方案。这其中有遭遇难题的痛苦思考,也有调试成功的喜悦。这样的一段经历,相信在我的一生回忆中都会有重要的位置。课程设计的时间尽管略显短暂,但是通过自己
31、设计原理,编写程序,调试硬件,并最终完成设计。设计的题目虽然简单,但是却体现了一个完整的设计流程的所有内容,进一步巩固了课内所学的知识,进一步培养了我们亲身实践的能力,这对我们将来的工作和研究都是大有好处的。我想这也是课程设计的真正目的所在。通过本次实训,对单片机的一系列知识,进行了一次系统的复习,熟悉了一些简单的程序,如延时程序,并温习了一些原来的东西,如按键的扫描及去抖动等。在本次试验中,学会了从程序的主体功能考虑要达到一个什么样的要求,从而,将程序分成各个子程序,逐个写出,分布细化,从而减少程序出错机率,并且易于检查各部分程序,根据任务功能所要达到的要求来进行检查,看到哪个模块所对应的程序不对,就检查哪个模块,提高了检查效率。同时可以使程序条理清晰,方便改错。为了提高程序可读性,可以加注释对程序的功能加以解释说明,并且在各个子程序之间以独立来分隔。在这里,因为我们的音乐播放是以查表的方式进行,所以首先我们要根据晶振的频率将音乐乐谱转化为自己做的表格,对照音乐简谱把代码写出来,完成音乐的播放,音乐播放,小苹果这首歌曲比较好识别,清明雨上不大易识别。当音乐播放出来的时候蛮激动的。衷心感谢所有帮助、支持和关心我的老师、同学!在此,我要向他们表示我深深的谢意和美好的祝福!谢 谢 !.忽略此处.21