标题: 51单片机有源蜂鸣器不响求助 困扰我好几天了 附源程序 [打印本页]

作者: LittleBoss    时间: 2021-9-5 16:58
标题: 51单片机有源蜂鸣器不响求助 困扰我好几天了 附源程序
即将大二,有源蜂鸣器,用了三极管驱动,蜂鸣器一直不响,困扰我好几天了,求助!!!!
程序:
#include <at89x52.h>

//#define KEY1 P3_2
//#define KEY2 P3_3
//#define LED1 P3_4
//#define LED2 P3_5
//#define BEEP P1_7

sbit KEY1=P3^2;
sbit KEY2=P3^3;
sbit LED1=P3^4;
sbit LED2=P3^5;
sbit BEEP=P1^7;

void delay_nus(unsigned int i);
void delay_nms(unsigned int n);

void main()
{  bit flag=0;
   while(1)
   {
     if((KEY1==0)||(KEY2==0))
         {
           delay_nms(5);   
           if((KEY1==0)||(KEY2==0)){ flag=1; }
           else{ flag=0; }
         }
         else{ flag=0; }

         if(flag){LED1=0; LED2=0; BEEP=0;}
         else{LED1=1; LED2=1; BEEP=1;}
   }
}

void delay_nus(unsigned int i)  //f=11.0592MHz,延时:i>=12 ,i的最小延时单12 us
{
  i=i/10;
  while(--i);
}   

void delay_nms(unsigned int n)  //f=11.0592MHz,延时n ms
{
  n=n+1;
  while(--n)  
    delay_nus(900);         //延时 1ms,同时进行补偿
}
电路图和板子:





1.jpg (31.9 KB, 下载次数: 156)

1.jpg

IMG_2065.JPG (4.33 MB, 下载次数: 165)

IMG_2065.JPG

作者: LittleBoss    时间: 2021-9-5 17:11

作者: LittleBoss    时间: 2021-9-5 17:15
我一按键两个LED灯都能亮,就是蜂鸣器不响
作者: 188610329    时间: 2021-9-5 17:30
JP8 的 2脚1脚 连通的话, R7 如果那个100 是 100R 的话, VCC 出来,通过集电极,到基极,最高可以有 5V / 100R = 50mA 电流, IO口直接就能烧掉。蜂鸣器就绝对不会响了。
作者: LittleBoss    时间: 2021-9-5 17:34
188610329 发表于 2021-9-5 17:30
JP8 的 2脚1脚 连通的话, R7 如果那个100 是 100R 的话, VCC 出来,通过集电极,到基极,最高可以有 5V / ...

那是不是要提高R7的阻值呀
作者: 188610329    时间: 2021-9-5 17:46
LittleBoss 发表于 2021-9-5 17:34
那是不是要提高R7的阻值呀

可能,这个IO已经烧掉了,你必须换一个脚了, 电阻至少要 470R 以上,安全起见最好1K
最后,你这个电路很有问题,一般单片机上,三极管开关,都是控制GND,很少控制VCC, 而且多用NPN(能确保关断) 很少用PNP(可能会关不掉),
作者: liuzx66    时间: 2021-9-5 18:12
断开JP8,运行程序,用万用表检查IO口电压,按键看是否变化
作者: ww77qq    时间: 2021-9-5 18:19
拿表测下 看下有没有电平
作者: wysh_2004    时间: 2021-9-5 19:11
这个问题首先要区分是软件还是硬件造成的,1、取出单片机芯片用一条导线直接短接P17到GND,看蜂鸣器是否能正常鸣响,如不能就是蜂鸣器坏或电阻R7R8坏了。2、插回单片机芯片,在程序中将P17与P35交换,即sbit LED2=P1^7;sbit BEEP=P3^5;重新编译后下载到芯片中试机,如果蜂鸣器响而LED2不亮,说明P17口损坏了,如果蜂鸣器不响而LED2亮,说明P17没坏。另外,按键要一直按着,否则时间太短,蜂鸣器响太短促也听不出来。
作者: LittleBoss    时间: 2021-9-5 19:28
188610329 发表于 2021-9-5 17:46
可能,这个IO已经烧掉了,你必须换一个脚了, 电阻至少要 470R 以上,安全起见最好1K
最后,你这个电路很 ...

我刚刚去学了一下三极管,导通的时候发射极和基极的电压最大不应该是0.7V,然后基极上的电流是7mA吗?(不知道我的理解对不对)
作者: LittleBoss    时间: 2021-9-5 19:34
wysh_2004 发表于 2021-9-5 19:11
这个问题首先要区分是软件还是硬件造成的,1、取出单片机芯片用一条导线直接短接P17到GND,看蜂鸣器是否能 ...

我用电池直接接过蜂鸣器,是可以响的,在程序里将P17与P35交换应该不可行吧,硬件已经决定P1^7和P3^5本来就是分别控制蜂鸣器和LED2的了
作者: LittleBoss    时间: 2021-9-5 19:42
按键只有LED1和LED2亮,蜂鸣器不响

IMG_2066.JPG (4.08 MB, 下载次数: 144)

IMG_2066.JPG

作者: LittleBoss    时间: 2021-9-5 20:18
用万用表测了R7 和 R8 的电阻都是100欧姆
作者: LittleBoss    时间: 2021-9-5 20:26
  1. void main()
  2. {  bit flag=0;
  3. LED1=0; LED2=0; BEEP=0;
  4.    while(1)
  5.    {
  6.   
  7.    }
  8. }
复制代码

主函数改成这样后在单片机上运行,两个LED灯均亮,用万用表测得蜂鸣器两端电压是3.3V左右

作者: LittleBoss    时间: 2021-9-5 20:42
LittleBoss 发表于 2021-9-5 20:26
主函数改成这样后在单片机上运行,两个LED灯均亮,用万用表测得蜂鸣器两端电压是3.3V左右

JP8接通,万用表短接JP8测得基极电流为0,短接蜂鸣器测得电流为47mA
作者: ZMRGHY    时间: 2021-9-5 20:47

蜂鸣器到底是有源还是无源
作者: LittleBoss    时间: 2021-9-5 20:55
LittleBoss 发表于 2021-9-5 20:26
主函数改成这样后在单片机上运行,两个LED灯均亮,用万用表测得蜂鸣器两端电压是3.3V左右

测得基极和发射极间的电压为0.7V,发射极和集电极的电压为0
作者: LittleBoss    时间: 2021-9-5 20:55
ZMRGHY 发表于 2021-9-5 20:47
蜂鸣器到底是有源还是无源

是有源的呀
作者: 188610329    时间: 2021-9-5 21:01
LittleBoss 发表于 2021-9-5 20:26
主函数改成这样后在单片机上运行,两个LED灯均亮,用万用表测得蜂鸣器两端电压是3.3V左右

主函数这样,符合测试需要。
参考 15楼的 图,一般 单片机驱动蜂鸣器都应该这个样子。
确认一下 JP8 状态是否 闭合,
只要你是 有源蜂鸣器,应该能响。
作者: LittleBoss    时间: 2021-9-5 21:11
本帖最后由 LittleBoss 于 2021-9-5 21:26 编辑

到目前为止总结一下,希望大佬分析出问题出在哪:
1.蜂鸣器电池直接接上正负极可以响
2.R7和R8均为100欧姆,正常
3.焊接没问题,严格按照电路图焊接的
4.当主函数改成
void main()
{
LED1=0; LED2=0; BEEP=0;
while(1);
}
JP8打到ON
控制灯亮起,蜂鸣器响时,灯亮蜂鸣器不响
用万用电表测得以下数据
蜂鸣器两端电压是0V
三极管的发射极和基极的电压是0.7V
三极管的发射极和集电极的电压是0V
JP8的1和2间电压为0V
用万用表电流档红黑笔分别接JP8的2和1测得电0mA

如果还有什么需要测的就跟我说一下~



作者: LittleBoss    时间: 2021-9-5 21:17
本帖最后由 LittleBoss 于 2021-9-5 21:23 编辑
LittleBoss 发表于 2021-9-5 21:11
到目前为止总结一下,希望大佬分析出问题出在哪:
1.蜂鸣器电池直接接上正负极可以响
2.R7和R8均为100欧 ...
R7 R8两端电压分别1.3V 、0V

作者: 188610329    时间: 2021-9-5 21:28
LittleBoss 发表于 2021-9-5 21:11
到目前为止总结一下,希望大佬分析出问题出在哪:
1.蜂鸣器电池直接接上正负极可以响
2.R7和R8均为100欧 ...

你R7 为 100R   大多数单片机的IO,灌电流只能承受12MA 根本不可能把基极拉低到0。要么拉不低,要么烧IO.
作者: LittleBoss    时间: 2021-9-5 21:31
188610329 发表于 2021-9-5 21:28
你R7 为 100R   大多数单片机的IO,灌电流只能承受12MA 根本不可能把基极拉低到0。要么拉不低,要么烧IO.

我测了R7两端电压是1.3V,然后它的电流是13mA左右,现在我发现发射极与集电极间电压、蜂鸣器两端电压、R8两端电压都是0V,感觉是这三个里面哪里出了问题
作者: LittleBoss    时间: 2021-9-5 21:39
188610329 发表于 2021-9-5 21:28
你R7 为 100R   大多数单片机的IO,灌电流只能承受12MA 根本不可能把基极拉低到0。要么拉不低,要么烧IO.

奇怪了。。。我用万用电表电流档红黑表笔分别接基极和R7的靠近JP8的一端得到的电流值是0.3mA,和我用R7两端电压估算的1.3mA差了蛮远的。。。。
作者: ZMRGHY    时间: 2021-9-5 21:40
LittleBoss 发表于 2021-9-5 20:55
是有源的呀

把蜂鸣器从源极改到发射极。。。
去掉R8限流电阻。
R7换470欧,如果不响换成330欧,
作者: 188610329    时间: 2021-9-5 21:40
LittleBoss 发表于 2021-9-5 21:31
我测了R7两端电压是1.3V,然后它的电流是13mA左右,现在我发现发射极与集电极间电压、蜂鸣器两端电压、R8 ...

你直接飞线,把接P17这个地方接到GND 即手动代替 P17 拉低,看看响不响。就知道了。
作者: LittleBoss    时间: 2021-9-5 21:40
188610329 发表于 2021-9-5 21:28
你R7 为 100R   大多数单片机的IO,灌电流只能承受12MA 根本不可能把基极拉低到0。要么拉不低,要么烧IO.

更正一下,是0.3mA和13mA差了蛮远的
作者: 188610329    时间: 2021-9-5 21:56
LittleBoss 发表于 2021-9-5 21:40
更正一下,是0.3mA和13mA差了蛮远的

你 0.3MA 蜂鸣器响了么? 没响的话,这电流毫无意义。
作者: ZMRGHY    时间: 2021-9-5 21:57
188610329 发表于 2021-9-5 21:40
你直接飞线,把接P17这个地方接到GND 即手动代替 P17 拉低,看看响不响。就知道了。

PNP三极管,b极对地电阻小于以c极电阻时,三极管不会导通。。
PNP使用时,c极直接,接地。。。。
作者: 188610329    时间: 2021-9-5 22:03
ZMRGHY 发表于 2021-9-5 21:57
PNP三极管,b极对地电阻小于以c极电阻时,三极管不会导通。。
PNP使用时,c极直接,接地。。。。

我不知道你想说什么, 他打算 P17 = 0,让蜂鸣器响,我告诉他不会响,让他把打算通过 P17 拉到 0 的地方手动接到 GND, 来代替 P17 = 0, 看看是不是会响, 有什么问题么?
作者: ZMRGHY    时间: 2021-9-5 22:20
188610329 发表于 2021-9-5 22:03
我不知道你想说什么, 他打算 P17 = 0,让蜂鸣器响,我告诉他不会响,让他把打算通过 P17 拉到 0 的地方 ...

为什么,不直接说清原因呀
作者: 188610329    时间: 2021-9-5 22:32
ZMRGHY 发表于 2021-9-5 22:20
为什么,不直接说清原因呀

我前面很直接的说了一大堆原因了,你没看到么?
还有热心的15楼图都贴出来了,我也让他参考15楼的图了,你没看到?
他非要认死理,那么只能让他最简单的方法自己看到结果,然后再讲其他道理了。
作者: 188610329    时间: 2021-9-5 22:47
ZMRGHY 发表于 2021-9-5 22:20
为什么,不直接说清原因呀

抱歉, 可能刷新的问题,是 16楼帖的图, 贴图的人还是你。 其实我们俩 和他传递的是一个信息。所以,你没必要和我辩论。我在最开始 6楼 就跟他说要三极管控制GND ,而不是控制 VCC 电阻要换到 470R, 你在16楼也贴了图,他坚持不改,你有别的办法么?
作者: ZMRGHY    时间: 2021-9-5 22:57
188610329 发表于 2021-9-5 22:32
我前面很直接的说了一大堆原因了,你没看到么?
还有热心的15楼图都贴出来了,我也让他参考15楼的图了 ...

抱歉,网络问题。延时太多。只看到了。。。我的楼层上一层,你说让他把基极接地。。。。
前面的真的没看到
作者: LittleBoss    时间: 2021-9-5 23:01
我刚刚给我师兄看了看板子他说我的蜂鸣器接反了,他的板子蜂鸣器没问题,我们用的是同一个电路,我打算重新接一下蜂鸣器试试
作者: LittleBoss    时间: 2021-9-5 23:15
明天去基地重新焊一下蜂鸣器试试
作者: ZMRGHY    时间: 2021-9-5 23:53
LittleBoss 发表于 2021-9-5 23:15
明天去基地重新焊一下蜂鸣器试试

我在Proteus 仿真了一下。。仿真不出效果。。。。
需要知道,可以驱动蜂鸣器的最低电压,和蜂鸣器自身电阻。。。
你可以,测量一下驱动蜂鸣器的最低电压,和蜂鸣器自身电阻。
然后在Proteus 仿真了一下。。。
比自己计算电阻大小好用多了。。。。
使用Proteus 仿真可以,节省很少人工计算
作者: Y_G_G    时间: 2021-9-6 09:31
这是一个很简单的问题,真的,经常动手的人,很快就能找到问题
1,先把单片机蜂鸣器的IO设定成强推挽输出模式(数据手册上有,自己设定)
2,不要三极管,直接把这个输出IO连接到蜂鸣器,不用分正负,没必要
3,不要任何按键什么的,直接给这个IO输出一个1KHZ的方波,可以用定时器
4,蜂鸣器响了,电路和程序就对了,蜂鸣不响,硬件电路或者程序有问题
蜂鸣器会响的,声音是小点而已,不分正负的
作者: apple_01    时间: 2021-9-6 10:38
有源蜂鸣器是有极性的。
不响,接反的可能性极大。
作者: dwb123    时间: 2021-9-6 11:00
按理说不应该,你拿仪表测一下io口。看是不是坏了
作者: LittleBoss    时间: 2021-9-6 12:43
把蜂鸣器反过来接终于可以响了
作者: LittleBoss    时间: 2021-9-6 12:52
蜂鸣器播放一段难听的音乐(手有点抖)
https://www.youku.com/profile/index?spm=a2hcb.playlsit.table.d_myzipindao&theme=undefined


作者: LittleBoss    时间: 2021-9-6 12:59
结语
重新焊了一下蜂鸣器终于响了,最终原因是有源蜂鸣器正负极接反了,改过来后可以正常响了,说明I/O口和电路都是没问题的。这是本人第一次在这个论坛发问题,感觉学习氛围很好,感谢各位大佬的解答,我从中学到了许多今天开学第一天,终于解决了这个问题,很开心,再次感谢各位!!!

作者: LittleBoss    时间: 2021-9-6 13:04
改正后:


作者: heicad    时间: 2021-9-6 18:54
优酷链接貌似发错了
作者: ZMRGHY    时间: 2021-9-6 19:43
Y_G_G 发表于 2021-9-6 09:31
这是一个很简单的问题,真的,经常动手的人,很快就能找到问题
1,先把单片机蜂鸣器的IO设定成强推挽输出模式( ...

89C52IO口有强捡的模式吗???我没听说过呀
作者: ZMRGHY    时间: 2021-9-6 19:49
弄好了没有。。。。回复一下呀。。。。。

作者: Y_G_G    时间: 2021-9-6 22:49
本帖最后由 Y_G_G 于 2021-9-6 23:05 编辑
ZMRGHY 发表于 2021-9-6 19:43
89C52IO口有强捡的模式吗???我没听说过呀

看错了,看错了,不好意思
作者: TTQ001    时间: 2021-9-7 08:30
感谢更新,所以我们都知道蜂鸣器没有蜂鸣的原因。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1