找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5132|回复: 1
打印 上一主题 下一主题
收起左侧

Arduino使用pwm控制蜂鸣器的源程序

[复制链接]
跳转到指定楼层
楼主
ID:220130 发表于 2018-8-27 23:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
arduino使用pwm控制蜂鸣器,分别播放1234567和小星星

Arduino源程序:
  1. int speakerPin = 2;
  2. char notes[] = "cdefgabC ";// 依照简谱的順序,填入代表的音符,空白代表休止符
  3. unsigned long beats[] = {1,1,1,1,1,1,1,1}; // 決定每個音阶的拍子,注意这里用 unsigned long 所以拍子只能是正整數
  4. int length = sizeof(notes); // 利用 sizeof(),算出总共要多少音符
  5. int tempo = 300;// 決定一拍多长,這里一拍 300 ms

  6. void setup() {
  7.   pinMode(speakerPin, OUTPUT);
  8. }

  9. void loop() {
  10.   for (int i = 0; i < length; i++) {      // 利用 for 來播放我們设定的歌曲,一個音一個音播放
  11.                                           // 如果是空白的話,不播放音乐
  12.     if (notes[i] == ' ') {
  13.       delay(beats[i] * tempo); // rest
  14.     } else {
  15.                                            // 呼叫 palyNote() 這个 function,将音符转换成信号
  16.       playNote(speakerPin,notes[i], beats[i] * tempo);
  17.     }   
  18.     delay(tempo/10); // 每個音符之間的间隔
  19.   }
  20. }

  21. void playNote(int OutputPin, char note, unsigned long duration) {
  22.    // 音符字元与对应的频率由两个数组表示
  23.   char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  24.   int tones[] = { 261, 294, 330, 349, 392, 440, 494, 523 };
  25.   // 播放音符對應的頻率
  26.   for (int i = 0; i < 8; i++) {
  27.     if (names[i] == note) {
  28.       tone(OutputPin,tones[i], duration);
  29.   //下方的 delay() 及 noTone (),測試過後一定要有這兩行,整體的撥放出來的東西才不會亂掉,可能是因為 Arduino 送出tone () 頻率後會馬上接著執行下個指令,不會等聲音播完,導致撥出的聲音混合而亂掉
  30.       delay(duration);
  31.       noTone(OutputPin);
  32.     }
  33.   }
  34. }
复制代码

所有资料51hei提供下载:
PWM_with_buzzer.rar (3 KB, 下载次数: 19)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:917011 发表于 2021-5-15 11:57 | 只看该作者
所以这是pwm控制的吗
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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