按键控制蜂鸣器播放多段音乐的设计论文正稿.docx
《按键控制蜂鸣器播放多段音乐的设计论文正稿.docx》由会员分享,可在线阅读,更多相关《按键控制蜂鸣器播放多段音乐的设计论文正稿.docx(20页珍藏版)》请在冰豆网上搜索。
![按键控制蜂鸣器播放多段音乐的设计论文正稿.docx](https://file1.bdocx.com/fileroot1/2023-2/25/107a6ed9-5edf-4ed9-9e8c-136721ae2f72/107a6ed9-5edf-4ed9-9e8c-136721ae2f721.gif)
按键控制蜂鸣器播放多段音乐的设计论文正稿
《单片机原理及应用》课程设计
基于按键控制蜂鸣器播放多段音乐的设计
姓名:
XXX
任课教师:
XX
院系:
XXX
专业:
电子信息工程
提交日期:
2012年6月25日
基于按键控制蜂鸣器播放多段音乐的设计
引言
这学期我们学习了单片机原理及接口技术这一门实用而又生动的课程,初次接触到它就被它丰富的内容所吸引。
单片机自20世纪70年代问世以来,已得到了十分广泛的应用。
随着单片机的集成度越来越高以及单片机系统的广泛应用,对软件编程的要求也越来越高,要求编程人员在短时间内编写出执行效率高、运行可靠的程序代码。
单片机具有一些突出的有点:
体积小、重量轻、耗电少、电源单一、功能强、价格低、运行速度较快、抗干扰能力强、可行性高,所以在如今的绝大数的领域中都能够看到单片机的身影。
本次设计是基于AT89C51芯片的电路为基础,外加上三极管的放大、放音设备蜂鸣器,以此来实现音乐硬件控制器的硬件电路,通过软件程序来控制单片机内部的定时器使其播放出优美的音乐。
此次设计共写进了三首歌曲程序,分别是《仙剑》、《月亮代表我的心》和《小星星》。
关键字:
单片机蜂鸣器AT89C51芯片音乐
Basedonthebuttoncontrolplaymoreparagraphsmusicofthebuzzerdesign
Instruction
Thistermwehavelearntthedigitalimageprocessingwhichisapracticalandvividcourse,Firstcontacttoit,Iwasattractivebyitsrichcontent.
Sincethe1970s,thesinglechipmicrocomputerappearedhasbeenawiderangeofapplications.Withtheintegrationofsinglechipmoreandmorehighandthewideapplicationofsingle-chipmicrocomputersystem,thesoftwareprogrammingrequirementalsomoreandmorehigh,requestingprogrammingstaffinashorttime,writingexecutivehighefficiencyandreliableoperationprogramcode.SCMhassomeprominentabit:
smallvolume,lightweight,lessconsumption,andthepowerofasingle,thefunctionisstrong,pricelow,theprocessisfastandstronganti-interferenceability,feasibilityishigh,soinmostofthenumbernowinyourfieldyoucanseethefigureofsinglechipmicrocomputer.
ThisdesignisbasedonAT89C51chipsbasedcircuit,andthetransistoramplifierandletthesoundequipment,soastorealizemusichardwarehardwarecircuit,throughthesoftwareprogramtocontrolofthesinglechipmicrocomputertimerinternalplaysbeautifulmusic.Thedesignofthreesongswerewrittenintotheprogram,itisrespectivelyxianjian,themoonrepresentsmyheart,littlestar.
Keywords:
Single-chipmicrocomputer,buzzer,AT89C51chip,music
致谢17
第一章绪论
1.1课程设计目的
应用单片机,基于按键控制蜂鸣器播放多段音乐,利用它的原理组成一个简单的音乐盒。
1.2课程设计任务
1)以单片机为核心部件组成一个简单音乐播放器;
2)利用单片机的定时器产生乐谱的各种频率方波,信号经过放大后由蜂鸣器发出声音;
3)自行定义按键盘,当有键按下时,能相应的播放出歌曲。
有一个停止键能控制音乐的播放;
1.3课程设计的意义
利用开发板及组成的器件,在软件及硬件上进一步了解单片机的原理,深入了解了单片机C51语言的实际应用,能更深地理解课堂上所学的内容,巩固C语言程序编写,亲身体会作为一名设计人员所需要具备的各种能力,学会理论知识联系实际,提高我们发现问题,分析问题,解决问题和实践动手的能力。
第二章设计原理
2.1设计原理
2.1.1基本原理简述
声音是通过振动产生的。
单片机对某一引脚以一定的频率循环置1置0,该引脚便产生一定频率的方波,方波通过放大,作用于一定的物理实件(蜂鸣器),就产生了一定频率的声音。
若改变输出方波的频率,产生的声音随之改变。
通过控制输出方波的时间长短,声音的长短也可以得到控制,因此,根据乐谱,以类似的音节及同样的节拍,单片机就可以产生电子音乐。
音乐的播放选择可以通过按键的输入得以实现。
为简便起见,以一定的频率方波产生的音在其每个周期内高低幅值得时间各占一半因此,输出引脚在每个方波周期内要动作两次:
一次升高,一次降低。
即输出引脚的频率是原音频率的两倍。
方波的产生由定时器控制。
定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。
必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。
一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表1中所给的定时初值就是考虑中断响应后的定时常数。
另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。
这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。
音乐播放器的基本硬件电路有六部分组成:
单片机、时钟与复位电路、选择按键输入电路、音频发生器、音频放大器和扬声器。
2.1.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、……表示,对应于钢琴上的黑键。
音持续时间的长短即时值,一般用拍数表示。
休止符表示暂停发音。
下面分别是各音符及对应频率(表2.1)与节拍表(表2.2)
表2.1各音符及对应频率
音符
低DO
低#DO
低RE
低#RE
低MI
低EA
简谱码
DO_L
DO#_L
RE_L
RE#_L
MI_L
FA_L
频率
262HZ
277HZ
294HZ
311HZ
330HZ
349HZ
音符
低#FA
低SO
低#SO
低LA
低#LA
低SI
简谱码
FA#_L
SO_L
SO#_L
LA_L
LA#_L
SI_L
频率
370HZ
393HZ
415HZ
440HZ
466HZ
494HZ
音符
中DO
中#DO
中RE
中#RE
中MI
中EA
简谱码
DO
DO#
RE
RE#
MI
FA
频率
523HZ
554HZ
587HZ
622HZ
659HZ
698HZ
音符
中#FA
中SO
中#SO
中LA
中#LA
中SI
简谱码
FA#
SO
SO#
LA
LA#
SI
频率
740HZ
785HZ
831HZ
880HZ
932HZ
988HZ
音符
高DO
高#DO
高RE
高#RE
高MI
高EA
简谱码
DO_H
DO#_H
RE_H
RE#_H
MI_H
FA_H
频率
1047HZ
1109HZ
1174HZ
1245HZ
1318HZ
1397HZ
音符
高#FA
高SO
高#SO
高LA
高#LA
高SI
简谱码
FA#_H
SO_H
SO#_H
LA_H
LA#_H
SI_H
频率
1480HZ
1568HZ
1661HZ
1760HZ
1865HZ
1976HZ
每个音符分为简谱码和节拍码。
简谱码为D0-L到SI-H,节拍码为1到16。
对应的节拍表如表2.2所示。
对应的拍子:
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
第三章ATMEL89C51概况
3.1ATMEL89C51简介
3.1.1AT89C51单片机
AT89C51是美国ATMEL公司推出的系列单片机,将多种功能的8位CPU与FPEROM(快闪可编程/擦除只读存储器)结合在一个芯片上,是一种低功耗、高性能的CMOS控制器,为很多嵌入式控制应用提供了非常灵活而又价格适宜的方案,其性能价格比远高于同类芯片。
它与MCS-51指令系统兼容,片内FPEROM允许对程序存储器在线重复编程,也可用常规的EPROM编程器编程,可循环写入/擦除1000次。
89C51内含4KB的FPEROM,一般的EEPROM的字节擦除时间和写入时间基本上均为10ms,对于任一个实时控制系统来说,这样长的时间是不可能在线修改程序的。
3.1.2单片机CPU结构(如图3.1)
图3.1单片机CPU结构
3.1.3AT89C51用户系统
●CPU为Atmel公司生产的89C51/89C52/89C55等。
出厂所配晶振频率为11.0592MH,每个机器周期为1.085us,用户更换晶振以提高速度;
●存贮器为64K,前4K/8K20K在CPU内部,其它程序在EPR0M27512中;
●数据存贮器为32K(62256),地址为8000—FFFFH;
●Ⅰ/O扩展8155,片内RAM地址∶200O-20FFH;
●8155命令口地址为∶2100H;
●A口地址∶21O1HB口地址:
2102HC口地址:
2103H;
●T低八位∶2104HT高八位∶2105H;
●多路模拟开关的使用∶
IN0∶P1=0F8HIN4:
P1=0FCHIN1∶P1=0F9HIN5:
P1=OFDH
IN2∶P1=0FAHIN5:
P1=0FEHIN3∶P1=0FBHIN7:
P1=0FFH
●不掉电数据存贮器为∶500EH-507FH;
●控制板∶160x1O9(mm)供电∶+5V300mA+12V100mA-12V100mA;
●AT89C51是一种低功耗、高性能的片内含有4KB快闪可编程/擦除只读存储器(FPEROM-FlashProgrammableandEraseableReadOnlyMemory)的8位CMOS微控制器,使用高密度、非易失存储技术制造,并且与80C51引脚和指令系统完全兼容;
●主要性能:
与MCS-51微控制器产品系列兼容;
片内有4KB可在线重复编程的快闪擦写存储器。
3.1.4引脚分布如图(3.2)
图3.289C51引脚图
3.1.5蜂鸣器原理如图(3.3)
图3.3蜂鸣器原理图
第四章软件编程设计
4.1编程思路
想要产生音频信号,只要算出某一音频的周期(频率的倒数),将此周期除以2即为半周期的时间,利用定时器计时此半周期时间,计时到后取反输出,重复此过程即得到此频率的声音信号。
此信号从P3.0脚输出。
定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。
必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。
一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表2.1中所给的定时初值就是考虑中断响应后的定时常数。
另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。
这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。
本设计中单片机晶振频率为11.0592MHz。
每个音符使用两个字节。
低位字节(偶地址)代表音级,00H表示不发音(休止符),01H~30H依次表示的音级为c、﹟c、d、﹟d、e、f、……a3、﹟a3、b3,详见表2.1。
高位字节(奇地址)代表音符的时值(拍数),00H~0FH依次表示拍数为1/8拍(0.10s)~8拍(6.40s),见表2.2。
乐曲的结束标志是两个字节:
0FFH,0FFH。
设计延时程序125ms,来控制节拍,并在延时中判断是否有停止键按下,以便随时停止音乐。
改变延时程序的延迟时间,即可实现歌曲的快慢演奏。
主程序的任务是按顺序读取数据表中的字节,根据情况调用音级子程序和演唱子程序,启动定时器T0;通过延时控制节拍,并循环回音级子程序,等待演唱完毕。
要编写的乐谱按要求以音符字节数据表的形式存放在程序中,改变乐曲就是通过改变该数据表的内容来实现的。
主程序的任务是按顺序读取数据表中的字节,根据情况调用音级子程序和音长子程序,启动定时器T0;根据定时器T1应中断的次数,启动定时器T1。
数据表读完后,根据所设置的循环演奏次数决定是否结束程序。
音级子程序的任务是取出字节中的音级部分,分析TH0和TL0中应送入何值,送给33H,34H。
演唱子程序的任务是取出对应频率值,并乘以2,启动T0,实现发音。
之后执行延时程序,体现节拍,依此循环,直到音乐结束。
当乐曲较长时(超过254个字节),数据表指针溢出,应及时修改基址寄存器DPTR内容,即数据表的表头指针。
4.2编程方案的设计
4.2.1软件功能选择
对于4个按键的功能设计,一个停止键P2.5,其余三个键(P1.0,P1.2,P1.3)分别对应三首歌曲。
演奏过程中,按停止键可使乐曲停止,继续按其他键继续选择其他歌曲演奏。
选歌的按键使用8279键盘扫描以获得键值。
停止键使用的单片机的外部中断1实现其功能的。
4.2.2综合调试
在开发板上进行调试,先是进行单个模块调试,在开发板上进行播放歌曲的调试,使其能单曲循环播放,当有开关键按下时,就停止播放歌曲,再按下时,又重新播放歌曲。
最终实现当有控制键按下时,能够演奏对应的歌曲,再按播放下一首,当停止键按下时,停止播放歌曲。
4.2.3程序清单
#defineucharunsignedchar//定义一下方便使用
#defineuintunsignedint
#defineulongunsignedlong
#include//包括一个52标准内核的头文件
charcodedx516[3]_at_0x003b;//这是为了仿真设置的
sbitBEEP=P3^7;//喇叭输出脚
sbitP10=P1^0;
sbitK1=P1^0;//播放仙剑
sbitK2=P1^2;//播放月亮
sbitK3=P1^3;//播放小星星
sbitK4=P2^5;//停止播放
ucharth0_f;//在中断中装载的T0的值高8位
uchartl0_f;//在中断中装载的T0的值低8位
//T0的值,及输出频率对照表
ucharcodefreq[36*2]={
0xA9,0xEF,//00220HZ,1//0
0x93,0xF0,//00233HZ,1#
0x73,0xF1,//00247HZ,2
0x49,0xF2,//00262HZ,2#
0x07,0xF3,//00277HZ,3
0xC8,0xF3,//00294HZ,4
0x73,0xF4,//00311HZ,4#
0x1E,0xF5,//00330HZ,5
0xB6,0xF5,//00349HZ,5#
0x4C,0xF6,//00370HZ,6
0xD7,0xF6,//00392HZ,6#
0x5A,0xF7,//00415HZ,7
0xD8,0xF7,//00440HZ1//12
0x4D,0xF8,//00466HZ1#//13
0xBD,0xF8,//00494HZ2//14
0x24,0xF9,//00523HZ2#//15
0x87,0xF9,//00554HZ0xE4,0xF9,//00587HZ4//17
0x3D,0xFA,//00622HZ4#//18
0x90,0xFA,//00659HZ5//19
0xDE,0xFA,//00698HZ5#//20
0x29,0xFB,//00740HZ6//21
0x6F,0xFB,//00784HZ6#//22
0xB1,0xFB,//00831HZ7//23
0xEF,0xFB,//00880HZ`1
0x2A,0xFC,//00932HZ`1#
0x62,0xFC,//00988HZ`2
0x95,0xFC,//01046HZ`2#
0xC7,0xFC,//01109HZ`3
0xF6,0xFC,//01175HZ`4
0x22,0xFD,//01244HZ`4#
0x4B,0xFD,//01318HZ`5
0x73,0xFD,//01397HZ`5#
0x98,0xFD,//01480HZ`6
0xBB,0xFD,//01568HZ`6#
0xDC,0xFD,//01661HZ`7//35
};
//定时中断0,用于产生唱歌频率
timer0()interrupt1
{
TL0=tl0_f;TH0=th0_f;//调入预定时值
BEEP=~BEEP;//取反音乐输出IO
}
//******************************
//音乐符号串解释函数
//入口:
要解释的音乐符号串,输出的音调串,输出的时长串
changedata(uchar*song,uchar*diao,uchar*jie)
{
uchari,i1,j;
chargaodi;//高低+/-12音阶
ucharbanyin;//有没有半个升音阶
ucharyinchang;//音长
ucharcodejie7[8]={0,12,14,16,17,19,21,23};//C调的7个值
*diao=*song;
for(i=0,i1=0;;)
{
gaodi=0;//高低=0
banyin=0;//半音=0
yinchang=4;//音长1拍
if((*(song+i)=='|')||(*(song+i)==''))i++;
//拍子间隔和一个空格过滤
switch(*(song+i))
{
case',':
gaodi=-12;i++;//低音
break;
case'`':
gaodi=12;i++;//高音
break;
}
if(*(song+i)==0)//遇到0结束
{
*(diao+i1)=0;//加入结束标志0
*(jie+i1)=0;
return;
}
j=*(song+i)-0x30;i++;//取出基准音
j=jie7[j]+gaodi;//加上高低音
yinc:
switch(*(song+i))
{
case'#':
//有半音j加一个音阶
i++;j++;
gotoyinc;
case'-':
//有一个音节加长
yinchang+=4;
i++;
gotoyinc;
case'_':
//有一个音节缩短
yinchang/=2;
i++;
gotoyinc;
case'.':
//有一个加半拍
yinchang=yinchang+yinchang/2;
i++;
gotoyinc;
}
*(diao+i1)=j;//记录音符
*(jie+i1)=yinchang;//记录音长
i1++;
}
}
//******************************************
//奏乐函数
//入口:
要演奏的音乐符号串
voidplay(uchar*songdata)
{
uchari,c,j=0;
uintn;
ucharxdatadiaodata[112];//音调缓冲
ucharxdatajiedata[112];//音长缓冲
changedata(songdata,diaodata,jiedata);//解释音乐符号串
TR0=1;
for(i=0;diaodata[i]!
=0;i++)//逐个符号演奏
{
tl0_f=freq[diaodata[i]*2];//取出对应的定时值送给T0
th0_f=freq[diaodata[i]*2+1];
for(c=0;c{
for(n=0;n<32000;n++);
if((!
K1)||(!
K2)||(!
K3)||(!
K4))//发现按键,立即退出播放
{
TR0=0;
return;
}
}
TR0=0;
for(n=0;n<500;n++);//音符间延时
TR0=1;
}
TR0=0;
}
//仙剑
ucharcodexianjian[]={
"|3_3_3_2_3-|2_3_2_2_,6,6_,7_|