查看: 1317|回复: 0

Atmega128学习笔记第九站---扩展蜂鸣器

[复制链接]

该用户从未签到

发表于 2015-4-30 08:49:14 | 显示全部楼层 |阅读模式
分享到:
今天如期而至的来继续我们的Atmega128求生记第九站-----扩展蜂鸣器
     首先给大家简单介绍一下蜂鸣器的知识,蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。在Atmega128的应用系统中,也常常需要发出声音进行报警、提示错误、操作无效等等警告,这时我们就可以借助于蜂鸣器。
     按照蜂鸣器的工作原理,可以把蜂鸣器分为压电式蜂鸣器和电磁式蜂鸣器两种,压电式蜂鸣器又叫有源蜂鸣器,电磁式蜂鸣器又叫无源蜂鸣器。有源蜂鸣器和无源蜂鸣器的最大区别就是有源蜂鸣器可以在两端加上一个正电压之后就可以发声,而无源蜂鸣器需要再两端加上周期性的频率电压才可以发出声音,有源操作简单方便,但是发出的声音频率固定,无源操作比有源复杂了些,但是可以通过调节发出不同频率的声音,可控性强。
     下面再简单给大家介绍下这两种蜂鸣器的原理:
     1. 有源蜂鸣器即压电式蜂鸣器,主要是由由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。
     2.无源蜂鸣器即电磁式蜂鸣器, 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
     常见的蜂鸣器实物如图1所示:

     从上图蜂鸣器的实物看出,此蜂鸣器有两个引脚,一个引脚用来输入正信号,一个用来输入负信号,当两个引脚之间的电压超过了蜂鸣器工作电压之后,蜂鸣器就进入了工作状态。
     同时蜂鸣器的导通也需要一定的电流流过,所以在接蜂鸣器时候,常常会通过外接驱动器件来对它进行驱动,驱动器件,我们一般选用三极管,当控制端输出高电平,三极管导通,蜂鸣器就工作。
     今天我们实验的例子也是通过三极管来驱动蜂鸣器,使用Atmega128单片机扩展四个独立按键,当按键按下时候,蜂鸣器发声,每个独立按键对应不同的蜂鸣器的的声调。
Atmega128单片机首先判断PA端口有没有按键按下,如果有,再次判断是哪个按键按下了,并且根据不同的按键来驱动蜂鸣器发出不同的声调,思路有了,我们来编代码:
#include<iom128v.h>
#include<macros.h>   //   使用macros.h头文件中的BIT宏定义来对PC的位进行操作
unsigned char Rencent_Key=0xff;
void delay_ms(unsigned int x)    //  延时子函数
void Port_init(void)      //  单片机初始化函数
{
  DDRA=0x00;    //  设置为输入,读取按键值
  PORTA=0xFF;
  DDRC=0xFF;   //  设置为输出,控制蜂鸣器
  PORTC=0x00;
}
void beep(unsigned char)   // 蜂鸣器发声函数
{
  unsigned char i;
  for(i=0;i<50;i++)
         {
      PORTC^=BIT(1);
      delay_ms(t);
           }
PORTC&=BIT(1);
}
void Key_dsy(void)    //按键处理的子函数
{
  unsigned char i=0;
  if (Rencent_Key!=PINA)
    {
     delay_ms(10);
     if (Rencent_Key!=PINA)
        {
           Rencent_Key=PINA;
           switch(Rencent_Key)   //获得按键值后判断
            {
             case 0xfe: beep(2); break;
             case 0xfd: beep(3); break;
             case 0xfb: beep(4); break;
             case 0xf7: beep(8); break;
            default :break;
             }
         }
     }
}
void main(void)
{
  unsigned char i;
  Port_init();
  while(1)
   {
      Key_dsy();
    }
}
今天我就把感觉需要注释的注释在程序代码中了,大家若有疑问或者认为不对的地方,欢迎大家指出。。。。。。
今天的学习笔记就到这结束了啦,感谢大家的观看,我们下期再见。
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

手机版|小黑屋|与非网

GMT+8, 2024-4-19 10:55 , Processed in 0.120566 second(s), 18 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.