文章内容参考:http://www.cnblogs.com/xiaowuyi/p/3343757.html

遇到不懂的方法,可以查看Arduino自带的API

就直接点击arduino的IDE里面菜单的Help(帮助)按钮里面的reference(参考)按钮,你就会发现arduino的Api(arduino说明书)

无源蜂鸣器:一种一体化结构的电子讯响器,分为有源蜂鸣器与无源蜂鸣器。这里的“源”不是指电源,而是指震荡源,有源蜂鸣器内部带震荡源,所以只要一通电就会响,而无源内部不带震荡源,所以如果仅用直流信号无法令其鸣叫,必须用2K-5K的方波去驱动它。从外观上看,两种蜂鸣器区别不大,没有电路板而用胶封闭的一种是有源蜂鸣器。

首先写一段代码让蜂鸣器发声:

  1. int tonepin=;//设置控制蜂鸣器的数字13脚
  2. void setup()
  3. {
  4. pinMode(tonepin,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
  5. }
  6. void loop()
  7. {
  8. unsigned char i,j;
  9. while()
  10. {
  11. for(i=;i<;i++)//输出一个频率的声音
  12. {
  13. digitalWrite(tonepin,HIGH);//发声音
  14. delay();//延时1ms
  15. digitalWrite(tonepin,LOW);//不发声音
  16. delay();//延时ms
  17. }
  18. for(i=;i<;i++)//输出另一个频率的声音,这里的100与前面的80一样,用来控制频率,可以自己调节
  19. {
  20. digitalWrite(tonepin,HIGH);
  21. delay();
  22. digitalWrite(tonepin,LOW);
  23. delay();
  24. }
  25. }
    }

从上面的代码可以看出,for语句中的80、100控制了频率,delay控制了时长,类似与音乐中的节拍。

 无线蜂鸣器演奏音乐

从上面的实验看,如果我们能够控制好频率和节拍,那就有可能演奏出动听的音乐。因此,我们首先需要搞清楚各音调的频率,具体见下表:

低音:

音调

音符

1#

2#

3#

4#

5#

6#

7#

A

221

248

278

294

330

371

416

B

248

278

294

330

371

416

467

C

131

147

165

175

196

221

248

D

147

165

175

196

221

248

278

E

165

175

196

221

248

278

312

F

175

196

221

234

262

294

330

G

196

221

234

262

294

330

371

中音:

音调

音符

1

2

3

4

5

6

7

A

441

495

556

589

661

742

833

B

495

556

624

661

742

833

935

C

262

294

330

350

393

441

495

D

294

330

350

393

441

495

556

E

330

350

393

441

495

556

624

F

350

393

441

495

556

624

661

G

393

441

495

556

624

661

742

高音:

音调

音符

1#

2#

3#

4#

5#

6#

7#

A

882

990

1112

1178

1322

1484

1665

B

990

1112

1178

1322

1484

1665

1869

C

525

589

661

700

786

882

990

D

589

661

700

786

882

990

1112

E

661

700

786

882

990

1112

1248

F

700

786

882

935

1049

1178

1322

G

786

882

990

1049

1178

1322

1484

我们知道了音调的频率后,下一步就是控制音符的演奏时间。每个音符都会播放一定的时间,这样才能构成一首优美的曲子,而不是生硬的一个调的把所有的音符一股脑的都播放出来。

音符节奏分为一拍、半拍、1/4拍、1/8拍,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,所以我们可以为每个音符赋予这样的拍子播放出来,音乐就成了。

从简谱看,该音乐是D调的,这里的各音符对应的频率对应的是上表中D调的部分。另外,该音乐为四分之四拍,每个对应为1拍。几个特殊音符说明如下:

第一,普通音符。如第一个音符3,对应频率350,占1拍。

第二,带下划线音符,表示0.5拍。

第三,有的音符后带一个点,表示多加0.5拍,即1+0.5

第四,有的音符后带一个—,表示多加1拍,即1+1

第五,有的两个连续的音符上面带弧线,表示连音,可以稍微改下连音后面那个音的频率,比如减少或增加一些数值(需自己调试),这样表现会更流畅,其实不做处理,影响也不大。

  1. #define NTD0 -1
  2. #define NTD1 294
  3. #define NTD2 330
  4. #define NTD3 350
  5. #define NTD4 393
  6. #define NTD5 441
  7. #define NTD6 495
  8. #define NTD7 556
  9.  
  10. #define NTDL1 147
  11. #define NTDL2 165
  12. #define NTDL3 175
  13. #define NTDL4 196
  14. #define NTDL5 221
  15. #define NTDL6 248
  16. #define NTDL7 278
  17.  
  18. #define NTDH1 589
  19. #define NTDH2 661
  20. #define NTDH3 700
  21. #define NTDH4 786
  22. #define NTDH5 882
  23. #define NTDH6 990
  24. #define NTDH7 112
  25. //c pinlv
  26. #define WHOLE 1
  27. #define HALF 0.5
  28. #define QUARTER 0.25
  29. #define EIGHTH 0.25
  30. #define SIXTEENTH 0.625
  31.  
  32. int tune[]=
  33. {
  34. NTD3,NTD3,NTD4,NTD5,
  35. NTD5,NTD4,NTD3,NTD2,
  36. NTD1,NTD1,NTD2,NTD3,
  37. NTD3,NTD2,NTD2,
  38. NTD3,NTD3,NTD4,NTD5,
  39. NTD5,NTD4,NTD3,NTD2,
  40. NTD1,NTD1,NTD2,NTD3,
  41. NTD2,NTD1,NTD1,
  42. NTD2,NTD2,NTD3,NTD1,
  43. NTD2,NTD3,NTD4,NTD3,NTD1,
  44. NTD2,NTD3,NTD4,NTD3,NTD2,
  45. NTD1,NTD2,NTDL5,NTD0,
  46. NTD3,NTD3,NTD4,NTD5,
  47. NTD5,NTD4,NTD3,NTD4,NTD2,
  48. NTD1,NTD1,NTD2,NTD3,
  49. NTD2,NTD1,NTD1
  50. };
  51. float durt[]=
  52. {
  53. ,,,,
  54. ,,,,
  55. ,,,,
  56. +0.5,0.5,+,
  57. ,,,,
  58. ,,,,
  59. ,,,,
  60. +0.5,0.5,+,
  61. ,,,,
  62. ,0.5,0.5,,,
  63. ,0.5,0.5,,,
  64. ,,,,
  65. ,,,,
  66. ,,,0.5,0.5,
  67. ,,,,
  68. +0.5,0.5,+,
  69. };
  70. int length;
  71. int tonepin=;
  72. int ledp=;
  73. void setup()
  74. {
  75. pinMode(tonepin,OUTPUT);
  76. pinMode(ledp,OUTPUT);
  77. length=sizeof(tune)/sizeof(tune[]);
  78. }
  79. void loop()
  80. {
  81. for(int x=;x<length;x++)
  82. {
  83. tone(tonepin,tune[x]);
  84. digitalWrite(ledp, HIGH);
  85. delay(*durt[x]);//与前一代码不同之处,这里将原来的500分为了400和100,分别控制led的开与关,对于蜂鸣器来说依然是500.
  86. digitalWrite(ledp, LOW);
  87. delay(*durt[x]);
  88. noTone(tonepin);
  89.  
  90. }
  91. delay();
  92. }

Arduino开发版学习计划--蜂鸣器的更多相关文章

  1. Arduino开发版学习计划

    制定学习开发版的计划,今天先大体过一下整个教程. http://www.bilibili.com/video/av6105302/ 视频中说可以自己制造亦可卫星放上天. Arduino使用C/C++编 ...

  2. Arduino开发版学习计划--蓝牙控制小车行走

    蓝牙模块一共6个引脚,我们一般只需要接4个线就可以了,分别是VCC.GND.TXD.RXD这四个引脚,我们分别接到arduino板子上,VCC接3.3V,GND接板子的GND,蓝牙TXD接板子的RXD ...

  3. Arduino开发版学习计划--直流电机

    代码来源:http://www.cnblogs.com/starsnow/p/4579547.html // --------------------------------------------- ...

  4. Arduino开发版学习计划--小车的行走

    小车的前进后退,左右转弯 代码如下 void motor(char pin,char pwmpin,char state,int val) { pinMode(pin, OUTPUT); ) { an ...

  5. 酒旗少年狂暖风,至0基本的前端开发project教师们学习计划

    酒旗风暖少年狂,为0基础前端开发project师做学习计划 夜幕降暂时.走到一张废弃已久的书桌前,打开台灯,看到书桌上已经布满灰尘,而桌上的那盆羸弱的文竹已经枝繁叶茂.我擦干净了桌面,坐了下来,把买回 ...

  6. Sql Server 2008开发版(Developer Edition)过期升级企业版(Enterprise Edition)失败后安装学习版(Express Edition)

    最近一个多月,甚是悠哉,无事可做.上线的网站系统也没接到客户的反馈,反而觉得无聊之极了.上周五早上,一上QQ,就收到客户发来消息,管理平台无法登陆了.心里一惊,立马开始查找故障原因.翻看了系统日志,提 ...

  7. 治愈 JavaScript 疲态的学习计划【转载】

    来源:伯乐在线 - Rose Wang 像其他人一样,最近我读了 Jose Aguinaga 的文章 <How it feels to learn JavaScript in 2016>. ...

  8. ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  9. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

随机推荐

  1. Spring Cloud(九):分布式配置中心和消息总线

    我们在Spring Cloud(七):使用SVN存储分布式配置中心文件和实现refresh中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码 ...

  2. 从 &quot;org.apache.hadoop.security.AccessControlException:Permission denied: user=...&quot; 看Hadoop 的用户登陆认证

    假设远程提交任务给Hadoop 可能会遇到 "org.apache.hadoop.security.AccessControlException:Permission denied: use ...

  3. QSettings 使用实例 当需要在程序关闭时保存”状态“信息

    用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小,位置,一些别的设置,还有一个经常用的,就是recent files,等等这些都可以通过Qsettings来实现. 我们知 ...

  4. Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结

    Atitit.各种  数据类型 ( 树形结构,表形数据  ) 的结构与存储数据库 attilax  总结 1. 数据结构( 树形结构,表形数据,对象结构 ) 1 2. 编程语言中对应的数据结构 jav ...

  5. android.animation(7) - android:animateLayoutChanges属性和LayoutTransition

    前篇给大家讲了LayoutAnimation的知识,LayoutAnimation虽能实现ViewGroup的进入动画,但只能在创建时有效.在创建后,再往里添加控件就不会再有动画.在API 11后,又 ...

  6. vue-router介绍

    vue-router学习 转自:https://my.oschina.net/u/1416844/blog/849971 1. vue-router介绍 vue-router把react-router ...

  7. Django And Django-Rest-Framework 异常记录

    1.TypeError: init() takes 1 positional argument but 2 were given

  8. Odoo 8.0 new API 之model 装饰

    model装饰器的作用是返回一个集合列表 应用举例: 定义columns langs = fields.Selection(string="Lang",selection=&quo ...

  9. ubuntu 12.04下apache 配置家目录地址

    apache2 最在搞前端相关的东西,上一次也记录了 Linux 下 LAMP环境的搭建,现在记录一下如果改变 apache2 的家目录地址该怎么做,改那个配置文件 修改配置文件 /etc/apach ...

  10. [Linux]Linux应用程序中添加强制中断处理

    注册Ctrl+C的按键signal信号捕捉,在捕捉到该动作后,强制退出应用程序 void handle_sig(int num) { printf( "%s\n", __func_ ...