zoukankan      html  css  js  c++  java
  • 51单片机 蜂鸣器

    蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。三极管的作用为驱动,通过三极管放大驱动电流,从而可以让蜂鸣器发出声音。

    有源蜂鸣器和无源蜂鸣器的区别:

    这里的“源”不是指电源。而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。 
    而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。 
    有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。 
    无源蜂鸣器的优点是:1。便宜,2。声音频率可控,可以做出“多来米发索拉西”的效果。3。在一些特例中,可以和LED复用一个控制口 有源蜂鸣器的优点是:程序控制方便 。

    例程,参考自网络。

      1 /************************************************************************  
      2 [文件名]  C51音乐程序(八月桂花)  
      3 [功能]    通过单片机演奏音乐  
      4   
      5 /**********************************************************************/   
      6 #include <REG52.H>    
      7 #include <INTRINS.H>    
      8 //本例采用89C52, 晶振为11.0592MHZ    
      9 //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.    
     10 //频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;    
     11 //所以拿出谱子, 试探编吧!    
     12 
     13 sbit Beep =  P1^5 ; 
     14    
     15 unsigned char n=0;  //n为节拍常数变量    
     16 unsigned char code music_tab[] ={   
     17 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,    
     18 0x20, 0x40, 0x1C , 0x10,   
     19 0x18, 0x10, 0x20 , 0x10,   
     20 0x1C, 0x10, 0x18 , 0x40,   
     21 0x1C, 0x20, 0x20 , 0x20,   
     22 0x1C, 0x20, 0x18 , 0x20,   
     23 0x20, 0x80, 0xFF , 0x20,   
     24 0x30, 0x1C, 0x10 , 0x18,   
     25 0x20, 0x15, 0x20 , 0x1C,   
     26 0x20, 0x20, 0x20 , 0x26,   
     27 0x40, 0x20, 0x20 , 0x2B,   
     28 0x20, 0x26, 0x20 , 0x20,   
     29 0x20, 0x30, 0x80 , 0xFF,   
     30 0x20, 0x20, 0x1C , 0x10,   
     31 0x18, 0x10, 0x20 , 0x20,   
     32 0x26, 0x20, 0x2B , 0x20,   
     33 0x30, 0x20, 0x2B , 0x40,   
     34 0x20, 0x20, 0x1C , 0x10,   
     35 0x18, 0x10, 0x20 , 0x20,   
     36 0x26, 0x20, 0x2B , 0x20,   
     37 0x30, 0x20, 0x2B , 0x40,   
     38 0x20, 0x30, 0x1C , 0x10,   
     39 0x18, 0x20, 0x15 , 0x20,   
     40 0x1C, 0x20, 0x20 , 0x20,   
     41 0x26, 0x40, 0x20 , 0x20,   
     42 0x2B, 0x20, 0x26 , 0x20,   
     43 0x20, 0x20, 0x30 , 0x80,   
     44 0x20, 0x30, 0x1C , 0x10,   
     45 0x20, 0x10, 0x1C , 0x10,   
     46 0x20, 0x20, 0x26 , 0x20,   
     47 0x2B, 0x20, 0x30 , 0x20,   
     48 0x2B, 0x40, 0x20 , 0x15,   
     49 0x1F, 0x05, 0x20 , 0x10,   
     50 0x1C, 0x10, 0x20 , 0x20,   
     51 0x26, 0x20, 0x2B , 0x20,   
     52 0x30, 0x20, 0x2B , 0x40,   
     53 0x20, 0x30, 0x1C , 0x10,   
     54 0x18, 0x20, 0x15 , 0x20,   
     55 0x1C, 0x20, 0x20 , 0x20,   
     56 0x26, 0x40, 0x20 , 0x20,   
     57 0x2B, 0x20, 0x26 , 0x20,   
     58 0x20, 0x20, 0x30 , 0x30,   
     59 0x20, 0x30, 0x1C , 0x10,   
     60 0x18, 0x40, 0x1C , 0x20,   
     61 0x20, 0x20, 0x26 , 0x40,   
     62 0x13, 0x60, 0x18 , 0x20,   
     63 0x15, 0x40, 0x13 , 0x40,   
     64 0x18, 0x80, 0x00   
     65 };   
     66    
     67 void int0()  interrupt 1   //采用中断0 控制节拍    
     68 {  TH0=0xd8;   
     69    TL0=0xef;   
     70    n--;   
     71 }   
     72    
     73 void delay (unsigned char m)   //控制频率延时    
     74 {   
     75  unsigned i=3*m;   
     76  while(--i);   
     77 }   
     78    
     79 void delayms(unsigned char a)  //豪秒延时子程序    
     80 {   
     81   while(--a);                  //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!    
     82 }   
     83    
     84 void main()   
     85 { unsigned char p,m;   //m为频率常数变量    
     86   unsigned char i=0;   
     87   TMOD&=0x0f;   
     88   TMOD|=0x01;   
     89   TH0=0xd8;TL0=0xef;   
     90   IE=0x82;   
     91 play:   
     92    while(1)   
     93     {   
     94     a: p=music_tab[i];   
     95        if(p==0x00)       { i=0, delayms(1000); goto play;}     //如果碰到结束符,延时1秒,回到开始再来一遍    
     96        else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a;}  //若碰到休止符,延时100ms,继续取下一音符    
     97             else         {m=music_tab[i++], n=music_tab[i++];}  //取频率常数 和 节拍常数    
     98              TR0=1;                                             //开定时器1    
     99            while(n!=0) Beep=~Beep,delay(m);                         //等待节拍完成, 通过P1口输出音频(可多声道哦!)    
    100        TR0=0;                                             //关定时器1    
    101     }   
    102 }  
    
    
    
  • 相关阅读:
    JavaAPI基础(1)
    类与对象、封装、构造方法
    Java语言基础
    Request请求的应用
    Response的应用
    java生成动态验证码
    Servlet的配置
    常见的状态码。。
    简单学习【1】——打包JS
    NodeJS2-2环境&调试----引用系统内置模块,引用第三方模块
  • 原文地址:https://www.cnblogs.com/l20902/p/5733007.html
Copyright © 2011-2022 走看看