注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档
所用硬件:STM32F103C8T6、无源蜂鸣器、4×4矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口
stm32f103c8t6
面包板
杜邦线
USB转TTL串口模块
RGB三色灯
4×4矩阵键盘
无源蜂鸣器
OLED液晶屏(128*64点阵屏)
flash存储模块
所用软件:keil5
一、项目介绍
本项目是一个基于 STM32F10x 系列微控制器的音乐播放系统,集成了按键控制、音乐播放、OLED 屏幕显示和三色 LED 指示以及 Flash 存储等功能。用户可以通过按键选择不同的操作模式,播放内置的多首歌曲,还能在播放过程中实时控制音乐的音色和音量,同时 OLED 屏幕会显示相应的操作提示和信息,三色 LED 则用于指示当前的工作模式。
二、功能介绍
(一)按键控制
- 模式选择:通过键盘上的按键,用户可以在不同的操作模式之间进行切换,包括音乐选择模式和按键弹奏模式。
- 声音控制:在播放音乐过程中,用户可以使用按键控制声音的音色和音量。
- 歌曲切换:在音乐选择模式下,用户可以通过按键切换不同的内置歌曲进行播放。
(二)内置歌曲
系统内置了多首歌曲,每首歌曲都有对应的音符频率和持续时间数据。这些歌曲包括《生日快乐》《两只老虎》等经典曲目。
(三)屏幕显示
- 操作提示:OLED 屏幕会显示操作提示信息,引导用户进行模式选择和歌曲选择。
- 信息显示:在播放歌曲时,屏幕会显示相应的歌曲信息或提示内容。
(四)LED 指示
通过三色 LED(红、绿、蓝)的不同颜色组合,指示当前系统所处的工作模式,方便用户直观了解系统状态。
(五)Flash存储
提供了 Flash 读写功能,可以将数据存储到 Flash 中,也可以从 Flash 中读取数据。这为后续扩展功能,如保存用户自定义歌曲或设置提供了可能。
三、模式选择
(一)音乐选择模式(MODE_PLAYING)
- 进入方式:按下键盘上对应的按键(如按键 1),系统进入音乐选择模式,此时三色 LED 显示绿色。
- 功能操作:
- OLED 屏幕显示歌曲选择提示信息。
- 用户可以通过按键选择不同的内置歌曲进行播放。
- 在播放过程中,用户可以按下特定按键(如按键 16)停止当前歌曲的播放。
- 播放结束或用户停止播放后,系统自动返回默认模式,三色 LED 恢复红色显示。
(二)按键弹奏模式(MODE_PLAYING_KEYBOARD)
- 进入方式:按下键盘上对应的按键(如按键 2),系统进入按键弹奏模式,此时三色 LED 显示蓝色。
- 功能操作:
- OLED 屏幕显示弹奏提示信息。
- 用户按下键盘上的按键(1 - 15),系统会播放对应的音符。
- 按下按键 16,系统退出按键弹奏模式,返回默认模式,三色 LED 恢复红色显示。
四、引脚接线
1、GND引脚都接到GND即可
2、VCC引脚都接到3.3V即可
3、USB转TTL串口的5V引脚连接到单片机的5V;3.3V引脚不使用
4、USB转TTL串口
TXD~A10
RXD~ A9
5、OLED液晶屏
SCL~B7
SDA~B6
6、矩阵键盘
C1~PA0
C2~PA1
C3~PA2
C4~PA3
R1~PA4
R2~PA5
R3~PA6
R4~PA7
7、RGB三色灯
R~B3
G~B4
B~B5
8、蜂鸣器
I/O引脚~B0
9、FLASH模块
CS~A4
D0~A6
SLK~A5
D1~A7
五、关键部分代码实现
1、键盘初始化
#include "keyboard.h"
void Keyboard_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// C1 - C4 A0 - A3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// R1 - R4 A4 - A7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
2、OLED初始化
#include "OLED.h"
#include "oledfont.h"
void OLED_Init(void)
{
unsigned char temp[20] = {0};
// 初始化IIC接口
IIC_Init();
// 初始化OLED屏幕
// 1. 关闭显示
temp[0] = 0xAE;
OLED_SendCMD(temp, 1);
// 2. 开启电荷泵
temp[0] = 0x8D;
temp[1] = 0x94;
OLED_SendCMD(temp, 2);
// 翻转
temp[0] = 0xA1;
OLED_SendCMD(temp, 1);
temp[0] = 0xC8;
OLED_SendCMD(temp, 1);
// 3. 开启显示
temp[0] = 0xAF;
OLED_SendCMD(temp, 1);
}
3、音乐初始化
#include "hz.h"
#include "stm32f10x.h"
void music_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
4、音乐选择
#include "music.h"
void music_choice(void)
{
while(1)
{
OLED_Clear();
OLED_ShowChinese(0,0,7);
OLED_ShowChinese(0,16,6);
OLED_ShowChinese(0,32,8);
OLED_ShowChinese(0,48,9);
int key = Keyboard_Output();
int i = 0;
if(key != -1)
{
printf("key%d\n",key);
switch(key)
{
case 1:
while(data_11[i]!=-1)
{
music_birthday(data_11[i]);
int key = Keyboard_Output();
if (key == 16)
{
break;
}
delay_ms(data_12[i]);
i++;
}
i = 0;
break;
// 其他音乐选择情况...
case 16:
do {
delay_ms(20);
} while(Keyboard_Output() != -1);
break;
}
do
{
}
while(Keyboard_Output() != -1);
music_birthday(0);
}
delay_ms(500);
if(key == 16)
{
break;
}
}
}
5、音乐播放
#include "hz.h"
#include "stm32f10x.h"
void music_birthday(int i)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = i;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, & TIM_TimeBaseStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_Pulse = i/2;
TIM_OCInitStructure.TIM_OutputState = ENABLE;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM3, & TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
}
六、项目所需硬件及大致介绍结束,闲言少叙,开启正题,链接在此
链接: https://pan.baidu.com/s/1x-E5vJe-R4OsvBmG6CMnmw?pwd=1111 提取码: 1111