📄 mp3_player.lst
字号:
C51 COMPILER V7.50 MP3_PLAYER 01/15/2006 18:49:03 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MP3_PLAYER
OBJECT MODULE PLACED IN MP3_PLAYER.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE MP3_PLAYER.C LARGE ROM(COMPACT) BROWSE
line level source
1
2 #include "AT89C51SND1_REG.H"
3 #include "MP3_PLAYER.H"
4 #include "FILE_SYS.H"
5 #include "MCU_UART.H"
6
7
8 void MP3FsInit(unsigned char NDIV, unsigned int RDIV, unsigned char MPCD, unsigned char AUCD)
9 {
10 1 PLLNDIV = 0;
11 1 PLLRDIV = 0;
12 1 MP3CLK = 0;
13 1 AUDCLK = 0;
14 1 //PLLclk=(OSCclk*(RDIV+1))/(int)(NDIV+1)
15 1 PLLNDIV = 0x7f&NDIV; //set NDIV
16 1 PLLCON |= (0x3&RDIV) << 6; //set RDIV
17 1 PLLRDIV = (0x3ff&RDIV) >> 2;
18 1
19 1 //MP3CLK=PLLCLK/(int)(MPCD+1)
20 1 MP3CLK |= MPCD;
21 1
22 1 //AUDCLK=PLLCLK/(int)(AUCD+1)
23 1 AUDCLK |= AUCD;
24 1
25 1 }
26
27 void PllInit(void)
28 {
29 1 CKCON |= X2;
30 1 PLLCON &= (~PLLRES); //Enable PLL
31 1 PLLCON |= PLLEN;
32 1 }
33
34 void MP3Init()
35 {
36 1 MP3VOR = 0x0a;
37 1 MP3VOL = 0x0a;
38 1 MP3BAS = 0x10;
39 1 MP3MED = 0x10;
40 1 MP3TRE = 0x10;
41 1 MP3CON &= (~MSKREQ); //Clear to allow the
42 1 //MPREQ flag to generate a MP3 interrupt.
43 1 MP3CON |= MPEN; //enable the MP3 decoder.
44 1 }
45
46 void AudioInit()
47 {
48 1 AUDCON0 = 0x77; //0111 0110
49 1 AUDCON1 &= (~0xB0); //SRC=0,MSREQ=0,MUDRN=0
50 1 AUDCON1 |= 0x01;
51 1 AUDCON1 |= 0x40;
52 1 }
53
54 void MP3_Init(void)
55 {
C51 COMPILER V7.50 MP3_PLAYER 01/15/2006 18:49:03 PAGE 2
56 1 PllInit();
57 1 MP3Init();
58 1 AudioInit();
59 1 }
60
61 void PlayMP3()
62 {
63 1 unsigned int i,j,total_size,readbyte;
64 1 unsigned char data MP3_Framehead[4];
65 1
66 1 i = 0;
67 1 readbyte = ReadFile(); //Read 512 Bytes at first
68 1 /* when the first 3 bytes are 49 44 33 the next can be 03,this means ID3 V2.3 */
69 1
70 1 if (PageBuf[0] == 0x49)
71 1 {
72 2 if ((PageBuf[1] == 0x44) && (PageBuf[2] == 0x33))
73 2 {
74 3 total_size = (PageBuf[6] & 0x7F) * 0x200000 + (PageBuf[7] & 0x7F) * 0x4000 + (PageBuf[8] & 0x7F) * 0x
-80 + (PageBuf[9] & 0x7F);
75 3 while (total_size > 512)
76 3 {
77 4 ReadFile();
78 4 total_size -=512;
79 4 }
80 3
81 3 i = total_size;
82 3
83 3 printu("Skip ID3V2\n");
84 3 if (PageBuf[i] != 0xFF) //if not 0xFF,there is not the Frame head, but extend label
85 3 {i += 10;
86 4 printu("Skip Extend Label\n");
87 4 }
88 3 }
89 2 }
90 1 else printu("No ID3V2\n");
91 1
92 1 printuf16x("Frame Header Offset in Page is %x\n",i);
93 1
94 1 if ((PageBuf[i] == 0xFF) && (PageBuf[i + 1] & 0xF0 == 0xF0))//get MP3 information from FF FX XX XX 4b
-ytes,
95 1 {
96 2 MP3_Framehead[0] = PageBuf[i];
97 2 MP3_Framehead[1] = PageBuf[i + 1];
98 2 MP3_Framehead[2] = PageBuf[i + 2];
99 2 MP3_Framehead[3] = PageBuf[i + 3];
100 2 printu("MP3 Frame Header is ");
101 2 for(j=0;j<4;j++)
102 2 printuf("%x ",MP3_Framehead[j]);
103 2 printu("\n");
104 2 }
105 1
106 1 if (MP3_Framehead[1] & 0x08)
107 1 {
108 2 switch ((MP3_Framehead[2] & 0x0C) >> 2)
109 2 {
110 3 case 0x00 : MP3FsInit(24, 126, 3, 5);
111 3 printu("Bit Rate is 44.1 KHz\n");break; //Fs=44.1kHz
112 3 case 0x01 : MP3FsInit(124, 575, 3, 4);
113 3 printu("Bit Rate is 48 KHz\n");break; //Fs=48kHz
114 3 default : break;
115 3 }
C51 COMPILER V7.50 MP3_PLAYER 01/15/2006 18:49:03 PAGE 3
116 2 }
117 1 else
118 1 {
119 2 switch ((MP3_Framehead[2] & 0x0C) >> 2)
120 2 {
121 3 case 0x00 : MP3FsInit(24, 126, 3, 11);
122 3 printu("Bit Rate is 22.05 KHz\n");break; //Fs=22.05kHz
123 3 case 0x01 : MP3FsInit(124, 575, 3, 9);
124 3 printu("Bit Rate is 24 KHz\n");break; //Fs=24kHz
125 3 default : break;
126 3 }
127 2 }
128 1
129 1 for (j=i; j<readbyte; j++) //将已经读到的Page写入MP3解码器
130 1 {
131 2 while (!(MP3STA1 & MPBREQ));
132 2 MP3DAT = PageBuf[j];
133 2 }
134 1 while (1)
135 1 {
136 2 readbyte = ReadFile(); //继续读Page并送入MP3解码器
137 2 for (i=0; i<readbyte; i++)
138 2 {
139 3 while (!(MP3STA1 & MPBREQ));
140 3 MP3DAT = PageBuf[i];
141 3 }
142 2
143 2 if (readbyte < 512)
144 2 return;
145 2 }
146 1 }
147
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 777 ----
CONSTANT SIZE = 188 ----
XDATA SIZE = ---- 13
PDATA SIZE = ---- ----
DATA SIZE = ---- 4
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -