1 / 18
文档名称:

单片机控制蜂鸣器 1.pdf

格式:pdf   大小:752KB   页数:18页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

单片机控制蜂鸣器 1.pdf

上传人:haha 2023/3/18 文件大小:752 KB

下载得到文件列表

单片机控制蜂鸣器 1.pdf

相关文档

文档介绍

文档介绍:该【单片机控制蜂鸣器 1 】是由【haha】上传分享,文档一共【18】页,该文档可以免费在线阅读,需要了解更多关于【单片机控制蜂鸣器 1 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:.
-
单片机控制蜂鸣器
20年月日
目录
绪论1
1、硬件设计2



:〔如图〕2
:2

2、软件设计3


、节拍以及编码确实定方法4
音调确实定4


3、电路仿真与分析9
4、电路板焊接、调试10

:.
-

5、讨论及进一步研究建议11
6、心得11
7、单片机音乐播放器程序实例(卡农)12
:.
-
绪论
蜂鸣器播放音乐电路设计对于单片机初学者来说是一个简单易实现的课题。
通过编写程序使单片机产生一定频率的方波信号,方波信号进入蜂鸣器便产生我
们熟知的音调。
我们用定时/计数器使单片机产生方波,利用定时/计数器使输出管脚在一
定周期反复翻转,到达所需频率,而我们给定时/计数器的初始值就是我们的音
符—半周期数据表,通过我们播放的音乐的乐谱,来对数据表进展调用。
我们用延时子程序来表示节拍,不同的节拍代表不同的延时。
完成此次设计之后完全可以进展扩展,例如增加按键以及LED灯光效果,
制成一个简易的音乐盒,给人以视觉听觉等全方位的享受。
:.
-
1、硬件设计


STC89C52蜂鸣器
电源

晶振
:〔〕

如下图,蜂鸣器发声电路是播放音乐电路的主要执行电路,它由一个蜂
鸣器,一个三极管和一个电位器组成。蜂鸣器负责发声,三极管将电流放大,而
电位器则控制流过蜂鸣器电流的大小,来到达控制音量的目的。
:
我们采用DC005电源供电,供电电压为5V。稳压电路用来到达稳定输入电压的
目的,它由一个整流二极管,两个电容和一个三端稳压器组成。二极管和电容组
成整流电路,将交流整流成直流,而三端稳压器则用来稳定电压。
:.
-

元件数量

电容30pf2
STC89C52RC1
三极管1
电容10uF1
极性电容47uf1
极性电容1000uf1
单端稳压器1
二极管1N40071
DC005插头插座1
蜂鸣器1
电位器10K1
电阻10K2
电阻1K1
按键1
2、软件设计

将乐谱中的每个音符的音调及节拍变换成相应的音调参数和节拍参数,将他
们做成数据表格,存放在存储器中,通过程序取出一个音符的相关参数,播放该
音符,选择需要的声响时间,即可完成一个音符的播放。该音符唱完后,接着取
出下一个音符的相关参数……,如此直到播放完毕最后一个音符。中间可根据需
要将音符和音符之间插入时间延时,以产生需要的节拍,用01H或02H、03H
等等,具体根据歌曲的实际需要设置。根据需要也可循环不停地播放整个乐曲。
利用INTO在中断中是属于最高优先级的特点,
成中断造成的歌曲选择——下一首的播放。另外,对于乐曲中的休止符,一般将
其音调参数设为FFH,FFH,其节拍参数与其他音符的节拍参数确定方法一致,
:.
-
乐曲完毕用节拍参数为00H来表示。声音输出接一个三极管,利用通断放大声
音。

开场
设置定时器
根据乐谱读取
数据产生方波
蜂鸣器发声
完毕
、节拍以及编码确实定方法
一般说来,单片机演奏音乐根本都是单音频率,它不包含相应幅度的谐波频
率,也就是说不能像电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄
清楚两个概念即可,也就是"音调〞和节拍表示一个音符唱多长的时间。

不同音高的乐音是用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个等份,每一个等份叫一个"半音〞。两个音之间的距离有两个"半
音〞,就叫"全音〞。在钢琴等键盘乐器上,C–D、D–E、F–G、G–A、A
–B两音之间隔着一个黑键,他们之间的距离就是全音;E–F、B–C两音之间
没有黑键相隔,它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的
:.
-
音叫自然音,那些在它们的左上角加上﹟号或者b号的叫变化音。﹟叫升记号,
表示把音在原来的根底上升高半音,b叫降记音,表示在原来的根底上降低半音。
例如高音DO的频率〔1046Hz〕刚好是中音DO的频率〔523Hz〕的一倍,中
音DO的频率〔523Hz〕刚好是低音DO频率〔266Hz〕的一倍;同样的,高
音RE的频率〔1175Hz〕刚好是中音RE的频率〔587Hz〕的一倍,中音RE
的频率〔587Hz〕刚好是低音RE频率〔294Hz〕的一倍。
知道了一个音符的频率后,怎样让单片机发出相应频率的声音呢?一般说
来,常采用的方法就是通过单片机的定时器定时中断,将单片机上对应蜂鸣器的
I/O口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片
机发出不同频率的声音,我们只需将定时器予置不同的定时值就可实现。
则怎样确定一个频率所对应的定时器的定时值呢?以标准音高A为例:
A的频率f=440Hz,其对应的周期为:
T=1/f=1/440=2272μs
由上图可知,单片机上对应蜂鸣器的I/O口来回取反的时间应为:
t=T/2=2272/2=1136μs
这个时间t也就是单片机上定时器应有的中断触发时间。一般情况下,单片机奏
乐时,其定时器为工作方式1,它以振荡器的十二分频信号为计数脉冲。设振荡
器频率为f0,则定时器的予置初值由下式来确定:
t=12*〔TALL–THL〕/f0
式中TALL=216=65536,THL为定时器待确定的计数初值。因此定时器
的上下计数器的初值为:
TH=THL/256=(TALL–t*f0/12)/256
:.
-
TL=THL%256=(TALL–t*f0/12)%256
将t=1136μs代入上面两式〔注意:计算时应将时间和频率的单位换算一
致〕,即可求出标准音高A在单片机晶振频率f0=12Mhz,定时器在工作方式1
下的定时器上下计数器的予置初值为:
TH440Hz=(65536–1136*12/12)/256=FBH
TL440Hz=(65536–1136*12/12)%256=90H
根据上面的求解方法,我们就可求出其他音调相应的计数器的予置初值。


低音频率T参数中音频率T参数高音频率T参数
Do2621908229Do523956115Do10465757
Do﹟2771805217Do﹟554903108Do﹟11095454
Re2941701204Re587852102Re11755151
Re﹟3111608193Re﹟62280497Re﹟12454848
Mi3301515182Mi65975991Mi13184545
Fa3491433172Fa69871686Fa13974343
Fa﹟3701351162Fa﹟74067681Fa﹟14804141
So3921276153So78463877So15683838
So﹟4151205145So﹟83160272So﹟16613636
La4401136136La88056868La17603434
La﹟4641078129La﹟93253664La﹟18653232
Si4941012121Si98850661Si19763030

假设要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律〔固定
的律动〕,而且可以调节各个音的快满度。"节拍〞,即Beat,简单说就是打拍子,
就像我们听音乐不自主的随之拍手或跺脚。,则1/4拍为
。至于1拍多少s,并没有严格规定,就像人的心跳一样,大局部人的
心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。音持
:.
-
续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就
可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一
些根底知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,
产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方
波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计
数的关系。
表节拍与节拍码对照
节拍码节拍数节拍码节拍数
11/4拍11/8拍
22/4拍21/4拍
33/4拍33/8拍
41拍42/1拍
51又1/4拍55/8拍
61又1/2拍63/4拍
82拍81拍
A2又1/2拍A1又
1/4拍
C3拍C1又
1/2拍
F3又3/4拍
每个音符使用1个字节,字节的高4位代表音符的上下,低4位代表音符
的节拍,。,1/,只要
设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY,则1拍应为
4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是
它的倍数,。

曲调DELAY曲调DELAY
值值
调125毫调62毫秒
4/4秒4/4
调187毫调94毫秒
:.
-
3/4秒3/4
调250毫调125毫
2/4秒2/4秒

doremifasolasi分别编码为1~7,重音do编为8,重音re编为9,停
顿编为0。播放长度以十六分音符为单位〔在本程序中为165ms〕,一拍即四分
音符等于4个十六分音符,编为4,其它的播放时间以此类推。音调作为编码的
高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。以0*ff
作为曲谱的完毕标志。
举例1:音调do,发音长度为两拍,即二分音符,将其编码为0*18。
举例2:音调re,发音长度为半拍,即八分音符,将其编码为0*22
歌曲播放的设计。先将歌曲的简谱进展编码,储存在一个数据类型为
unsignedchar的数组中。程序从数组中取出一个数,然后别离出高4位得到
音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;
接着别离出该数的低4位,得到延时时间,接着调用软件延时。
表简谱对应的简谱码、T值、节拍数
音符频率简谱码〔T音符频率简谱码〔T
〔HZ〕值〕〔HZ〕值〕
低126263628#4FA#74064860
DO
#127763731中5SO78464898
DO#
低229463835#5SO#83164934
:.
-
RE
#2RE#31163928中6LA88064968
低3M33064021#693264994
低4FA34964103中7SI98865030
#4FA#37064185高1DO104665058
低5SO39264260#1DO#110965085
#5SO#41564331高2RE117565110
低6LA44064400#2RE#124565134
#646664463高3M131865157
低7SI49464524高4FA139765178
中1DO52364580#4FA#148065198
#1DO#55464633高5SO156865217
中2RE58764684#5SO#166165235
#2RE#62264732高6LA176065252
中3M65964777#6186565268
中4FA69864820高7SI196765283

3、电路仿真与分析
本次试验我们采用了两个软件,用protel和keil两个软件和程序下载机进展
仿真。
仿真
:.
-
仿真原理图〔简化画法〕:

先在protel中绘制好电路图,然后在keil编写好程序,编译通过无错后生成一
*文件,*文件,将程序烧进单片机89c52中,进展调试。调试成
功后喇叭发出悦耳的音乐声,说明调试成功。
4、电路板焊接、调试
本次实验由于电路简单,线路不多,我们使用洞洞板。

在焊接之前,画好正确的电路图是非常重要的。焊接当中要注意石英晶振焊
接时间不要太长时间,以免烧坏。单片机不用到的引脚可以不用焊接上去,既可
以节约资源有可以美观。由于之前已经以及平时有焊接经历,所以焊接,所以焊
接过程并没有出现什么问题。只要遵照正常的步骤以及要求,如不要虚焊,走线
平滑,焊点圆滑等,根本都能做到正确完成,并且美观。

这个设计受外界环境的影响比拟小,所以只要电路仿真成果以及焊接正确,
根本实现并不很难。
我们在此次设计当中运用模电知识,通过三极管后再接小喇叭,声音立刻变
大了。由于一开场我们使用蜂鸣器,声音的柔和度非常差,歌曲播放当中经常出
现严重的声音失真。因此,我们换了柔和度好的小喇叭,经过调试后声音极大的
:.
-
得到改良,声度和柔和度都到达了非常好的理想状态。
5、讨论及进一步研究建议
本次设计的创新点就是能够播放多首歌曲。同时电路比拟简单,所用器件相
对较少。
这个设计能够实现实验的要求,能够播放出音乐,但还可以再改良。比方说,
可以加按键来实现上一曲下一曲的功能。
本设计如果时间充裕,还可以增加显示正在播放第几首歌曲的功能,可用数
码管来实现,只要程序进展修改并且接上相应的端口就可实现功能。
6、心得
本次试验我们选择了相对简单的音乐系统设计。在网上关于这个设计的资料
也很多,甚至有现有程序,电路图。但是经过我们的比拟与讨论,我们把电路简
化到最简单,选择了简单易实现且播放音乐失真较小的程序。
制作过程中出现了各种各样的问题,比方说程序输入错误,连线错误或者焊
接错误等,但是经过我细心研究,还是逐一的排除了。
设计过程中,虽然困难重重,也曾在设计初期想过放弃,但是我最后还是选
择坚持,相信凭着我的努力一定能够设计出来的,正是拼这这股信念才让我坚持
到最后。各个工程设计中,有过坎坷时的烦闷,有过成功时的喜悦,最难得的是
我始终没有放弃,结果虽然不能完全到达目的,但是在这个过程中学到很多的东
西,不仅仅是知识上的。结果并不太重要,过程更能表达这次设计的目的。
:.
-
7、单片机音乐播放器程序实例(卡农)
#include<>
sbitspeaker=P3^6;
unsignedchartimer0h,timer0l,time;
//频率-半周期数据表高八位
codeunsignedcharFREQH[]={
0*F2,0*F3,0*F5,0*F5,0*F6,0*F7,0*F8,//低音
1234567
0*F9,0*F9,0*FA,0*FA,0*FB,0*FB,0*FC,//中音
1234567
0*FC,0*FC,0*FD,0*FD,0*FD,0*FD,0*FE,//高音
1234567
0*FE,0*FE,0*FE,0*FE,0*FE,0*FE,0*FF};//超高音
1234567
//频率-半周期数据表低八位
codeunsignedcharFREQL[]={
0*42,0*C1,0*17,0*B6,0*D0,0*D1,0*B6,//低音
1234567
0*21,0*E1,0*8C,0*D8,0*68,0*E9,0*5B,//中音
1234567
0*8F,0*EE,0*44,0*6B,0*B4,0*F4,0*2D,//高音1
:.
-
234567
0*47,0*77,0*A2,0*B6,0*DA,0*FA,0*16};//超高音
1234567//1/4拍为单位
//卡农音乐数据表
codeunsignedcharyyb[]={5,3,2,3,3,1,4,3,1,5,3,2,3,3,1,4,3,1,5,3,1,
5,2,1,6,2,1,7,2,1,1,3,1,2,3,1,3,3,1,4,3,1,3,3,2,1,3,1,2,3,1,3,3,2,3,2
,1,4,2,1,
5,2,1,6,2,1,5,2,1,4,2,1,5,2,1,3,2,1,4,2,1,5,2,1,4,2,2,6,2,1,5,2,1,4,2
,2,3,2,1,
2,2,1,3,2,1,2,2,1,1,2,1,2,2,1,3,2,1,4,2,1,5,2,1,6,2,1,4,2,2,6,2,1,5,2
,1,6,2,1,
7,2,1,1,3,1,5,2,1,6,2,1,7,2,1,1,3,1,2,3,1,3,3,1,4,3,1,5,3,1,3,3,2,1,3
,1,2,3,1,
3,3,2,2,3,1,1,3,1,2,3,1,7,2,1,1,3,1,2,3,1,3,3,1,2,3,1,1,3,1,7,2,1,1,3
,2,6,2,1,
7,2,1,1,3,2,1,2,1,2,2,1,3,2,1,4,2,1,3,2,1,2,2,1,3,2,1,1,3,1,7,2,1,1,3
,1,6,2,2,
0,0,0};
voidt0int()interrupt1//T0中断程序,控制发音的音调
{
TR0=0;//先关闭T0
speaker=!speaker;//输出方波,发音
:.
-
TH0=timer0h;//下次的中断时间,这个时间,控制音调
上下
TL0=timer0l;
TR0=1;//启动T0
}
//--------------------------------------
voiddelay(unsignedchart)//延时程序,控制发音的时间长度以1/4
拍为单位
{
unsignedchart1;
unsignedlongt2;
for(t1=0;t1<t;t1++)
for(t2=0;t2<4000;t2++);//延时期间,可进入T0中断去
发音
TR0=0;//关闭T0,停顿发音
}
//----------------主程序----------------------
voidsong()//演奏一个音符
{
TH0=timer0h;//控制音调
TL0=timer0l;
TR0=1;//启动T0,由T0输出方波去发音
:.
-
delay(time);//控制时间长度
}
//--------------------------------------
voidmain(void)
{
unsignedchark,i;
TMOD=1;//置T0定时工作方式1
ET0=1;//开T0中断
EA=1;//开CPU中断
while(1)
{
i=0;
time=1;
while(time)
{
k=yyb[i]+7*yyb[i+1]-1;//第i个是音符,第i+1个是
第几个八度
timer0h=FREQH[k];//从数据表中读出频率数值
timer0l=FREQL[k];//实际上,是定时的时间长度
time=yyb[i+2];//读出时间长度数值
i+=3;
song();//发出一个音符以下为
:.
-
}
}
}