基于51单片机的蜂鸣器设计

电子说

1.3w人已加入

描述

导语

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于各类等电子产品中作发声器件,相对于扬声器控制简单,方便使用。

台式电脑的主机开机会"滴"一声、洗衣机按下按键及洗衣完成都会有声响,以上这些声音都是通过蜂鸣器来发出的,通过这些可与用户形成一定的交互。

蜂鸣器

分为压电式蜂鸣器和电磁式蜂鸣器两种,压电式蜂鸣器通过压电材料和金属片两端施加上一个电压后,由于压电效应,蜂鸣片就会产生机械变形而发出声响。

电磁式蜂鸣器按照其内部是否集成了震荡源可分为有源蜂鸣器,和无源蜂鸣器,利用电磁线圈对蜂鸣片的作用来发声的电子响讯器。

其有源蜂鸣器由于内部集成了震荡源,在蜂鸣器上电后就会以一定的频率发出响声。而无源蜂鸣器则需要使用方波去驱动它。其有源蜂鸣器价格高于无源蜂鸣器。

但无源蜂鸣器可控声音频率,达到一定程度的音乐盒效果。

我们经常使用的为有源式蜂鸣器,蜂鸣器作为电磁感性器件,其驱动需要较大的电流,而IO的输出电流能力有限,因此需要搭配外围电路对其进行控制,常见的方式有三极管。

通过三极管的使得蜂鸣器工作,同时在蜂鸣器两端并联二极管,以保证在关断感性原件蜂鸣器时减小对电路的冲击。

无源代码

元器件是电路良好运行的基本保证,找元器件现货上唯样商城,原厂授权 正品保障,品类齐全。

无源驱动

#include    //此文件中定义了单片机的一些特殊功能寄存器

sbit beep = P1^5;  //定义蜂鸣器的引脚

void Delay_10us(unsigned int time)
{
   while(time--);
}

void Simulate_Pwm(unsigned char period, unsigned char duty)
{
   unsigned char low = period / 100 * duty; //低电平延时时间
   unsigned char high = period - low;       //高电平延时时间
      
   beep = 0;        //蜂鸣器IO电平置低
   Delay_10us(low); //低电平延时时间
   
   beep = 1;        //蜂鸣器IO电平置高
   Delay_10us(high);//高电平延时时间
}

void main()
{
   while(1)
   {
      //使用模拟PWM控制蜂鸣器
      Simulate_Pwm(100, 50);  //周期100*10us,占空比50%——频率:1KHz
   }
}

元器件是电路良好运行的基本保证,找元器件现货上唯样商城,原厂授权 正品保障,品类齐全。

两只老虎

#include  

sbit BUZZ = P1^5 ; //蜂鸣器控制引脚 

unsigned int code NoteFrequ[] = { //中音 1-7 和高音 1-7 对应频率列表 
   523, 587, 659, 698, 784, 880, 988, //中音 1-7 
   1047, 1175, 1319, 1397, 1568, 1760, 1976 //高音 1-7 
} ; 

unsigned int code NoteReload[] = { //中音 1-7 和高音 1-7 对应的定时器重载值 
   65536 - (11059200/12) / (523*2), //中音 1 
   65536 - (11059200/12) / (587*2), //2 
   65536 - (11059200/12) / (659*2), //3 
   65536 - (11059200/12) / (698*2), //4 
   65536 - (11059200/12) / (784*2), //5 
   65536 - (11059200/12) / (880*2), //6 
   65536 - (11059200/12) / (988*2), //7 
   65536 - (11059200/12) / (1047*2), //高音 1 
   65536 - (11059200/12) / (1175*2), //2 
   65536 - (11059200/12) / (1319*2), //3 
   65536 - (11059200/12) / (1397*2), //4 
   65536 - (11059200/12) / (1568*2), //5 
   65536 - (11059200/12) / (1760*2), //6 
   65536 - (11059200/12) / (1976*2), //7 
} ; 

bit enable = 1; //蜂鸣器发声使能标志 
bit tmrflag = 0; //定时器中断完成标志 

unsigned char T0RH = 0xFF; //T0 重载值的高字节 
unsigned char T0RL = 0x00; //T0 重载值的低字节 

void PlayTwoTiger(); 

void main() 

   unsigned int i; 
 
   EA = 1; //使能全局中断 
   TMOD = 0x01; //配置 T0 工作在模式 1 
   TH0 = T0RH; 
   TL0 = T0RL; 
   ET0 = 1; //使能 T0 中断 
   TR0 = 1; //启动 T0 
 
   while (1) 
   { 
      PlayTwoTiger(); //播放乐曲--两支老虎 
      for (i=0; i<40000; i++); //停止一段时间 
   }  


/* 两只老虎乐曲播放函数 */ 
void PlayTwoTiger() 

   unsigned char beat; //当前节拍索引 
   unsigned char note; //当前节拍对应的音符 
   unsigned int time = 0; //当前节拍计时 
   unsigned int beatTime = 0; //当前节拍总时间 
   unsigned int soundTime = 0; //当前节拍需发声时间 
   //两只老虎音符表 
   unsigned char code TwoTigerNote[] = { 
      1, 2, 3, 1, 1, 2, 3, 1, 3, 4, 5, 3, 4, 5, 
      5,6, 5,4, 3, 1, 5,6, 5,4, 3, 1, 1, 5, 1, 1, 5, 1, 
   } ; 

   //两只老虎节拍表,4 表示一拍,1 就是 1/4 拍,8 就是 2 拍 
   unsigned char code TwoTigerBeat[] = { 
      4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 8, 
      3,1, 3,1, 4, 4, 3,1, 3,1, 4, 4, 4, 4, 8, 4, 4, 8, 
   } ; 
 
   for (beat=0; beat//用节拍索引作为循环变量 
   { 
      while (!tmrflag); //每次定时器中断完成后,检测并处理节拍 
      tmrflag = 0; 
      if (time == 0) //当前节拍播完则启动一个新节拍 
      { 
          note = TwoTigerNote[beat] - 1; 
          T0RH = NoteReload[note] >> 8; 
          T0RL = NoteReload[note]; 
          //计算节拍总时间,右移 2 位相当于除 4,移位代替除法可以加快执行速度 
          beatTime = (TwoTigerBeat[beat] * NoteFrequ[note]) >> 2; 
          //计算发声时间,为总时间的 0.75,移位原理同上 
          soundTime = beatTime - (beatTime >> 2); 
          enable = 1; //指示蜂鸣器开始发声 
          time++; 
      } 
      else //当前节拍未播完则处理当前节拍 
      { 
          if (time >= beatTime) //当前持续时间到达节拍总时间时归零, 
          { //并递增节拍索引,以准备启动新节拍 
             time = 0; 
             beat++; 
          } 
          else //当前持续时间未达到总时间时, 
          { 
             time++; //累加时间计数 
             if (time == soundTime) //到达发声时间后,指示关闭蜂鸣器, 
             { //插入 0.25*总时间的静音间隔,
                 enable = 0; //用以区分连续的两个节拍 
             } 
          } 
      } 
   }  


/* T0 中断服务函数,用于控制蜂鸣器发声 */ 
void InterruptTimer0() interrupt 1 

   TH0 = T0RH; //重新加载重载值 
   TL0 = T0RL; 
   tmrflag = 1; 
   if (enable) //使能时反转蜂鸣器控制电平 
   BUZZ = ~BUZZ; 
   else //未使能时关闭蜂鸣器 
   BUZZ = 1; 
}(twotigernote); )

元器件是电路良好运行的基本保证,找元器件现货上唯样商城,原厂授权 正品保障,品类齐全。

//《世上只有妈妈好》数据表  元器件是电路良好运行的基本保证,找元器件现货上唯样商城,原厂授权 正品保障,品类齐全。
code unsigned char sszymmh[] = { 
6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1,  
//一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。 
//6, 2, 3 分别代表:6, 中音, 3个半拍; 
//5, 2, 1 分别代表:5, 中音, 1个半拍; 
//3, 2, 2 分别代表:3, 中音, 2个半拍; 
//5, 2, 2 分别代表:5, 中音, 2个半拍; 
//1, 3, 2 分别代表:1, 高音, 2个半拍; 
// 
6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1, 
6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2, 
5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1, 
2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0}; 



//《烟花易冷》 
unsigned char code song1[]={ 
   5,2,1, 3,2,1, 2,2,2, 2,2,4, 3,2,1, 1,2,1, 2,2,1, 3,2,4,  
       5,2,1, 3,2,1, 2,2,2, 2,2,2, 5,1,1, 3,2,1, 4,2,1, 3,2,4,  
       3,2,1, 3,2,1, 7,2,1, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1,  
       2,2,1, 3,2,1, 6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1,  
       1,2,1, 7,1,1, 5,1,1, 6,1,6, 5,2,1, 3,2,1, 2,2,2, 2,2,1,  
       2,2,1, 3,2,1, 1,2,1, 2,2,1, 3,2,4, 5,2,1, 3,2,1, 2,2,2,  
       2,2,1, 2,2,1, 5,1,1, 3,2,1, 4,2,1, 3,2,4, 3,2,1, 3,2,1,  
       7,2,3, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1, 2,2,1, 3,2,1,  
       6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1, 1,2,1, 7,1,2,  
       5,1,2, 6,1,6, 0,0,0 }; 
 

有源的也可以试试!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分