单片机/MCU论坛
直播中

夕阳接你

11年用户 24经验值
擅长:可编程逻辑 BIOS BIOS BIOS BIOS BIOS 嵌入式技术 BIOS BIOS BIOS BIOS 接口/总线/驱动 BIOS BIOS BIOS 控制/MCU BIOS BIOS BIOS BIOS
私信 关注
[文章]

【MAX32660试用体验】简易8音电子琴1

`家有小宝,想到开发一个电子琴给她添点快乐。
MAX32660的GPIO数量有限,只采用的8个GPIO按键输入8个音符信号,一个GPIO输出音乐到蜂鸣器发出对应音符。
搭建电路如图:
QQ截图20190309210151.png
先在面包做个试验,实物连接如图:


根据C调频率对应表,设置每一个音符的输出频率。
使用mxc_delay( )延时单位时间是1us,一个周期的值就是1000000us(1百万us就是1s)除以音符的频率。
QQ截图20190309213626.png

这里采用传统的做法,大循环扫描是否有按键按下,如有键按下,播放对应音符,代码如下:

  1. /* **** Includes **** */
  2. #include
  3. #include
  4. #include "mxc_config.h"
  5. #include "board.h"
  6. #include "gpio.h"
  7. #include "tmr_utils.h"
  8. #include "mxc_delay.h"

  9. /* **** Definitions **** */
  10. //Input Key define.
  11. #define GPIO_PORT_IN                PORT_0
  12. #define GPIO_PIN_IN1                PIN_12
  13. #define GPIO_PIN_IN2                PIN_2
  14. #define GPIO_PIN_IN3                PIN_3
  15. #define GPIO_PIN_IN4                PIN_4
  16. #define GPIO_PIN_IN5                PIN_5
  17. #define GPIO_PIN_IN6                PIN_6
  18. #define GPIO_PIN_IN7                PIN_7
  19. #define GPIO_PIN_IN8                PIN_13
  20. //Output Beep define.
  21. #define GPIO_PORT_OUT_BEEP          PORT_0
  22. #define GPIO_PIN_OUT_BEEP           PIN_9

  23. //Tone frequency define.
  24. #define CM1 523  //Do
  25. #define CM2 587  //Re
  26. #define CM3 659  //Mi
  27. #define CM4 698  //Fa
  28. #define CM5 784  //So
  29. #define CM6 880  //la
  30. #define CM7 988  //Si
  31. #define CH1 1046 //Do~

  32. /* **** Functions **** */
  33. //Display Tone with frequency
  34. void playTone(int tone, long duration, gpio_cfg_t BeepPin)
  35. {

  36.   long i,F_us;

  37.   F_us = 1000000/tone;

  38.   for(i = 0; i < duration * 1000; i += tone){
  39.         GPIO_OutSet(&BeepPin);
  40.         mxc_delay(F_us/2);
  41.     GPIO_OutClr(&BeepPin);
  42.     mxc_delay(F_us/2);
  43.   }
  44. }

  45. int main(void)
  46. {
  47.     gpio_cfg_t gpio_in1;
  48.     gpio_cfg_t gpio_in2;
  49.     gpio_cfg_t gpio_in3;
  50.     gpio_cfg_t gpio_in4;
  51.     gpio_cfg_t gpio_in5;
  52.     gpio_cfg_t gpio_in6;
  53.     gpio_cfg_t gpio_in7;
  54.     gpio_cfg_t gpio_in8;
  55.     gpio_cfg_t BeepPin;

  56.     int volum = 50;

  57.     printf("
  58. *****  Electronic Piano ******
  59. ");
  60.     printf("Keys Input P0.12 13 2 3 4 5 6 7 and Beep outputs P0.9.
  61. ");

  62.     /* Setup input pin. */
  63.     gpio_in1.port = GPIO_PORT_IN;
  64.     gpio_in1.mask = GPIO_PIN_IN1;
  65.     gpio_in1.pad = GPIO_PAD_PULL_DOWN;
  66.     gpio_in1.func = GPIO_FUNC_IN;
  67.     GPIO_Config(&gpio_in1);
  68.     gpio_in2.port = GPIO_PORT_IN;
  69.     gpio_in2.mask = GPIO_PIN_IN2;
  70.     gpio_in2.pad = GPIO_PAD_PULL_DOWN;
  71.     gpio_in2.func = GPIO_FUNC_IN;
  72.     GPIO_Config(&gpio_in2);
  73.     gpio_in3.port = GPIO_PORT_IN;
  74.     gpio_in3.mask = GPIO_PIN_IN3;
  75.     gpio_in3.pad = GPIO_PAD_PULL_DOWN;
  76.     gpio_in3.func = GPIO_FUNC_IN;
  77.     GPIO_Config(&gpio_in3);
  78.     gpio_in4.port = GPIO_PORT_IN;
  79.     gpio_in4.mask = GPIO_PIN_IN4;
  80.     gpio_in4.pad = GPIO_PAD_PULL_DOWN;
  81.     gpio_in4.func = GPIO_FUNC_IN;
  82.     GPIO_Config(&gpio_in4);
  83.     gpio_in5.port = GPIO_PORT_IN;
  84.     gpio_in5.mask = GPIO_PIN_IN5;
  85.     gpio_in5.pad = GPIO_PAD_PULL_DOWN;
  86.     gpio_in5.func = GPIO_FUNC_IN;
  87.     GPIO_Config(&gpio_in5);
  88.     gpio_in6.port = GPIO_PORT_IN;
  89.     gpio_in6.mask = GPIO_PIN_IN6;
  90.     gpio_in6.pad = GPIO_PAD_PULL_DOWN;
  91.     gpio_in6.func = GPIO_FUNC_IN;
  92.     GPIO_Config(&gpio_in6);
  93.     gpio_in7.port = GPIO_PORT_IN;
  94.     gpio_in7.mask = GPIO_PIN_IN7;
  95.     gpio_in7.pad = GPIO_PAD_PULL_DOWN;
  96.     gpio_in7.func = GPIO_FUNC_IN;
  97.     GPIO_Config(&gpio_in7);
  98.     gpio_in8.port = GPIO_PORT_IN;
  99.     gpio_in8.mask = GPIO_PIN_IN8;
  100.     gpio_in8.pad = GPIO_PAD_PULL_DOWN;
  101.     gpio_in8.func = GPIO_FUNC_IN;
  102.     GPIO_Config(&gpio_in8);

  103.     /* Setup output pin. */
  104.     BeepPin.port = GPIO_PORT_OUT_BEEP;
  105.     BeepPin.mask = GPIO_PIN_OUT_BEEP;
  106.     BeepPin.pad = GPIO_PAD_NONE;
  107.     BeepPin.func = GPIO_FUNC_OUT;
  108.     GPIO_Config(&BeepPin);

  109.     while (1) {
  110.         // Read state of the input pin.
  111.                 if(GPIO_InGet(&gpio_in1))
  112.                 {
  113.                         playTone(CM1,volum,BeepPin);
  114.                 }
  115.                 if(GPIO_InGet(&gpio_in2))
  116.                 {
  117.                         playTone(CM2,volum,BeepPin);
  118.                 }
  119.                 if(GPIO_InGet(&gpio_in3))
  120.                 {
  121.                         playTone(CM3,volum,BeepPin);
  122.                 }
  123.                 if(GPIO_InGet(&gpio_in4))
  124.                 {
  125.                         playTone(CM4,volum,BeepPin);
  126.                 }
  127.                 if(GPIO_InGet(&gpio_in5))
  128.                 {
  129.                         playTone(CM5,volum,BeepPin);
  130.                 }
  131.                 if(GPIO_InGet(&gpio_in6))
  132.                 {
  133.                         playTone(CM6,volum,BeepPin);
  134.                 }
  135.                 if(GPIO_InGet(&gpio_in7))
  136.                 {
  137.                         playTone(CM7,volum,BeepPin);
  138.                 }
  139.                 if(GPIO_InGet(&gpio_in8))
  140.                 {
  141.                         playTone(CH1,volum,BeepPin);
  142.                 }
  143.     }
  144. }

实验结果完美,每个音符都能正常弹出,下一步就是搭建硬件了。
这里跳帽使用3.3v的供电,这样蜂鸣器声音更加响亮逼真。

在使用GPIO1 和GPIO8作为按键输入时,不知道什么原因会一直有按键触发。求指教。

` cc.jpg

回帖(1)

qin_elecfans

2019-3-12 09:50:05
有一个工程师爸爸真幸福哈,玩具都是限量版DIY
2 举报

更多回帖

发帖
×
20
完善资料,
赚取积分