32musb.lst
来自「这个是一个完整的MP3项目」· LST 代码 · 共 941 行 · 第 1/4 页
LST
941 行
450 1 }
451
452 void Reserved()
453 {
454 1 printuf("Undefined Interrupt Occured : %x\n", UEPINT);
455 1 }
456 //END OF USB DISK
457 //---------Edit by kent-------------------------------------------------------------
458 void MP3FsInit(unsigned char NDIV, unsigned int RDIV, unsigned char MPCD, unsigned char AUCD)
459 { //!!!!!!!!!!!!!!!先清零!!!!!!!!!这个问题在调试的时候碰到了很多麻烦!!!!!!!!!!!!!!!!!!
460 1 //例如先置5后置11时发现变成了0f,因为0101|1011=1111=F,因此总是不能改歌
461 1 PLLNDIV = 0;
462 1 PLLRDIV = 0;
463 1 MP3CLK = 0;
464 1 AUDCLK = 0;
465 1 //PLL时钟的频率计算方法
466 1 // PLLclk=(OSCclk*(RDIV+1))/(int)(NDIV+1);
467 1 //set PLL CLK
468 1 PLLNDIV = 0x7f&NDIV;//set NDIV
469 1 PLLCON |= (0x3&RDIV) << 6;//set RDIV
470 1 PLLRDIV = (0x3ff&RDIV) >> 2;
471 1 //MP3时钟频率的计算方法
472 1 //MP3CLK=PLLCLK/(int)(MPCD+1)负反馈
473 1 MP3CLK |= MPCD;//0000 0010 MPCD=2
474 1 //必须通过计算得到最小 MP3CLK 24M
475 1
476 1 //AUDCLK计算公式
477 1 //AUDCLK=PLLCLK/(int)(AUCD+1)负反馈
478 1 AUDCLK |= AUCD; //AUCD=4 必须通过计算得到 AUDCLK=12.288MHz 1a
479 1
480 1 }
481
482 void MP3Disable(void)
483 { PLLCON |= PLLRES;
484 1 PLLCON &= (~PLLEN);
485 1 MP3CON |= MSKREQ;
486 1 MP3CON &= (~MPEN);
487 1 AUDCON1 |= 0x20;
488 1 AUDCON1 &= (~0x40);
489 1 AUDCON1 &= (~0x01);
C51 COMPILER V7.20 32MUSB 03/21/2007 13:34:25 PAGE 9
490 1 AUDCON0 = 0x08;
491 1 AUDCON1 = 0xB2;
492 1 AUDDAT = 0xFF;
493 1 }
494 //<<<------------------------by frank----------------------------------------------------
495
496
497 /***Edit by kent***********************************************************/
498 void PllInit(void)
499 {
500 1 if (FirstStart)
501 1 {
502 2 AUXR1 = 0xf2; //这两个寄存器的值在用Start Application和直接上电时不一样,前一种情况下MP3解码器才工作,
503 2 PLLCON = 0; //这里强制将其置为与用Start Application按钮时一致
504 2 FirstStart = 0;
505 2 }
506 1 //锁相环时钟及MP3解码器时钟设置
507 1 CKCON |= X2; //0000 0001使能X2模式,增加处理速度,每个机器周期变成6个振荡周期即3个时钟周期
508 1
509 1 PLLCON &= (~PLLRES);//Enable PLL
510 1 PLLCON |= PLLEN;
511 1 }
512
513 void MP3Init(void)
514 {
515 1
516 1 //MP3音量及音效初始值
517 1 MP3VOR = 0x0f;//0000 1111下同
518 1 MP3VOL = 0x0f;
519 1 MP3BAS = 0x0f;
520 1 MP3MED = 0x0f;
521 1 MP3TRE = 0x0f;
522 1
523 1 //MP3CON自动上电为0011 1111
524 1 MP3CON &= (~MSKREQ); //允许产生MP3中断Clear to allow the MPREQ flag to generate a MP3 interrupt.
525 1 MP3CON |= MPEN; //使能MP3解码器Set to enable the MP3 decoder.
526 1 }
527
528 void AudioInit()
529 { unsigned char i = 10;
530 1 //音频解码器模式及时钟设置
531 1 AUDCON0 = 0x77;//0111 0110
532 1 //AUDCON1 = 0x41;//0100 0111
533 1 AUDCON1 &= (~0xB0);//SRC=0,MSREQ=0,MUDRN=0
534 1 AUDCON1 |= 0x01;
535 1 while (i)i--;
536 1 AUDCON1 |= 0x40;
537 1 }
538
539 void Init(void)
540 {
541 1 PllInit();
542 1 MP3Init();
543 1 AudioInit();
544 1 }
545 /*****Write by kent***************************************************************************************
-/
546 /*PlayInit()函数用来预检MP3歌曲的帧头并作相应的配置*/
547 void PlayInit(unsigned char *SongName)
548 {
549 1 int i = 0, j = 0, f = 0;
550 1 int k = 0;
C51 COMPILER V7.20 32MUSB 03/21/2007 13:34:25 PAGE 10
551 1 unsigned int total_size;
552 1 //MP3Init();
553 1 //分析MP3信息,可能会比较长,但是没有别的办法
554 1 //先要读出一部分文件内容,大小不能确定
555 1 //while(){
556 1 m = ReadSector(SongName, Page_Buf);//先读出512字节
557 1 ////for(k=0;k<64;k++)printuf("%x ",Page_Buf[k]);
558 1 //when the first 3 bytes are 49 44 33 the next can be 03,this means ID3 V2.3
559 1 if (Page_Buf[0] == 0x49)
560 1 if ((Page_Buf[1] == 0x44) && (Page_Buf[2] == 0x33))
561 1 {
562 2 //search the 7th-10th bytes,use the formular to calculate
563 2 /*计算公式
564 2 int total_size;
565 2 total_size = (Size[0]&0x7F)*0x200000 +(Size[1]&0x7F)*0x4000 +(Size[2]&0x7F)*0x80 +(Size[3]&0x7F)
566 2 */
567 2 total_size = (Page_Buf[6] & 0x7F) * 0x200000 + (Page_Buf[7] & 0x7F) * 0x4000 + (Page_Buf[8] & 0x7F) *
- 0x80 + (Page_Buf[9] & 0x7F);
568 2
569 2 while (total_size > 512)
570 2 {
571 3 ReadSector(SongName, Page_Buf);
572 3 total_size -=512;
573 3 }
574 2
575 2 i = total_size;
576 2 printuf("%x", total_size >> 8);
577 2 printuf("%x\n", total_size & 0xFF);
578 2 }
579 1 //else continue;
580 1
581 1 //search whether the next 1.5bytes are 0xFFF,
582 1 //如果接下来是FFF则为MP3帧头,如果不是则为扩展标签头,需要加10个字节的量
583 1 if (Page_Buf[i] != 0xFF)
584 1 i += 10;
585 1 //for(k=i;k<i+4;k++)printuf("%x ",Page_Buf[k]);
586 1 //get MP3 information from FF FX XX XX 4bytes,and show that
587 1 if ((Page_Buf[i] == 0xFF) && (Page_Buf[i + 1] & 0xF0 == 0xF0))
588 1 {
589 2 MP3_Framehead[0] = Page_Buf[i];
590 2 MP3_Framehead[1] = Page_Buf[i + 1];
591 2 MP3_Framehead[2] = Page_Buf[i + 2];
592 2 MP3_Framehead[3] = Page_Buf[i + 3];
593 2 }
594 1 //printu("The MP3 Framehead Bytes:");
595 1 printuf("%x", MP3_Framehead[0]);
596 1 printuf("%x", MP3_Framehead[1]);
597 1 printuf("%x", MP3_Framehead[2]);
598 1 printuf("%x\n", MP3_Framehead[3]);
599 1 //MP3初始化;
600 1
601 1 if (MP3_Framehead[1] & 0x08)
602 1 {//MP3Disable();//MPEG I
603 2 Init();
604 2 switch ((MP3_Framehead[2] & 0x0C) >> 2)
605 2 {
606 3 case 0x00 : MP3FsInit(24, 126, 3, 5); break;//Fs=44.1kHz
607 3 case 0x01 : MP3FsInit(124, 575, 3, 4); break;//Fs=48kHz
608 3 case 0x02 : MP3FsInit(124, 511, 3, 9); AUDCON0 = 0x76; break;//Fs=32kHz
609 3 default : break;
610 3 }
611 2 //PLLRegister=PLLCON;
C51 COMPILER V7.20 32MUSB 03/21/2007 13:34:25 PAGE 11
612 2 //MP3Register=MP3CLK;
613 2 //AudioRegister=AUDCLK;
614 2 }
615 1 else
616 1 {//MP3Disable(); //MPEG II
617 2 Init();
618 2 switch ((MP3_Framehead[2] & 0x0C) >> 2)
619 2 {
620 3 case 0x00 : MP3FsInit(24, 126, 3, 11); break;//Fs=22.05kHz
621 3 case 0x01 : MP3FsInit(124, 575, 3, 9); break;//Fs=24kHz
622 3 case 0x02 : MP3FsInit(124, 511, 3, 19); AUDCON0 = 0x76; break;//Fs=16kHz
623 3 default : break;
624 3 }
625 2
626 2 //PLLRegister=PLLCON;
627 2 //MP3Register=MP3CLK;
628 2 //AudioRegister=AUDCLK;
629 2 }
630 1 //printu("The baud rate of now playing song is:");
631 1 printuf("%x \n", BaudRate[1-MP3_Framehead[1] & 0x07][3-MP3_Framehead[1] & 0x06][(MP3_Framehead[2] & 0xF
-0) >> 4-1]);
632 1 //printu("kbps\n");
633 1
634 1 DataRead = 0;//这句一定要加上
635 1 }
636 //播放MP3歌曲*******write by jingxiao*********************************************************************
-****
637 void PlayMP3(unsigned char *SongName)
638 {
639 1 int i =0;
640 1 // while ( 1 ) {
641 1
642 1 while (MP3STA1&MPFREQ)
643 1 {//MP3解码器请求数据块
644 2 m = ReadSector(SongName, Page_Buf);//从当前歌曲中读取512字节
645 2 for (i=0; i<m; i++)
646 2 {
647 3 while (!(MP3STA1 & MPBREQ))
648 3 {//MP3解码器请求数据字节
649 4 while (!PlayState); //暂停播放
650 4 if (ChangeSong)
651 4 {//发生选曲
652 5 DataRead = 0;
653 5 ChangeSong = 0;
654 5 return;
655 5 }
656 4 }
657 3 MP3DAT = Page_Buf[i]; //向MP3解码器数据寄存器送入一个数据字节
658 3 }
659 2
660 2 if (m < 512)
661 2 {//如果从歌曲中读出的数据不足512个字节则结束本歌曲播放
662 3 NowPlaying++;
663 3 MP3InitFlag = 1;
664 3 return;
665 3 }
666 2 }
667 1
668 1 }
669 //***************************************************************************************************
670
671 void KeyBoardInit()//<<<<<------------------------change by kent-------------------------------------
C51 COMPILER V7.20 32MUSB 03/21/2007 13:34:25 PAGE 12
672 {
673 1 P1 = 0x0f; //将端口1的低四位,即键盘对应的4位置1
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?