极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 175244|回复: 33

arduino学习笔记4 - 蜂鸣器实验

  [复制链接]
发表于 2011-7-1 22:24:24 | 显示全部楼层 |阅读模式
本次实验所用的为下图所示的这种小型无源蜂鸣器





通过上网查询参数,得到其工作电压为5V,和arduino控制板数字端口输出电压一致,所以不需要接电阻。可直接接上使用。

先简单介绍一下这种小型蜂鸣器。

小型蜂鸣器因其体积小(直径只有6mm)、重量轻、价格低、结构牢靠,而广泛地应用在各种需要发声的电器设备、电子制作和单片机等电路中。这种蜂鸣器分有源蜂鸣器与无源蜂鸣器

下图为有源蜂鸣器




下图为无源蜂鸣器



从外观上看,两种蜂鸣器好像一样,如果将蜂鸣器引脚朝上时,可以看到,有绿色电路板的是一种无源蜂鸣器,没有电路板而使用黑胶密封的是一种有源蜂鸣器。从外观上并不能绝对的区分出有源与无源,最可靠的做法除了查看产品的参数手册以外,还有就是使用万用表测试蜂鸣器电阻,只有8Ω或者16Ω的是无源蜂鸣器,电阻在几百欧以上的是有源蜂鸣器。

有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可以连续发声,而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。

简单介绍完蜂鸣器以后先看一下硬件连接示意图






把下面的代码上传到arduino控制板上,看看实验结果。
  1. int buzzer=7;//设置控制蜂鸣器的数字IO脚
  2. void setup()
  3. {
  4.   pinMode(buzzer,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
  5. }
  6. void loop()
  7. {
  8.   unsigned char i,j;//定义变量
  9.   while(1)
  10.   {
  11.     for(i=0;i<80;i++)//输出一个频率的声音
  12.     {
  13.       digitalWrite(buzzer,HIGH);//发声音
  14.       delay(1);//延时1ms
  15.       digitalWrite(buzzer,LOW);//不发声音
  16.       delay(1);//延时ms
  17.     }
  18.     for(i=0;i<100;i++)//输出另一个频率的声音
  19.     {
  20.       digitalWrite(buzzer,HIGH);//发声音
  21.       delay(2);//延时2ms
  22.       digitalWrite(buzzer,LOW);//不发声音
  23.       delay(2);//延时2ms
  24.     }
  25.   }
  26. }
复制代码
实验效果如下面视频(需要开音响才能听到蜂鸣器发出的声音)



第一个频率的声音为1毫秒发声1毫秒不发声。1秒等于1000毫秒,2毫秒为一个周期。得出频率为500赫兹。

第二个频率的声音为2毫秒发声2毫秒不发声,4毫秒为一个周期。得出频率为250赫兹。

一个事件的循环就是500赫兹的声音响80毫秒,然后250赫兹的声音响100毫秒。如此循环下去。


while()函数

本次试验使用到了while()函数
在loop()中用while也是一个循环语句,一般形式:
while(表达式)

语句

表达式是循环条件,语句是循环体。语义是:计算表达式的值,当值为真(非0)时,执行循环体语句。其执行过程可用下图表:




作用:实现“当型”循环。当“表达式”非0(真)是,执行“语句”。“语句”是被循环执行的程序,称为“循环体”。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2011-11-13 17:20:09 | 显示全部楼层
咋没人顶呢!!!{:soso_e141:}
回复 支持 反对

使用道具 举报

发表于 2011-11-24 10:51:39 | 显示全部楼层
看不太懂啊
Q1:unsigned char i,j;//定义变量     ------->这个j 下文没看到啊

Q2:不用While光用loop是不也是一样的啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-24 11:26:33 | 显示全部楼层
wali 发表于 2011-11-24 10:51
看不太懂啊
Q1:unsigned char i,j;//定义变量     ------->这个j 下文没看到啊

额。。这个例子是改的其他代码,就没有把没用的j去掉。

不用while光loop也行,就是每一个循环定义一次局部变量。

用了while,定义一次以后就在while中循环了,不会多次定义变量。
回复 支持 反对

使用道具 举报

发表于 2011-11-26 01:48:56 | 显示全部楼层
应解释为 500Hz的声音80个周期,共2×80=160毫秒; 250Hz的声音100个周期 共4×100 =400毫秒; 所以总的警报音周期为160+400=560毫秒, while循环就是让这个560毫秒不断重复
回复 支持 反对

使用道具 举报

发表于 2012-2-24 16:52:46 | 显示全部楼层
基本上可以看得懂,慢慢接触吧!
回复 支持 反对

使用道具 举报

发表于 2012-4-14 10:59:32 | 显示全部楼层
enots 发表于 2011-11-26 01:48
应解释为 500Hz的声音80个周期,共2×80=160毫秒; 250Hz的声音100个周期 共4×100 =400毫秒; 所以总的警 ...

这个是正解!
回复 支持 反对

使用道具 举报

发表于 2012-4-15 13:12:57 | 显示全部楼层
蜂鸣器很好控制。
回复 支持 反对

使用道具 举报

发表于 2012-7-26 11:03:48 | 显示全部楼层
继续学习了!
回复 支持 反对

使用道具 举报

发表于 2012-8-7 17:18:14 | 显示全部楼层
基础不好,暴力学习中
回复 支持 反对

使用道具 举报

发表于 2012-8-9 15:17:08 | 显示全部楼层
一个事件的循环就是500赫兹的声音响80毫秒,然后250赫兹的声音响100毫秒。如此循环下去。
我是这样理解的:这个500hz响80是80次*1ms,而250hz为什么不是100*2ms=200ms呢????想了n多时间,还是木有搞懂。。。谢谢解答下!!!
回复 支持 反对

使用道具 举报

发表于 2012-9-29 11:06:58 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

发表于 2012-10-28 12:51:57 | 显示全部楼层
tone函数也可以吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-28 13:07:45 | 显示全部楼层
390467054 发表于 2012-10-28 12:51
tone函数也可以吧。

可以~~
回复 支持 反对

使用道具 举报

发表于 2012-12-16 13:15:29 | 显示全部楼层
好帖子,我跟着做成功了!
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 08:54 , Processed in 0.054222 second(s), 35 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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