为什么我的51单片机蜂鸣器程序需要加延时才响呢?

有人说是频率太高了,请问蜂鸣器到底是怎么个工作原理呢?加上延时以后是如何减缓频率的呢?我把24的晶振换成11.0592的也不响…
#include <reg52.h>sbit bell=P0^1;
void main(){
bell=0;
}

这得看你的蜂鸣器是有源还是无源,如果是无源的蜂鸣器需要经过变频控制才会发声,对于有源的蜂鸣器则直接输出高低电平就可以。
注意,这里的“源”不是指电源。而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。
而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。
两种蜂鸣器好像一样,但仔细看,两者的高度略有区别,有源蜂鸣器a,高度为9mm,而无源蜂鸣器b的高度为8mm。如将两种蜂鸣器的引脚郡朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。
迸一步判断有源蜂鸣器和无源蜂鸣器,还可以用万用表电阻档Rxl档测试:用黑表笔接蜂鸣器 "+"引脚,红表笔在另一引脚上来回碰触,如果触发出咔、咔声的且电阻只有8Ω(或16Ω)的是无源蜂鸣器;如果能发出持续声音的,且电阻在几百欧以上的,是有源蜂鸣器。追问

测试了下我的是有源蜂鸣器。

我要是把延时函数设成void delay(int a,)然后主函数中delay();变成delay(50);就不响了。请问是怎么回事?还有能响的这个程序输出的是方波信号吗?怎么变成方波信号的?麻烦您了…

追答

你这个用的是2003驱动,为什么要输出低电平呢?2003输出时会取反,按你上面电路你要让蜂鸣器鸣叫应该输出高电平才可以啊。

有源蜂鸣器你直接输出高电平就可以啦,你可以用线短接J17的IN5管脚,接到5V蜂鸣器就可以鸣叫的。(短接的时候看是否能把单片机与J17 IN5相连的管脚断开,如果不能断开直接接5V问题也不大,只是为了更安全可靠)

无源蜂鸣器测试的时候需要输出方波信号
对于方波信号,你起初可以用延时函数来实现
bell=1; delay(m);bell=0;delay(n);
具体延时多久你可以调整m、n这两个参数。

你先试一试,不行再求助,先让蜂鸣器如你所愿响起来,“延时函数设成void delay(int a,)然后主函数中delay();变成delay(50);就不响了”这些问题不要过于纠结,

追问

解答好详细哦~~能不能给个QQ号呢?不方便的话就算了…

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-17
解决方法: 把蜂鸣器的控制信号由单一的电平 改为不断高低变化的方波。
例如:
void Warn(void) // 蜂鸣 警告
{
uchar ii;
for(ii=0;ii<2;ii++) //循环的次数决定 蜂鸣时间的长短,延时A延时B配合决定声调
{
SET_BEEP; //高电平
delay_ms(220); //延时A
CLR_BEEP; //低电平
delay_ms(120); //延时B
}

希望对你有帮助, 欢迎追问!追问

  测试了下我的是有源蜂鸣器。

然后主函数中delay();变成delay(50);就不响了。请问是怎么回事?还有能响的这个程序输出的是方波信号吗?怎么变成方波信号的?麻烦您了…

追答

回答一:void delay() 定义时是 无参数函数,只能delay()这样用; 如果想delay(50)这样用,需要改成void delay(unsigned int n ),然后 n 参与延时循环;

回答二: 现在你这个程序是保持IO低电平,不是方波信号,方波信号是高低电平循环交替产生的, 例如我的那个函数例子。

不断的思考! 不断的找答案! 祝你成功!

追问

不好意思啊,表达错误了…少写了点东西…应该是,我要是把延时函数设成void delay(int a,){ while(a--); }然后主函数中delay();变成delay(50);蜂鸣器就不响了…
此外有源蜂鸣器不是需要方波才能响的吗?要是我的程序是保持io口低电平的话为什么也会响呢?是不是我的是无源的呢?无源蜂鸣器可以接受方波信号吗?麻烦您了…

追答

一:建议把 while循环 改成for 循环 ,逻辑更加清晰 不易出错。

二: 有源蜂鸣器与无源蜂鸣器在方波的驱动下都会发声;关于有源无源的区别,可以参看bruceleeyou朋友的回答。

追问

不好意思哈,各处查资料发现我的是无源蜂鸣器,即需要方波信号才能响…我真的费解了,为什么我的程序能让它响呢?程序就是上个追问中贴的图,还有上个追问中的问题我还是不理解…为什么我把延时函数变了就不响了呢?

第2个回答  2013-10-17
蜂鸣器有两种,一种是通电就响,一种是方波才响,你通电试一下。
第3个回答  2013-10-17
#include <reg52.h>
sbit bell=P0^1;
void main()
{
bell=0;
while(1);
}
//这样就可以一直响下去了。追问

我的是无源蜂鸣器,可是为什么

这个程序能让蜂鸣器响呢?还有为什么我把延时函数改成void delay(jint a){ while(a--);  }然后主函数改成delay(50);就不响了呢?麻烦您了…

追答

这个程序编译是不能通过的delay()后边必须由;,至于你后面的程序,之所以不响,是因为延时时间太短。你将delay(50)改为delay(50000)试试。

为什么我的51单片机蜂鸣器程序需要加延时才响呢?
这得看你的蜂鸣器是有源还是无源,如果是无源的蜂鸣器需要经过变频控制才会发声,对于有源的蜂鸣器则直接输出高低电平就可以。注意,这里的“源”不是指电源。而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~...

51单片机频率调高了,蜂鸣器一直响,为什么呢?
应该是你的程序中延迟时间太短了,晶振频率提高后机械周期变短,从而导致延迟时间变短,其实还是响---停--响,只是人耳无法分辨,感觉上是一直响。

蜂鸣器延迟启动什么情况?
蜂鸣器延迟启动问题,大多数情况是由于输入到产品的电流不够造成,因为有很少部份产品处在电压启动的临界点,输入的电流又正好差一些所以会有启动不良现象。线圈阻抗大小也会对启动造成一定的影响,如果阻抗正好偏下限而输入的电流正好又处于临界点就会造成启动不良。希望对你有所帮助。

关于51单片机控制蜂鸣器发声时长的。
个人不建议延时,因为延时,单片机就只延时了。如果用DS1302芯片就好了,单纯的用单片机做个万年历是很吃力的,而且有时间误差累积!

求51单片机蜂鸣器程序
51单片机,编写延时程序,控制蜂鸣器发声:很简单的#include<reg52.h>#define uchar unsigned char#define uint unsigned int sbit fengmingqi=P0^0; \/\/声明IO口void delay(uint x)\/\/延时子函数{ uint i,j;for(i=x;i>0;i--)for(j=50;j>0;j--);}void main(void){while(1) \/\/循环{...

51单片机如何让蜂鸣器只响0.5s
51单片机驱动蜂鸣器(蜂鸣器分有源与无源两种,有源指加电压就会响的,无源需要以一定频率的交变脉冲电压驱动),如果只响0.5S,只要用一个定时0.5S开关信号驱动、或者用0.5S的一定频率的脉动信号驱动就可以了。

51单片机 蜂鸣器和数字显示配合
1."加入蜂鸣器,十位数就会跳动显示,频率和蜂鸣器响的频率是一样的">>>这个现象的产生可能是由于在扫描蜂鸣器按键的时候加入了延时的程序,或者调用了其他比较占用时间的函数,是的屏幕刷新的时间和蜂鸣器响应的间隔时间都变长了,并且是等时间差的改变,也就是你说的等频率。 你的看看程序,试着将蜂...

关于keil 51单片机编程
首先,你要搞清楚,蜂鸣器是有源的,还是无源的。有源蜂鸣器,只要加5V电压就响了。而无源蜂鸣器需要加方波信号才响,才不停的加高电平和低电平。而且是加高电平和低电平都要调延时子程序,而你只调一次是不行的。假如是无源蜂鸣器,单片机控制引脚输出的方波频率高,即延时短,而LED闪烁延时长。其实...

为什么我的51单片机一开机,蜂鸣器不不停的响啊,这是为什么啊
可能是接至你蜂鸣器的I\/O口内部加了上拉电阻,输出了高电平,所以会响。你用万用表测测那个I\/O口上电时输出的电平就可以知道是什么情况了

单片机初级问题:蜂鸣器不叫
你确定#include <reg51.h> sbit Beep = P1^5 ;void main(){ Beep= 0;} 这样写它是响的?你试试让beep高——延时——beep拉低,循环

相似回答