子供からずっと音楽の夢が持っています。今は気持ちも変わらない、ですから、工学部を進学しても、音楽は趣味の一部分として続けつつ、情報学と電気系の専門知識を見つけて、活用して、このプロジェクトが出来ました。
どうぞ、ご清聴ください。
I use the stm32 and keil5 to develop a software piano and show little star or canon in C.

まずは一度演奏を演示しましょう!

[http]

原理グラフ 電路

まずは電路図からご説明行きたいと思います。
取扱い書とPCB

電路

  • 如图所示,按键部分默认一端接地,另一端高电平。当不进行任何操作时,开关断开。按下按键后,高低电平两侧接通,程序检测到电势变化,随后执行命令程序。
  • 図に示されているように、ボタン部分は通常、片側が接地に接続され、もう片側は高い電圧に接続されています。何も操作していないと、スイッチはオープンです。ボタンを押すと、高電圧と低電圧の2つの側が接続され、プログラムは電位の変化を検出し、その後コマンドプログラムを実行します。

    ソフトウェア コード

    つぎのコードは、組み込みCプログラムで、ハードウェアデバイスを制御するためのものです。具体的には、次のタスクを実行します。
  1. ライブラリとヘッダーファイルのインクルード:コードの冒頭で、ハードウェアとのやり取りに必要な関数と定義を提供するいくつかのライブラリとヘッダーファイルが含まれています。
  2. グローバル変数とマクロの定義:コード中でいくつかのグローバル変数、例えばボタンの状態やフラグビット、およびコード内でGPIOコントロール、LEDコントロール、および7セグメントディスプレイの表示を簡素化するためのいくつかのマクロが定義されています。
  3. 音楽の再生:GPIOピンとタイマーの制御を使用して、音楽を再生する機能が実装されています。異なる音程の音符を再生でき、コードにはいくつかの音楽メロディの例が提供されています。
  4. ボタン処理:ボタンの状態を検出および処理し、ボタンが押されたときに音楽の再生、停止、リプレイのトリガーなどのイベントが発生します。このコードにはボタンのデバウンス機能も含まれており、ボタンの安定な押下およびリリースを確保します。
  5. 7セグメントディスプレイの表示:7セグメントディスプレイのピン状態を制御して、数字の表示機能が実現されています。コードにはディスプレイされる数字の配列が定義されています。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    /* USER CODE BEGIN Header */
    /**
    ******************************************************************************
    * @file : main.c
    * @brief : Main program body
    ******************************************************************************
    * @attention
    *
    * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
    * All rights reserved.</center></h2>
    *
    * This software component is licensed by ST under BSD 3-Clause license,
    * the "License"; You may not use this file except in compliance with the
    * License. You may obtain a copy of the License at:
    * opensource.org/licenses/BSD-3-Clause
    *
    ******************************************************************************
    */
    /* USER CODE END Header */
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "tim.h"
    #include "usart.h"
    #include "gpio.h"

    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */

    /* USER CODE END Includes */

    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */

    /* USER CODE END PTD */

    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */

    /* USER CODE END PD */

    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */

    /* USER CODE END PM */

    /* Private variables ---------------------------------------------------------*/

    /* USER CODE BEGIN PV */
    //定义按键部分
    #define Key1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
    #define Key2 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
    #define Key3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_10)
    #define Key4 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11)
    #define Key5 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)
    #define Key6 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13)
    #define Key7 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)
    #define Key8 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15)
    #define Key9 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)





    unsigned char Key1_flag=0;
    unsigned char Key2_flag=0;
    unsigned char Key3_flag=0;
    unsigned char Key4_flag=0;
    unsigned char Key5_flag=0;
    unsigned char Key6_flag=0;
    unsigned char Key7_flag=0;
    unsigned char Key8_flag=0; //定义按键部分
    unsigned char Key9_flag=0; //定义按键部分



    #define led1(b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, (GPIO_PinState) (b)); //
    #define led2(b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, (GPIO_PinState) (b)); //
    #define led3(b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, (GPIO_PinState) (b)); //
    #define led4(b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, (GPIO_PinState) (b)); //
    #define led5(b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, (GPIO_PinState) (b)); //
    #define led6(b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, (GPIO_PinState) (b)); //
    #define led7(b) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, (GPIO_PinState) (b)); //




    #define Smg1_0 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET)
    #define Smg1_1 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET)

    #define Smg2_0 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET)
    #define Smg2_1 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET)

    #define Smg3_0 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET)
    #define Smg3_1 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET)

    #define Smg4_0 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET)
    #define Smg4_1 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET)

    #define Smg5_0 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET)
    #define Smg5_1 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET)

    #define Smg6_0 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET)
    #define Smg6_1 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET)

    #define Smg7_0 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET)
    #define Smg7_1 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET)

    #define Smg8_0 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET)
    #define Smg8_1 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET)
    uint8_t Dis_Data[]= {0x3,0x9F,0x25,0xD,0x99,0x49,0x41,0x1F,0x1,0x9,0xff}; //0,1,2,3,4,5,6,7,8,9,全灭 //定义数码管显示部分

    unsigned int Fre = 0; //频率数据

    unsigned int SoundFlag = 0; //管脚取反标志位


    #define Sound(S) HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,(GPIO_PinState)(S)) //音频输出管脚IO




    uint16_t voiceCount = 0 ; //播放音乐的几个变量
    uint16_t voiceNum = 0 ; //音调
    uint16_t songNum = 0 ; //歌曲
    uint16_t state = 0 ;
    uint16_t stateF = 0 ;



    uint16_t tone[]= //低音1调到高音7调
    {
    63628,63835,64021,64103,64260,64400,64524,
    64580,64684,64777,64820,64898,64968,65030,
    65058,65100,65157,65178,65217,65252,65283
    };

    -詳しい内容はGitHuBを訪問してくだいさい。

ですので、1−7はdo re mi fa so ra si別々。しかし、8は演奏したメロディを再生することができる。コードについて詳しいの部分はこのGitHubに公開されています。

ハドウェア

主にSTM32F103C8T6

omote

ura.JPG?raw=true)

完成!

finish.JPG?raw=true)

もう疲れかなぁ

もう疲れよね