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

有人说是频率太高了,请问蜂鸣器到底是怎么个工作原理呢?加上延时以后是如何减缓频率的呢?我把24的晶振换成11.0592的也不响…#include<reg52.h>sbit... 有人说是频率太高了,请问蜂鸣器到底是怎么个工作原理呢?加上延时以后是如何减缓频率的呢?我把24的晶振换成11.0592的也不响…
#include <reg52.h>sbit bell=P0^1;
void main(){
bell=0;
}
展开
 我来答
bruceleeyou
推荐于2017-12-15
知道答主
回答量:42
采纳率:0%
帮助的人:22.7万
展开全部
这得看你的蜂鸣器是有源还是无源,如果是无源的蜂鸣器需要经过变频控制才会发声,对于有源的蜂鸣器则直接输出高低电平就可以。
注意,这里的“源”不是指电源。而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。
而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用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);就不响了”这些问题不要过于纠结,
宿兴电子
2024-11-28 广告
蜂鸣器是一种电子器件,用于发出声音信号。它广泛应用于计算机、通讯设备、家用电器、玩具等领域。在选择蜂鸣器时,需要根据具体的应用场景和性能要求来选择合适的品牌和型号。深圳市宿兴电子有限公司是一家专业从事电子元器件和电子设备销售的公司,我们与多... 点击进入详情页
本回答由宿兴电子提供
匿名用户
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低电平,不是方波信号,方波信号是高低电平循环交替产生的, 例如我的那个函数例子。

不断的思考! 不断的找答案! 祝你成功!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hzfhit
2013-10-17 · TA获得超过209个赞
知道答主
回答量:133
采纳率:0%
帮助的人:54.7万
展开全部
蜂鸣器有两种,一种是通电就响,一种是方波才响,你通电试一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhxiufan
2013-10-17 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38387
国家科技进步奖

向TA提问 私信TA
展开全部
#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)试试。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式