C调音符与频率对照表:

#define L1 262
#define L1_ 277
#define L2 294
#define L2_ 311
#define L3 300
#define L4 349
#define L4_ 370
#define L5 392
#define L5_ 415
#define L6 440
#define L6_ 466
#define L7 494
#define N1 523
#define N1_ 554
#define N2 587
#define N2_ 622
#define N3 659
#define N4 698
#define N4_ 740
#define N5 784
#define N5_ 831
#define N6 880
#define N6_ 932
#define N7 988
#define H1 1046
#define H1_ 1109
#define H2 1175
#define H2_ 1245
#define H3 1318
#define H4 1397
#define H4_ 1480
#define H5 1568
#define H5_ 1661
#define H6 1760
#define H6_ 1865
#define H7 1976
#define END 0
周杰伦《发如雪》简谱

GPIO和TIM初始化
#include "stm32f10x.h"
void RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIM_Configuration(uint16_t freq)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
uint16_t prescaler = 72;
uint16_t period = (freq == 0) ? 0 : (1000000 / freq);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = period - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = prescaler -1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = period / 2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE);
}
音乐模块
#include "stm32f10x.h"
#include "Delay.h"
#include "BUZZER.h"
#define L1 262
#define L1_ 277
#define L2 294
#define L2_ 311
#define L3 300
#define L4 349
#define L4_ 370
#define L5 392
#define L5_ 415
#define L6 440
#define L6_ 466
#define L7 494
#define N1 523
#define N1_ 554
#define N2 587
#define N2_ 622
#define N3 659
#define N4 698
#define N4_ 740
#define N5 784
#define N5_ 831
#define N6 880
#define N6_ 932
#define N7 988
#define H1 1046
#define H1_ 1109
#define H2 1175
#define H2_ 1245
#define H3 1318
#define H4 1397
#define H4_ 1480
#define H5 1568
#define H5_ 1661
#define H6 1760
#define H6_ 1865
#define H7 1976
#define END 0
#define BPM 90
#define BEAT_DURATION (60000/BPM)
typedef enum {
T1_16 = BEAT_DURATION/4,
T1_8 = BEAT_DURATION/2,
T3_8 = BEAT_DURATION*3/4,
T1_4 = BEAT_DURATION,
T1_2 = BEAT_DURATION*2,
T1 = BEAT_DURATION*4
} NoteDuration;
typedef struct
{
uint16_t freq;
uint16_t duration;
} Note;
const Note Music[] = {
{N5, T1_4}, {N6, T1_8}, {H1, T1_8}, {N6, T1_4}, {N5, T1_4}, {N3, T1_4},
{N5, T1_4}, {N6, T1_8}, {H1, T1_8}, {N6, T1_4}, {N5, T1_4}, {N3, T1_4},
{N5, T3_8}, {N5, T1_8}, {N6, T1_4}, {N5, T1_4}, {N3, T1_4},
{N5, T3_8}, {N5, T1_8}, {N6, T1_4}, {N5, T1_4}, {N3, T1_4},
{N2, T1_8}, {N3, T1_8}, {N5, T1_4}, {N3, T1_4}, {N2, T1_4},
{L6, T1_8}, {N1, T1_8}, {N2, T1_4}, {N3, T1_4}, {N2, T1_4},
{N5, T1_2}, {N5, T1_8}, {N6, T1_8}, {N5, T1_4}, {N3, T1_4},
{N5, T1_2}, {N5, T1_8}, {N6, T1_8}, {N5, T1_4}, {N3, T1_4},
{N2, T1_8}, {N3, T1_8}, {N5, T1_4}, {N3, T1_4}, {N2, T1_4},
{L6, T1_8}, {N1, T1_8}, {N2, T1_4}, {N3, T1_4}, {N2, T1_4},
{N5, T1_8}, {N6, T1_8}, {H1, T1_8}, {N6, T1_8}, {N5, T1_8}, {N3, T1_8}, {N5, T1_4},
{N5, T1_8}, {N6, T1_8}, {H1, T1_8}, {N6, T1_8}, {N5, T1_8}, {N3, T1_8}, {N5, T1_4},
{N5, T3_8}, {N5, T1_8}, {N6, T1_4}, {N5, T1_4}, {N3, T1_4},
{N5, T3_8}, {N5, T1_8}, {N6, T1_4}, {N5, T1_4}, {N3, T1_4},
{N2, T1_8}, {N3, T1_8}, {N5, T1_4}, {N3, T1_4}, {N2, T1_4},
{0, T1_4}, {L6, T1_8}, {N1, T1_8}, {N2, T1_4}, {N3, T1_4},
{N2, T1_2}, {N3, T1_4}, {N5, T1_4}, {N3, T1_4}, {N2, T1_2},
{H1, T1_2}, {N6, T1_2}, {N5, T1_2}, {END, 0}
};
void Play_Music(void)
{
uint16_t i = 0;
while(1)
{
if(Music[i].freq == END) break;
if(Music[i].freq == 0)
{
TIM_Cmd(TIM2, DISABLE);
}
else
{
TIM_Configuration(Music[i].freq);
TIM_Cmd(TIM2, ENABLE);
}
Delay_ms(Music[i].duration);
i++;
}
TIM_Cmd(TIM2, DISABLE);
}
主函数
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "BUZZER.h"
#include "MUSIC.h"
#include "KEY.h"
uint8_t KeyNum;
int main(void)
{
KEY_Init();
OLED_Init();
RCC_Configuration();
GPIO_Configuration();
while(1)
{
Play_Music();
}
}