基于STM32的电子琴音乐播放器设计

基于STM32的电子琴/音乐播放器设计

引言

​ 单片微型计算机室大规模集成电路技术发展的产物,属于第四代电子计算机它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。他的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。

​ 电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用STM32f103rbt6单片机为核心控制元件,设计一个电子琴。

​ 设计核心在于使用STM32单片机内置的

第一章 总体设计

1.1 系统功能

按照设计要求,本系统具有以下功能:

  1. 共有三个基本模式:电子琴模式、录音模式、播放器模式
  2. 电子琴模式下,7个基本按键控制产生7种音调,功能键实现调节音阶和音量
  3. 录音模式可分为录音和放音两个模块,录音状态下会记录弹奏的音调以及时间;放音模式调用音乐播放器某些模块,实现相同的功能。
  4. 音乐播放器模块下,可以实现音乐的播放、暂停、切歌、调速、顺序播放、单曲循环、随机播放、以及进度条显示。
  5. 有两个全局按键中断,可控制模式切换和全局静音/暂停。

1.2 主要技术性能指标

  1. 基本按键:7个;
  2. 功能按键:6个;
  3. 全局中断按键:2个;
  4. 扬声器:1个;
  5. 扬声器功率:1w;
  6. LCD1602:1块;
  7. 主要模式:3个;
  8. 曲库:8首;
  9. 音域范围:262Hz~2217Hz;
  10. 音量阶数:3阶;
  11. 速度阶数:4阶;
  12. 循环模式:3种;

第二章 系统设计

2.1 系统设计

​ 总体系统设计上在硬件上共分为3个区域:基本按键区、功能按键区、LCD显示区。在软件的设计上共分为3个主要模式:电子琴模式、录音模式、播放器模式。主控模块选择使用STM32f103rbt6芯片,进行编程、控制、实现电子琴以及播放器功能。

2.2 硬件设计

2.2.1 整体仿真图

整体设计仿真

2.2.2 按键模块

​ 按键模块分为两部分:基本按键和功能按键

基本按键

功能按键

俩个部分按键分别接在单片机的PC0-PC6以及PC8-PC13接口上。

2.2.3 扬声器模块

扬声器模块

扬声器模块接在单片机的PC07接口上。

2.2.4 显示模块

LCD模块

​ 将LCD1602的D0~D7分别连接到单片机的 PA0~7,使能端 E、 RW、 RS分别连接到单片机的 PA8、 PA11、 PA12。

2.2.5 主控模块

STM32f103rbt6芯片

2.3 软件设计

2.3.1 主要工作原理

​ 设计的主要工作原理是利用STM32所内置的定时器TIM3产生一个PWM信号驱动扬声器产生特定频率的声音。通过改变定时器TIM3的分频预置数改变PWM信号的频率从而产生不同音调的声音。通过改变占空比,从而产生不同音量的声音。

​ 相关流程图如下:

Created with Raphaël 2.3.0 开始 各模块初始化 模式选择输入 模式=1? 钢琴模式 模式=2? 录音模式 模式=3? 播放器模式 等待模式选择 yes no yes no yes no
2.3.2 PWM发生器
#include "pwm.h"

TIM_HandleTypeDef 	TIM3_Handler;      	//定时器句柄 
TIM_OC_InitTypeDef 	TIM3_CH2Handler;	//定时器3通道1句柄

//TIM1 PWM部分初始化 
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
void TIM3_PWM_Init(u16 arr,u16 psc)
{
     
    TIM3_Handler.Instance=TIM3;         	//定时器1
    TIM3_Handler.Init.Prescaler=psc;       	//定时器分频
    TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
    TIM3_Handler.Init.Period=arr;          	//自动重装载值
    TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//分频因子
	TIM3_Handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//使能自动重载
    HAL_TIM_PWM_Init(&TIM3_Handler);       	//初始化PWM
    
    TIM3_CH2Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
    TIM3_CH2Handler.Pulse=arr/2;            //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
    TIM3_CH2Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低 
    HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH2Handler,TIM_CHANNEL_2);//配置TIM3通道2
	
    HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_2);//开启PWM通道2
	 	   
}

//定时器底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_PWM_Init()调用
//htim:定时器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
   
	GPIO_InitTypeDef GPIO_Initure;
	
    if(htim->Instance==TIM3)
	{
   
		__HAL_RCC_TIM3_CLK_ENABLE();			//使能定时器3
		__HAL_AFIO_REMAP_TIM3_ENABLE();		    //TIM3通道引脚完全重映射使能
		__HAL_RCC_GPIOC_CLK_ENABLE();			//开启GPIOC时钟
		
		GPIO_Initure.Pin=GPIO_PIN_7;           	//PC6
		GPIO_Initure.Mode=GPIO_MODE_AF_PP;  	//复用推挽输出
		GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
		GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
		HAL_GPIO_Init(GPIOC,&GPIO_Initure); 	
	}
}

//设置TIM3通道2的占空比
//compare:比较值
void TIM_SetTIM3Compare2(u32 compare)
{
   
	TIM3->CCR2=compare; 
}

//设置TIM3通道2的arr
void TIM_SetTIM3Autoreload(u32 Autoreload)
{
   
	TIM3->ARR=Autoreload;
}
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
   
    HAL_TIM_IRQHandler(&TIM3_Handler);
}
2.3.3 music播放器模块

​ music模块包含了产生声音,静音,音乐播放,音乐切换,进度条展示等相关函数,全都由本人编写

静音模块:通过调用TIM_SetTIM3Compare2()函数让占空比为0,进而达到静音效果。

void buzzerQuiet(void)//停止发声
{
   
	TIM_SetTIM3Compare2
评论 66
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值