毕业设计 嵌入式 MP3音乐播放器设计与实现

2023-11-18


1 简介

Hi,大家好,学长今天向大家介绍一个 单片机项目

基于单片机的MP3音乐播放器设计与实现

大家可用于 课程设计 或 毕业设计

在这里插入图片描述

2 绪论

2.1 课题背景与目的

随着科学技术的发展, 带数字语音功能的数码终端类产品在日常生活中得到了广泛的使用, 这也促进了与该功能相关的数字音频压缩技术的发展, 在数字音频压缩技术中, MP3的设计与实现以其优异的性能得到了广泛的使用 。 随着数字编解码及压缩技术的发展, 语音文件也朝着高压缩比、 高保真度的方向发展, 从 MP1、 MP2 到目前的 MP3 格式。

3 系统设计

3.1 系统架构

学长设计的音乐播放器, 有四个按键控制按钮: 下一曲, 上一曲, 音量加, 音量减。通过对按钮的控制来实现对单片机要求播放的音乐, 并通过放大电路和音频设备输出声音。 同时通过 LCD 显示屏来显示所播放的曲目。 必要时可调节音量的大小。 硬件系统总体方框图如图所示。
在这里插入图片描述

3.2 软件部分设计

主程序实现对单片机进行初始化后, 进入歌曲识别子程序。 确定歌曲曲目后, 显示屏进行显示。 然后子程序对音乐播放文件进行循环判断, 得到按键的命令后再进行按键播放。

音乐播放的同时, 显示屏显示歌曲名, 单片机调用字节模式读取 U 盘数据进行音乐播放。 在播放音乐的过程中, 子程序循环判断音乐是否播放结束。 当音乐文件播放结束时, 判断是否有按键按下, 并执行相应的命令。 系统流程图如下图所示。

在这里插入图片描述

3.3 实现效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.4 部分相关代码

#include <reg52.h> //包括一个 52 标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
sbit SPK=P1^0; //喇叭输出脚
sbit k0=P3^0;   //第一首歌按键
sbit k1=P3^1;   //第二首歌按键
sbit k2=P3^2;   //第三首歌按键
sbit k3=P3^3;  //停止播放按键
uchar th0_f; //在中断中装载的 T0 的值高 8 位
uchar tl0_f; //在中断中装载的 T0 的值低 8 位
//T0 的值,及输出频率对照表
uchar code freq[36*2]={
 0xA9,0xEF,//00220HZ ,1 //0
   0x93,0xF0,//00233HZ ,1#
     0x73,0xF1,//00247HZ ,2
     0x49,0xF2,//00262HZ ,2#
     0x07,0xF3,//00277HZ ,3
  0xC8,0xF3,//00294HZ ,4
     0x73,0xF4,//00311HZ ,4#
     0x1E,0xF5,//00330HZ ,5
     0xB6,0xF5,//00349HZ ,5#
     0x4C,0xF6,//00370HZ ,6
     0xD7,0xF6,//00392HZ ,6#
 0x5A,0xF7,//00415HZ ,7
     0xD8,0xF7,//00440HZ 1 //12
     0x4D,0xF8,//00466HZ 1# //13
     0xBD,0xF8,//00494HZ 2 //14
  0x24,0xF9,//00523HZ 2# //15
     0x87,0xF9,//00554HZ 3 //16
   0xE4,0xF9,//00587HZ 4 //17
     0x3D,0xFA,//00622HZ 4# //18
     0x90,0xFA,//00659HZ 5 //19
     0xDE,0xFA,//00698HZ 5# //20
     0x29,0xFB,//00740HZ 6 //21
     0x6F,0xFB,//00784HZ 6# //22
     0xB1,0xFB,//00831HZ 7 //23
     0xEF,0xFB,//00880HZ `1
     0x2A,0xFC,//00932HZ `1#
     0x62,0xFC,//00988HZ `2
     0x95,0xFC,//01046HZ `2#
     0xC7,0xFC,//01109HZ `3
     0xF6,0xFC,//01175HZ `4
     0x22,0xFD,//01244HZ `4#
     0x4B,0xFD,//01318HZ `5
     0x73,0xFD,//01397HZ `5#
     0x98,0xFD,//01480HZ `6
     0xBB,0xFD,//01568HZ `6#
     0xDC,0xFD,//01661HZ `7 //35
            };
//定时中断 0,用于产生唱歌频率
timer0() interrupt 1
{
 TL0=tl0_f;
TH0=th0_f; //调入预定时值
 SPK=~SPK; //取反音乐输出 IO
}
//******************************
//音乐符号串解释函数
//入口:要解释的音乐符号串,输出的音调串,输出的时长串
changedata(uchar *song,uchar *diao,uchar *jie)
{
 uchar i,i1,j;
 char gaodi; //高低+/-12 音阶
 uchar banyin;//有没有半个升音阶
 uchar yinchang;//音长
 uchar code jie7[8]={0,12,14,16,17,19,21,23}; //C 调的 7 个值
 *diao=*song;
 for(i=0,i1=0;;)
 {
  gaodi=0; //高低=0
  banyin=0;//半音=0
yinchang=4;//音长 1 拍
  if((*(song+i)=='|') || (*(song+i)==' ')) i++;
  //拍子间隔和一个空格过滤
 switch(*(song+i))
  {
   case ',': gaodi=-12;i++;//低音
   break;
 case '`': gaodi=12;i++; //高音
 break;
 }
if(*(song+i)==0) //遇到 0 结束
 {
*(diao+i1)=0; //加入结束标志 0
*(jie+i1)=0;
   return;
  }
  j=*(song+i)-0x30; i++; //取出基准音
 j=jie7[j]+gaodi; //加上高低音
  yinc: switch(*(song+i))
  {
   case '#': //有半音 j 加一个音阶
i++;j++;
goto yinc;
   case '-': //有一个音节加长
   yinchang+=4;
   i++;
   goto yinc;
   case '_': //有一个音节缩短
   yinchang/=2;
   i++;
   goto yinc;
   case '.': //有一个加半拍
   yinchang=yinchang+yinchang/2;
   i++;
   goto yinc;
  }
  *(diao+i1)=j; //记录音符
  *(jie+i1)=yinchang; //记录音长
  i1++;
 }
}
//******************************************
//奏乐函数
//入口:要演奏的音乐符号串
void play(uchar *songdata)
{
 uchar i,c,j=0,a=0;
 uint n;
 uchar xdata diaodata[112]; //音调缓冲
 uchar xdata jiedata[112]; //音长缓冲
 changedata(songdata,diaodata,jiedata); //解释音乐符号串
 TR0=1;
 for(i=0;diaodata[i]!=0;i++) //逐个符号演奏
 {
  tl0_f=freq[diaodata[i]*2]; //取出对应的定时值送给 T0
  th0_f=freq[diaodata[i]*2+1];
  for(c=0;c<jiedata[i];c++) //按照音长延时
 {
   for(n=0;n<32000;n++);
 if((k0==0)||(k1==0)||(k2==0)||(k3==0)) //发现按键,立即退出播放
 {
TR0=0;
    return;
   }
  }
TR0=0;
  for(n=0;n<500;n++); //音符间延时
  TR0=1;
 }
 TR0=0;
}
//仙剑
uchar code music1[]={
"|3_3_3_2_3-|2_3_2_2_,6,6_,7_|12_1_,7,6_,5_|,6---|"
"3_3_3_2_3.6_|5_6_5_5_22_3_|45_4_32_1_|3.--3_|"
"67_6_55_3_|5--3_5_|26_5_32_3_|3---|"
"26_6_6-|16_6_66_7_|`17_6_76_7_|3.--3_|"
"67_6_55_3_|5--3_5_|67_6_76_7_|3---|"
"26_6_6-|16_6_66_7_|`17_6_7.5_|6---|"
};
uchar code music2[]={
"5-5_3_2_1_|3---|6-6_4_2_1_"
",7--,5_|1.3_5.1_|,7.3_5 5_|"
"6.7_`1.6_|6_5_5-3_2_|1.1_13_2_|"
"1.1_12_3_|2.1_,62_3_|2-- ,5_|"
"1.3_5.1_|,7.3_55_|6.7_`1.6_|"
"6_5_5-3_2_|1.1_13_2_|1.1_12_3_"
"2.,6_,71_2_|1--"
};
//世上只有妈妈好
uchar code music3[]={
"6.5_35|`16_5_6-|35_6_53_2_|1_,6_5_3_2-|"
"2.3_55_6_|321-|5.3_2_1_,6_1_|,5--"
};
void delayms(uint ms) //延时子程序
{
 uchar i;
while(ms--)
 for(i=0;i<123;i++);
}
//3 个按键选择 3 首不同的音乐播放,一个键停止播放
void main(void) // 主程序
{

 TMOD=0x01; //选择为中断 T0 定时方式 1
EA=1; //cpu 开中断
 ET0=1; //T0 开中断
TR0=1; //启动 T0
 while(1)
 {
  if(k0==0) //第一个按键按下
  {
   delayms(10);
   if(k0==0) //按键去抖
  {
    P0=0x06; //数码管显示“1”
 P2=0x00; //显示位置为第一个数码管
play(music1); //播放第一首音乐
   }
  }
  if(k1==0) //第二个按键按下
{
   delayms(10);
   if(k1==0) //按键去抖
  {
    P0=0x5b; //数码管显示“2”
   P2=0x01; //显示位置为第二个数码管
    play(music2); //播放第二首音乐
   }
  }
  if(k2==0)      //第三个按键按下
  {
 delayms(10);
   if(k2==0)    //按键去抖
   {
    P0=0x4f; //数码管显示“3”
 P2=0x02;    //显示位置为第三个数码管
   play(music3);   //播放第三首音乐
  }
  }
 }
}




4 最后

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

毕业设计 嵌入式 MP3音乐播放器设计与实现 的相关文章

  • 基于python美食推荐系统+协同过滤推荐算法+Django框架(源码)✅

    博主介绍 全网粉丝10W 前互联网大厂软件研发 集结硕博英豪成立工作室 专注于计算机相关专业 毕业设计 项目实战6年之久 选择我们就是选择放心 选择安心毕业 感兴趣的可以先收藏起来 点赞 关注不迷路 毕业设计 2023 2024年计算机毕业
  • 机器学习:基于python微博舆情分析系统+可视化+Django框架 K-means聚类算法(源码)✅

    博主介绍 全网粉丝10W 前互联网大厂软件研发 集结硕博英豪成立工作室 专注于计算机相关专业 毕业设计 项目实战6年之久 选择我们就是选择放心 选择安心毕业 感兴趣的可以先收藏起来 点赞 关注不迷路 毕业设计 2023 2024年计算机毕业
  • 实时音频流容器格式

    当我开始接收实时音频 无线电 流 例如 MP3 或 AAC 时 我认为接收到的数据不是原始比特流 即原始编码器输出 但它们总是被包装成某种容器格式 如果这个假设是正确的 那么我想我无法从流的任意位置开始流式传输 但我必须等待某个同步字节 是
  • 在php中读取mp3流并回显给客户端

    我想要实现的是一个页面 当客户端连接时 该页面不断地从本地ice cast服务器读取 http 127 0 0 1 8000 stream mp3 并将流回显给客户端 从那里 客户端可以在基本音频标签中播放它
  • 如何在 Node js 上提供 mp3 文件?

    我正在构建简单的网络应用程序 如果用户按下按钮 它将发出声音 服务器端的 mp3 文件 html file
  • IGraphBuilder.RenderFile 中无法播放 MP3 文件并出现 COM 异常

    我是导演节目开发的新手 我正在学习有关直接表演的知识 我正在尝试编写一种播放一些音频文件的方法 它适用于许多 mp3 文件 但对于我的某些 mp3 文件 接口 IGraphBuilder 的方法 RenderFile 抛出以下异常 发生 C
  • 单击图像时播放 MP3

    我想在单击网站中的某个图像时播放 MP3 文件 我还想隐藏 MP3 文件 我怎样才能做到这一点 我尝试了这段代码 但没有任何反应
  • 从数据库中检索mp3文件

    我有一个关于如何从数据库中检索存储为 byte 数组的 mp3 文件并将其显示在表单中并让用户下载 播放的问题 唔 这确实可以做到 但如果它是 RDBMS 您确实应该重新考虑解决方案 通常 数据库不是为使用大型二进制对象而设计或优化的 并且
  • 在 C# 中查找 MP3 长度

    我在用着TagLib http developer novell com wiki index php TagLib Sharp从一些 MP3 中获取 ID3 标签数据 但我似乎无法找到 MP3 的长度 如何在 C 中找到 MP3 的长度
  • 如何在 ActionScript 3 中从缓冲区(ByteArray/Stream)播放 MP3 声音?

    所以 我有一个MP3 数据缓冲区 如果我保存此缓冲区并将其命名为 buffer mp3 它就会播放 但在这种情况下我不应该将其保存到文件系统 我必须玩 但我不能 我该怎么办 我尝试了下一个代码来播放该缓冲区 ByteArray Stream
  • 为什么在音频标签内使用源标签会阻止 loaddata 事件触发?

    为了更好的可访问性 我们需要第二组替代的播放 暂停控件和 在用户 Kento Nishi 的帮助下 我们成功搬离DEMO A https jsfiddle net j5oxhq38 只有 1 个音频播放控件 DEMO B https jsf
  • 如何用C语言播放MP3文件?

    我正在寻找在 C 中播放 MP3 文件的最简单方法 我正在寻找一个库 在其中我可以只调用文件名上的函数 或者一个将运行并退出的可执行文件 请建议 Using FMOD http www fmod org download 跨平台 这应该像这
  • 如何用java读取/写入ID3v2标签?

    我希望能够从 mp3 文件中读取 ID3v2 标签 我找到了多个框架 可以让我获得基本标签 但我希望能够让这些人list https picard musicbrainz org docs mappings 我不关心与 IDv1 的向后兼容
  • Android 中的音频交叉淡入淡出

    我正在开发一个媒体播放器用于我的学习目的 我希望在媒体播放器应用程序中具有交叉淡入淡出功能 但我不知道从哪里开始 我尝试在互联网上搜索但没有运气 我使用的是安卓MediaPlayer所有媒体播放器相关操作的类 任何人都知道任何解决方法可以实
  • Chromium 嵌入式框架支持 HTML5 音频吗?

    我一直在玩 CefSharp 但似乎无法播放任何音频 我可以让音频控件出现 但它们保持冻结状态 这些是我使用的版本 Chromium 21 0 1180 0 CEF r728 CefSharp 0 12 4596 50 我先尝试了 mp3
  • FFMPEG波形透明,背景纯色

    我正在尝试使用 ffmpeg 生成波形 我希望背景为纯色 实际波形为透明 以下部分实现了我想要的 除了有黑色背景 我希望能够将其更改为任何颜色 但波形是透明的 我怎样才能用 ffmepg 实现这个目标 ffmpeg i input mp3
  • 跨浏览器兼容音频有哪些选项?

    我正在使用这个功能 function playSound file MyAudio new Audio file MyAudio play 不幸的是 我正在努力寻找一种适用于所有浏览器的文件类型 Mp3 适用于 Chrome Safari
  • id3 图像编辑后播放 mp3 时遇到问题

    由于硬件限制 我们生产的软件试图确保导入到其库中的任何音频文件 准备复制到硬件上 都是可接受的比特率 最近 我们开始使用 FFmpeg 将许多不同的音频类型转换为 mp3 以便在我们的硬件上导入和使用它们 虽然转换工作正常并且 mp3 文件
  • Python 可以使用单独的媒体播放器打开 mp3 文件吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以开一个mp3Python 中的文件 可以使用Popen 我并不是要在程序中运行它 我的意思是作为媒体播放器中的一个单独窗口或其
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri

随机推荐

  • docker原理详解

    一 docker简介 docker是一个虚拟环境容器 可以将你的开发环境 代码 配置文件等一并打包到这个容器中 并发布和应用到任意平台中 docker容器和虚拟机都有虚拟隔离的特性 所以一般都会拿虚拟机和docker容器作比较 二 dock
  • C++数据结构 矩阵的转置、镜像及旋转

    C 数据结构 矩阵的转置 镜像及旋转 矩阵介绍 C 中的矩阵是一种二维数组 用于存储数值数据 矩阵可以用于存储图像数据 以及科学和工程计算中的数据 常用于以下场景 数学运算 矩阵乘法 行列式计算 特征值分解等 图像处理 图像缩放 旋转 颜色
  • facebook 审请AppID、AppSecret注意问题

    facebook https developers facebook com https developers facebook com apps 1596024967362217 dashboard 账号 密码 步骤 1 填入应用的包名
  • 文件夹上传到云服务器,文件夹怎么上传到云服务器上

    文件夹怎么上传到云服务器上 内容精选 换一换 RedisShake是一款开源的Redis迁移工具 支持Cluster集群的在线迁移与离线迁移 备份文件导入 但是部署在其他云厂商Redis服务上的Cluster集群数据 由于SYNC PSYN
  • MBR、GPT、LVM分区

    GPT分区 支持大于2T的空间分区UEFI系统 支持128个主分区 parted mklabel New disk label type gpt parted mkpart Partition name vdb1 File system t
  • 搭建zookeeper集群的时候报: JAVA_HOME is not set and java could not be found in PATH.错误

    我在搭建zookeeper集群的时候总是报 JAVA HOME is not set and java could not be found in PATH 的错误 但是我的java环境是没问题的 这个问题困扰我两天了 终于解决了 在此记录
  • 知道这20个正则表达式,能让你少写1,000行代码

    正则表达式 一个十分古老而又强大的文本处理工具 仅仅用一段非常简短的表达式语句 便能够快速实现一个非常复杂的业务逻辑 熟练地掌握正则表达式的话 能够使你的开发效率得到极大的提升 正则表达式经常被用于字段或任意字符串的校验 如下面这段校验基本
  • springcloud微服务系列教程(一) 什么是微服务?为什么要用springcloud?

    前言 这两年 微服务 一词被传得很火 关于微服务的文章在各大技术论坛和博客不断的兴起 不断被转发和评论 技术人员之间的交流也越来越多的青睐微服务这一话题 仿佛不懂微服务就不是一个合格的技术开发者 就连有些公司招聘的要求上都要求应聘者必须掌握
  • Hspice获取节点电流的方法

    如果mos调用时语句为 MNM1 则端口电流输出为 i1 x1 MNM1 表示输出子电路x1里面Device MNM1的第一个节点电流 如果调用语句为 XNM1 用于subckt模型Device的电流输出 则端口电流输出为 isub x1
  • Unity的Text Mesh Pro文字显示重叠处理

    在使用Text Mesh Pro的时候 出现文字重叠 如图 在编辑器内显示是正确的 最后发现是换行造成的 原本的文字是从pdf中复制过来 就会重叠 在记事本中删除换行用回车再次换行就能正确显示
  • CCS5.2.1/5.5 错误-No source available for main()

    1 错误现象 在CCS5 2 1开发环境中从别处导入项目并编译完成后 下载程序时出现如下图所示错误 备注 当前使用的compiler版本为C6000v7 4 14 2 解决办法 进入项目属性设置页面 可以看到当前的调试模式为 Suppres
  • 详解PyCharm配置Anaconda的艰难心路历程

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 这篇文章主要介绍了详解PyCharm配置Anaconda的艰难心路历程 小编觉得挺不错的 现在分享给大家 也给大家做个参考 一起跟随小编过来看看吧 在安装好pycharm后
  • 基于JAVA+SpringBoot+VUE的心理健康测试系统的设计与实现

    全网粉丝20W csdn特邀作者 博客专家 CSDN新星计划导师 java领域优质创作者 博客之星 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战 文末获取项目下载方式 一 项目背景介绍 随着现代社会的
  • Redis常用的5种数据类型底层结构是怎样构成的

    前言 Redis是一个基于内存中的数据结构存储系统 可以用作数据库 缓存和消息中间件 Redis支持五种常见对象类型 字符串 String 哈希 Hash 列表 List 集合 Set 以及有序集合 Zset 我们在日常工作中也会经常使用它
  • 架构师成长之路

    延迟队列实现 基于监听key过期实现的延迟队列实现 这里需要继承KeyspaceEventMessageListener类来实现监听redis键过期 public class KeyExpirationEventMessageListene
  • Java CGLIB动态代理示例

    1 CGLIB动态代理简介 JDK动态代理是利用反射机制生成一个实现代理接口的匿名类 在调用具体方法前调用InvokeHandler来处理 而cglib动态代理是利用asm开源包 对代理对象类的class文件加载进来 通过修改其字节码生成子
  • pandas基础用法详解

    pandas基础用法详解 本文旨在总结pandas的基础用法 越用越发感觉基础的重要性 复杂和高级只是基础的衍生 扎实的基础和深刻的理解能帮助我们更快的弄懂复杂的东西 基础的熟悉的也就就能轻松发挥了 pandas是什么 Pandas 是一个
  • rabbitmq的DefaultConsumer使用和不同交换机模式的代码示例

    Defaultconsumer public class Consumer public static void main String args throws IOException TimeoutException 获取TCP长连接 C
  • 基于状态机的单个按键长按,短按实现复用

    开博第一文 希望再次记录学习的过程 按键扫描 单片机里面再基础不过的程序了 但对于初学者来说 用好按键也不是一件简单的事情 在毛老师的介绍下 第一次知道了状态机的思想也可以用于单片机的程序设计 感觉很是新奇 看了老师给发的几个文档后对状态机
  • 毕业设计 嵌入式 MP3音乐播放器设计与实现

    文章目录 1 简介 2 绪论 2 1 课题背景与目的 3 系统设计 3 1 系统架构 3 2 软件部分设计 3 3 实现效果 3 4 部分相关代码 4 最后 1 简介 Hi 大家好 学长今天向大家介绍一个 单片机项目 基于单片机的MP3音乐