您的位置 首页 解答

51单片机对电磁式蜂鸣器的驱动

51单片机对电磁式蜂鸣器的驱动-蜂鸣器发声原理是电流通过电磁线圈,使电磁圈产生磁场来驱动振动膜发声的。因此需要一定的电流才能驱动它,而单片机I/O引脚输出的电压较小。单片机输出的TTLK电平基本驱动不了蜂鸣器,因需要增加一个放大电路。这里用三极管作为放大电路。

首要应该了解一下蜂鸣器音乐播映的原理,在这儿我只讲一下电磁式蜂鸣器驱动原理(还有一种是压电式蜂鸣器):

电磁式蜂鸣器驱动原理:

51单片机对电磁式蜂鸣器的驱动

我这儿的J8端是跟芯片的P1^5端口相连,当P1^5输出高电平时,三极管截止,蜂鸣器不发声,反之,输出低电平时,蜂鸣器发声。

而要驱动蜂鸣器能像歌唱相同的发声,其实只需使蜂鸣器宣布频率和持续时刻不同的声响即可。周期等于频率的倒数,所以能够经过频率知道这段的时刻,所以能够经过调用延时函数或许定时器完成,相同的发声的持续时刻也能够经过延时函数完成,所以让蜂鸣器歌唱最要害的便是知道要延伸多少时刻!

用单片机来演奏音乐,,只需搞清楚两个概念就好了,分别是“腔调”和“节拍”。

腔调表明一个音符该唱的频率。

节拍表明一个音符该唱多少时刻。

这儿有两种办法来完成该功用:

(1)查表法

这个办法杂乱的当地在于你要找出每个音符相对应的频率(依据音符;频率对照表找),然后依据公式转化为相应的时刻(取半周期),然后经过延时函数完成。最终编程完成。

先上代码好了:

1/***************************************************2试验称号:用蜂鸣器播映生日快乐歌3试验阐明:不运用定时器中止,一切频率彻底用延时完成4试验时刻:2014/12/55***************************************************/67#include8#defineucharunsignedchar9#defineuintunsignedint1011sbitBEEP=P1^5;//蜂鸣器接芯片的P1^5端口1213/*生日快乐歌的音符频率表,不同频率由不同的延时来决议音符频率显着大于数组里边的值,可是由于是8位寄15存器,所以最多只能放511,可是有的频率大于511,所以只能在延时函数中乘上相应的值来挨近实践曲谱频率*/17ucharcodeSONG_TONE[]=18{212,212,190,212,159,169,212,212,190,212,142,159,212,19212,106,126,159,169,190,119,119,126,159,142,159,0};2021//生日快乐歌节拍表,节拍决议每个音符的演奏长短,仅仅取个系数,并非精确的值22ucharcodeSONG_LONG[]=23{9,3,12,12,12,24,9,3,12,12,12,24,9,243,12,12,12,12,12,9,3,12,12,12,24,0};2526//延时27voidDelayMS(uintx)28{29uchart;30while(x–)31for(t=0;t《120;t++);32}3334//播映函数35voidPlayMusic()36{37uinTI=0,j,k;38while(SONG_LONG[i]!=0“|SONG_TONE[i]!=0)39{40/*播映各个音符,SONG_LONG为拍子长度,一个节拍大约为400ms-500ms,这儿的节拍又受下面一个音符的影响,所以只能依据大约的来取值*/41for(j=0;j整个流程是这样的:首要依据生日快乐歌的曲谱将各个腔调转化为相应的频率。比方:左面是生日快乐歌曲谱,右边是音符频率转化表

这儿先来了解一下曲谱的一点常识,左面曲谱数字下面有点阐明是低声,没点阐明便是一般的,数字上面有点便是高音,而5的低声便是4.5,高音是5.5,其他音符也是相应的道理。曲谱的左上方有写“1=F”,而一般的曲谱都是C调,便是“1=C”,留意,曲谱里边的1234567(哆啦咪发索拉西多)相对应的不是ABCDEFG而是CDEFGAB!所以这儿规定是F调的话,那么就阐明2就要唱G,3要唱A,……7要唱E,所以这儿的低声5对应的应该是低声的1.5!!!!便是所谓的要相应的左移或许右移。假如仍是不明白的话,看下面:1本来对应的应该是C,4本来应该对应的是F,对吧?然后现在1对应的变成F了,就相当于对应了4,对吧?那么1.5对应的是什么?4.5咯!那2对应的是什么?5呗!那么好了咯,低声5是4.5,是不是便是等于1.5?所以半周期便是1803μs。至于为什么是依据半周期算,那是由于单片机是经过循环对蜂鸣器接的端口置位,复位来使发声的,所以便是半周期。由于我用的是无源的蜂鸣器,有源的蜂鸣器便是全周期了。然后便是依照上述道理,一个个转化,并用延时函数完成,由于每个音符的转化频率都不相同,要么运用多个延时函数一个个完成精确的腔调频率,可是这样太烦,并且单片机自身就不是专门弄来歌唱的。咱们不应该尴尬他们,所以自己将就一下就算了。所以延时函数为了习惯每个腔调都有差不多的频率,这个就靠自己计算了,并且不同的歌那个值还不相同,所以这便是这个问题的难点。接下来的便是那个唱多久的问题,一般的歌曲默许的一个节拍是400ms-500ms。相同的看曲谱左上方,它有写“3/4”,意思是以四分音符为节拍,每一个小结有三拍。而在每个数字下面有一条横线,那时刻便是那个节拍的时刻乘上0.5,有两条就乘上0.25,三条就乘以0.125。。。音乐的基本常识就别尴尬我了,我是个音乐痴人。。所以我就这么理解了。。哈哈哈哈哈~而至于节拍转化为频率,也是有相应的表的,见下:

相同的也是经过延时函数来完成,当然也是会有差错的。而至于延时函数怎样写,见[51单片机学习笔记ONE]编程思维的话挺简略的,便是先将音符频率和所要唱的时刻转化好,放到两个数组里边。然后在主程序里边,经过延时到达相应频率,唱完一遍,停一会,接着唱就好了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/345680.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部