当前位置: 首页 > article >正文

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档

所用硬件: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 - A3GPIO_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 - A7GPIO_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

家人们,觉得有帮助点个赞吧,自学一周做的第一个项目,你的点赞支持就是我继续学习更新的最大动力,谢谢!!!!

相关文章:

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网(IIoT)场景中,结合 DDS(Data Distribution Service) 和 Rx(Reactive Extensions) 技术,实现 …...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...

大数据驱动企业决策智能化的路径与实践

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...

高抗扰度汽车光耦合器的特性

晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档?从规划到实践的完整指南 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...

起重机起升机构的安全装置有哪些?

起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...

Python的__call__ 方法

在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...

Linux操作系统共享Windows操作系统的文件

目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...

Java多线程实现之Runnable接口深度解析

Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...

raid存储技术

1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析

目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...

shell脚本质数判断

shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms 90Hz 屏幕:每秒刷新 90 次,…...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法

使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...

验证redis数据结构

一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...

【Java多线程从青铜到王者】单例设计模式(八)

wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本&#xff0c;sleep也是可以指定时间的&#xff0c;也就是说时间一到就会解除阻塞&#xff0c;继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒)&#xff0c;wait能被notify提前唤醒&#xf…...

【java】【服务器】线程上下文丢失 是指什么

目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失&#xff1f; 直观示例说明 为什么上下文如此重要&#xff1f; 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程&#xff0c;代码应该如何实现 推荐方案&#xff1a;使用 ManagedE…...

FTXUI::Dom 模块

DOM 模块定义了分层的 FTXUI::Element 树&#xff0c;可用于构建复杂的终端界面&#xff0c;支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...