找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3479|回复: 1
收起左侧

基于51单片机控制ysm3a3芯片的音乐播放器MP3的程序源码

[复制链接]
ID:369783 发表于 2018-7-11 21:52 | 显示全部楼层 |阅读模式
可以显示播放时间,显示音量和显示歌名。不过歌名只能显示3个中文字或者6和英文字符。
0.png

单片机源程序如下:
  1. #include "reg52.h"
  2. #include "delay.h"
  3. #include "12864.h"
  4. #include "ysm3a3.h"
  5. #include "stdio.h"

  6. #define FOSC 11059200L      //System frequency
  7. bit busy,SOE;
  8. unsigned int data1[4]={0xfd,0x02,0x04,0xdf};  //上一曲
  9. unsigned int data2[4]={0xfd,0x02,0x03,0xdf};  //下一曲
  10. unsigned int data3[4]={0xfd,0x02,0x05,0xdf};  //音量加
  11. unsigned int data4[4]={0xfd,0x02,0x06,0xdf};  //音量减
  12. unsigned int datak[4]={0xfd,0x02,0x0c,0xdf};  //暂停播放

  13. unsigned char data5[5]={0xfd,0x03,0x31,0x02,0xdf};  //设置音量为05/30
  14. unsigned char data6[5]={0xfd,0x03,0x33,0x00,0xdf};  //设置循环模式为
  15. unsigned int data7[7]={0xfd,0x04,0x41,0x00,0x01,0xdf};  //播放第一首歌

  16. unsigned int datac1[4]={0xfd,0x02,0x11,0xdf};  //查询音量
  17. unsigned int datac4[4]={0xfd,0x02,0x1c,0xdf};  //当前时间
  18. unsigned int datac6[4]={0xfd,0x02,0x1e,0xdf};  //查询歌名

  19. unsigned char j;
  20. unsigned char ss[7];

  21. sbit key1=P1^0; //上一曲
  22. sbit key2=P1^1; //下一曲
  23. sbit key3=P1^2; //音量+
  24. sbit key4=P1^3; //音量-
  25. sbit key5=P1^4; //暂停播放

  26. void SendData(unsigned char dat)
  27. {    while (busy);           //Wait for the completion of the previous data is sent
  28.     ACC = dat;              //Calculate the even parity bit P (PSW.0)
  29.     busy = 1;
  30.     SBUF = ACC;             //Send data to UART buffer
  31. }
  32. void mp3init()
  33. {unsigned int i;
  34.     SCON = 0x50;            //8-bit variable UART
  35.     TMOD = 0x20;            //Set Timer1 as 8-bit auto reload mode
  36.     TH1 = TL1 = -(FOSC/12/32/9600); //Set auto-reload vaule
  37.     TR1 = 1;                //Timer1 start run
  38.     ES = 1;                 //Enable UART interrupt
  39.     EA = 1;                 //Open master interrupt switch

  40.         key1=key2=key3=key4=1;
  41.         for(i=0;i<5;i++)SendData(data5[i]);Delay(2600);                 //音量
  42.         for(i=0;i<5;i++)SendData(data6[i]);Delay(2600);                 //循环模式
  43.         for(i=0;i<6;i++)SendData(data7[i]);Delay(2600);                 //播放第xx首
  44. }       
  45. void mp3()
  46. {                unsigned int i,t,ge,shi,j0,j1,fen,miao;
  47.                 j=0;
  48.                 if(key1==0)
  49.                         {for(i=0;i<4;i++)SendData(data1[i]);DelayMs(100);}         //上一曲
  50.                 if(key2==0)
  51.                         {for(i=0;i<4;i++)SendData(data2[i]);DelayMs(100);}         //下一曲
  52.                 if(key3==0)
  53.                         {for(i=0;i<4;i++)SendData(data3[i]);DelayMs(100);}         //音量加
  54.                 if(key4==0)
  55.                         {for(i=0;i<4;i++)SendData(data4[i]);DelayMs(100);}         //音量减
  56.                 if(key5==0)
  57.                         {for(i=0;i<4;i++)SendData(datak[i]);DelayMs(100);}        //暂停播放
  58.                 for(i=0;i<4;i++)SendData(datac4[i]);DelayMs(60);                              //查询时间
  59.                
  60.                 Show(0x9b,8,ss);                              //显示收到的指令                       


  61.                 shi=ss[4]%16;j0=ss[4]/16;                  //ASCII吗转10进制
  62.                 ge=ss[5]%16;j1=ss[5]/16;
  63.                 if(j0==6)shi=shi+9;
  64.                 if(j1==6)ge=ge+9;       
  65.                 t=shi*16+ge;
  66.                 Show_dig(0x8f,t);                 //显示过滤和转换的时间(s)       

  67.                 fen=t/60;miao=t%60;
  68.                 Show_dig(0x8b,fen);
  69.                 Show(0x8c,2,"分");
  70.                 Show_dig(0x8d,miao);
  71.                 Show(0x8e,2,"秒");

  72. }
  73. void mp3name()
  74. {                  unsigned int i;
  75.                 unsigned char xx[5];
  76.                 j=0;
  77.                 if(key1==0)
  78.                         {for(i=0;i<4;i++)SendData(data1[i]);DelayMs(100);}         //上一曲
  79.                 if(key2==0)
  80.                         {for(i=0;i<4;i++)SendData(data2[i]);DelayMs(100);}         //下一曲
  81.                 if(key3==0)
  82.                         {for(i=0;i<4;i++)SendData(data3[i]);DelayMs(100);}         //音量加
  83.                 if(key4==0)
  84.                         {for(i=0;i<4;i++)SendData(data4[i]);DelayMs(100);}         //音量减
  85.                 if(key5==0)
  86.                         {for(i=0;i<4;i++)SendData(datak[i]);DelayMs(100);}        //暂停播放
  87.                 for(i=0;i<4;i++)SendData(datac6[i]);DelayMs(200);                                        //查询歌名               
  88.                 Show(0x9b,8,ss);                              //显示收到的指令
  89.                 xx[0]=ss[2];
  90.                 xx[1]=ss[3];
  91.                 xx[2]=ss[4];
  92.                 xx[3]=ss[5];                                                                                                                                  //暂存歌名
  93.                 xx[4]=ss[6];
  94.                 xx[5]=ss[7];
  95.                 Show(0x8b,4,"名:");
  96.                 Show(0x8d,6,xx);
  97.                                        
  98. }
  99. void mp3yinliang()
  100. {                unsigned int i,t,ge,shi,j0,j1;
  101.                 j=0;
  102.                 if(key1==0)
  103.                         {for(i=0;i<4;i++)SendData(data1[i]);DelayMs(100);}         //上一曲
  104.                 if(key2==0)
  105.                         {for(i=0;i<4;i++)SendData(data2[i]);DelayMs(100);}         //下一曲
  106.                 if(key3==0)
  107.                         {for(i=0;i<4;i++)SendData(data3[i]);DelayMs(100);}         //音量加
  108.                 if(key4==0)
  109.                         {for(i=0;i<4;i++)SendData(data4[i]);DelayMs(100);}         //音量减
  110.                 if(key5==0)
  111.                         {for(i=0;i<4;i++)SendData(datak[i]);DelayMs(100);}        //暂停播放
  112.                 for(i=0;i<4;i++)SendData(datac1[i]);DelayMs(100);                                    //查询音量

  113.                 Show(0x9b,8,ss);                              //显示收到的指令                       

  114.                 shi=ss[2]%16;j0=ss[2]/16;                  //ASCII吗转10进制
  115.                 ge=ss[3]%16;j1=ss[3]/16;
  116.                 if(j0==6)shi=shi+9;
  117.                 if(j1==6)ge=ge+9;       
  118.                 t=shi*16+ge;

  119.                 Show(0x8b,6,"音量:");
  120.                 Show_dig(0x8e,t);
  121.                 Show(0x8f,2,"  ");                                                              //显示过滤和转换的音量       


  122. }



  123. void Uart_Isr() interrupt 4 using 1
  124. ……………………

  125. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
mp3 12864 TEA5767(显示时间,歌名和音量).rar (1.62 KB, 下载次数: 44)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:662370 发表于 2019-12-12 13:28 | 显示全部楼层
里面的音乐内容是什么?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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