找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1677|回复: 8
打印 上一主题 下一主题
收起左侧

单片机激光琴声音很小 求大神回答一下

[复制链接]
跳转到指定楼层
楼主
为什么我做的这个激光竖琴声音特别小,有没有大佬帮忙看一下是哪里的问题
程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit fmq=P2^0;//定义P2.0口为蜂鸣器信号输出
  5. uint z;
  6. uint code tone[8]={0xfc44,0xfcac,0xfd09,0xfd34,0xfd82,0xfdc8,0xfe06,0xfe22};//对应每个单调的计数初值
  7. uchar code keymode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//按键值,对应io:0,1,2,3,4,5,6,7

  8. /***************按键扫描函数***************/

  9. void anjian()//用整个P0口作为音调的输入按键(独立按键方式)
  10. {
  11.         P0=0xff;//读数据先置1
  12.         if(P0==~keymode[0]) //1
  13.         {
  14.                 z=tone[0];
  15.                 P1=keymode[0];
  16.         }
  17.         if(P0==~keymode[1]) //2
  18.         {
  19.                 z=tone[1];
  20.                 P1=keymode[1];
  21.         }
  22.          if(P0==~keymode[2]) //3
  23.         {
  24.                 z=tone[2];
  25.                 P1=keymode[2];
  26.         }
  27.         if(P0==~keymode[3]) //4
  28.         {
  29.                 z=tone[3];
  30.                 P1=keymode[3];
  31.         }
  32.         if(P0==~keymode[4]) //5
  33.         {
  34.                 z=tone[4];
  35.                 P1=keymode[4];
  36.         }
  37.          if(P0==~keymode[5]) //6
  38.         {
  39.                 z=tone[5];
  40.                 P1=keymode[5];
  41.         }
  42.         if(P0==~keymode[6]) //7
  43.         {
  44.                 z=tone[6];
  45.                 P1=keymode[6];
  46.         }
  47.         if(P0==~keymode[7]) //1.
  48.         {
  49.                 z=tone[7];
  50.                 P1=keymode[7];
  51.         }
  52. }
  53. /************************************/
  54. void zdkg()
  55. {
  56.         if(P0==0xff)
  57.         {
  58.                 P1=0xff;
  59.                 TR1=0;//如果没有按键按下,就关闭定时器中断
  60.                 fmq=1;//同时也关闭蜂鸣器
  61.         }
  62.         else          //否则就进入中断
  63.         {
  64.                 TR1=1;
  65.         }
  66. }
  67. /***************主函数***************************/
  68. void main()
  69. {
  70.         EA=1;//开总中断
  71.         ET1=1;//定时器T1中断允许
  72.         TMOD=0x10;//使用定时器T1的模式1
  73.         TH1=(65536-500)/256;//定时器T1的高8位重新赋初值
  74.         TL1=(65536-500)%256;//定时器T1的低8位重新赋初值
  75.         P1=0xff;//先关所有LED灯

  76.         while(1)
  77.         {
  78.                 anjian();//按键扫描函数
  79.                   zdkg();
  80.         }

  81. }
  82. /*定时器T1的中断服务程序*/
  83. void Time1(void) interrupt 3 using 1
  84. {
  85.         fmq=~fmq; //每进入一次中断就取反一次,快速的进入退出中断,就会听到蜂鸣器发出的音调
  86.         TH1=z/256;//定时器T1的高8位重新赋初值
  87.         TL1=z%256;//定时器T1的低8位重新赋初值
  88. }

复制代码

QQ截图20181108210640.png (194.39 KB, 下载次数: 19)

QQ截图20181108210640.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:409402 发表于 2018-11-8 21:09 | 只看该作者
有没有大神帮忙解答一下疑惑
回复

使用道具 举报

板凳
ID:98526 发表于 2018-11-9 08:36 | 只看该作者
蜂鸣器上的贴纸撕了吗。hh
回复

使用道具 举报

地板
ID:422945 发表于 2018-11-9 09:56 | 只看该作者

貌似电流不够大吧,你看看你选的蜂鸣器,有没有典型电路,我看有的电路还加了反相的二极管
回复

使用道具 举报

5#
ID:98526 发表于 2018-11-9 11:12 | 只看该作者
用PNP三极管应该将蜂鸣器移到低端驱动。
或者将PNP三极管改成NPN三极管,蜂鸣器放在高端不变。
回复

使用道具 举报

6#
ID:409402 发表于 2018-11-9 16:26 | 只看该作者
726434632 发表于 2018-11-9 08:36
蜂鸣器上的贴纸撕了吗。hh

撕了呀~
回复

使用道具 举报

7#
ID:409402 发表于 2018-11-9 16:27 | 只看该作者
jennyli010 发表于 2018-11-9 09:56
貌似电流不够大吧,你看看你选的蜂鸣器,有没有典型电路,我看有的电路还加了反相的二极管

我加了8550的三极管了~
回复

使用道具 举报

8#
ID:409402 发表于 2018-11-9 16:29 | 只看该作者
726434632 发表于 2018-11-9 11:12
用PNP三极管应该将蜂鸣器移到低端驱动。
或者将PNP三极管改成NPN三极管,蜂鸣器放在高端不变。

我用的NPN的三极管,蜂鸣器接在发射集上的。
回复

使用道具 举报

9#
ID:98526 发表于 2018-11-12 08:58 | 只看该作者
1508330424 发表于 2018-11-9 16:29
我用的NPN的三极管,蜂鸣器接在发射集上的。

然后这就是问题所在,三极管用于开关电路,负载应尽量避免处于发射极,否则极有可能不会处于完全导通状态。你可以算一下基极电流,如果你将负载接在发射极,基极电流 = (5V-0.7V-负载压降)/基极电阻。而负载压降根据负载特性不同很难确定。如果负载接在集电极,基极电流 = (5V-0.7V)/基极电阻。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表