迪文科技论坛

 找回密码
 立即注册
搜索
查看: 533|回复: 2

【开源】COF案例分享:触摸式MP3音乐播放器的实现

[复制链接]

570

主题

168

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12207
发表于 2022-4-25 11:39:00 | 显示全部楼层 |阅读模式
——文档转载自电子发烧友

一、触摸式MP3音乐播放器的实现

想要完成对触摸式MP3音乐播放器的制作,需要制作一个有中文歌单的界面和相应的键值发送处理,其它的则是交由外部的开发板来处理。迪文智能屏的界面形式如图1所示,通过翻页处理可以选取更多页的歌单。

1界面形式

在功能设计方面,主要使用了数据变量显示控件、基础触控控件及增量调节控件,其中数据变量显示控件则用于显示选择值,基础触控控件用于页面切换及歌曲选择,增量调节控件用于音量调节,其设计界面见图2所示。

2设计界面

由于要区分选取歌曲的编号和调节的音量值,故设2个变量地址来分别存放,其中0X1000用于歌曲选择,而0X1002则用于音量调节(0-32)。对于增量调节属性的设置,见图3所示。

3增量调节的属性设置

音量调节变量的属性设置,见图4所示。歌单基础触控控件的属性设置,见图5所示。

               
    图4音量调节变量属性设置                      5歌单基础触控控件属性设置

在完成界面制作后,其配置文件按图6所示进行设置。

6配置文件设置

在程序下载后,通过触摸操作其输出如图7所示,说明在触控操作能正确发送信息。

7触控测试

在使用gd32L233开发板的情况下,其信息转换测试如图8所示,即下载歌曲编号2时,可转换为MP3的对应播放指令。

8转换测试

经测试,触控的播放操作还是顺手和方便的。

触摸式MP3播放器功能演示:https://www.bilibili.com/video/BV1Xi4y1k7mY/

二、结构简洁的MP3音乐播放器

以智能屏和MP3音乐播放模块构成音乐播放器前面已经介绍过,当时由于对智能屏的知识储备还不够充足,因此是采用开发板作为中介,通过对数据的转换处理来实现的。在掌握了C语言开发之后,这种转换机制就完全成了一种多余,它不但可以省去开发板的参与,减少协议转换的中间环节,还能节省不必要的能耗,可谓是受益多多。

简化后的硬件构成如图1所示,即将MP3模块的电源接到智能屏的5V电源上,而模块的串口接收引脚则接到转接板的TX2。可见只需一个MP3播放模块就使智能屏增添了音频播放的功能,使其在多媒体的性能上又增添了一抹色彩。

  
1硬件构成                                                     2原硬件构成

3MP3引脚分配

在界面的设计上,则无需进行调整和效果,见图4所示,所需控件见图5所示。

      
4界面设计                                    5界面所用控件

省去开发板的成本只需添加一段C51的程序,其程序代码如下:
// 发送播放指令
void play_a(void)
{
u8 i;
for(i=0;i<10;i++)
{
UART2_Sendbyte(cmd3);
delay_us(2);
}
}
// 发送音量指令
void play_b(void)
{
u8 i;
for(i=0;i<10;i++)
{
UART2_Sendbyte(cmd6);
delay_us(2);
}
}
// 发送暂停指令
void play_c(void)
{
u8 i;
u8 cmd4[10] = {0X7E, 0xFF, 0x06, 0X0E, 0x00, 0x00, 0x00, 0xFE, 0xED, 0XEF}; //pause
for(i=0;i<10;i++)
{
UART2_Sendbyte(cmd4);
delay_us(2);
}
}
// 发送播放指令
void play_d(void)
{
u8 i;
u8 cmd[10] =  {0X7E, 0xFF, 0x06, 0X0D, 0x00, 0x00, 0x00, 0xFE, 0xEE, 0XEF};  //play
for(i=0;i<10;i++)
{
UART2_Sendbyte(cmd);
delay_us(2);
}
}
// 生成播放指令
void playn(int index) //play index
{
int i;
unsigned char checksum = 0;
cmd3[5] = (unsigned char)(index >> 8);
cmd3[6] = (unsigned char)(index);
for (i=2; i<8; i++)
{
checksum += cmd3;
}
cmd3[8] = (unsigned char)~checksum;
}
// 生成音量调节指令
void setVolume(unsigned char index)  //setVolume index
{
unsigned char checksum = 0;
int i;
cmd6[6] = (unsigned char)(index);
for (i=2; i<8; i++)
{
checksum += cmd6;
}
cmd6[8] = (unsigned char)~checksum;
}
void main(void)
{
u16 u,up,ud;
InitCPU();               //  9600BPS
Starttimer(1,50);
ud=10;
setVolume(10);
play_b();
up=0;
p=0;
while(1)
{
Communication_CMD(2);
u=Read_Dgus(0x1000);
IF(u!=up)
{
if(u==17) play_c();  // pause
if(u==18) play_d();  // play
if(u<17)
{
playn(u);      //play index
play_a();
}
up=u;
}
u=Read_Dgus(0x1002);
if(u!=ud)
{
setVolume(u);
play_b();
ud=u;
}
}
}
该程序的处理机制就是,开机后先指定一个中间程度的音量,然后轮巡是否有按键被触摸,若有键按下并修改了相应变量的内容则加以分析处理,否则不予处理。


根据操作的性质,指令分为3类,即播放指定的歌曲、调节音量和控制播放进程,并分别由函数play_a()~play_d()来完成。


由于播放歌曲和音量调节都涉及数值的变化,所相应函数playn()和setVolume来生成相应的指令。


经编译和格式转换后,只需将生成的文件“T5L51.bin”,下载到智能屏即可。真可谓是成本极低,收获极大。


触摸式MP3播放器功能演示视频链接:https://www.bilibili.com/video/BV1Xi4y1k7mY/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

10

回帖

191

积分

注册会员

Rank: 2

积分
191
发表于 2024-11-9 15:47:59 | 显示全部楼层
这里有个问题,MP3模块如何读取MP3文件名去显示!???
回复

使用道具 举报

0

主题

428

回帖

2362

积分

金牌会员

Rank: 6Rank: 6

积分
2362
发表于 2024-11-9 17:14:57 | 显示全部楼层
djk0125 发表于 2024-11-9 15:47
这里有个问题,MP3模块如何读取MP3文件名去显示!???

这个是开源的项目
这个属于模块去控制的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-12-27 00:36 , Processed in 0.146883 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表