#include <reg52.h>
#include <intrins.h>
#define  FREQ 11059200

    //  _2 -- 洢  //
unsigned char code music_tab1[]={    //ʽ:| D7 |D6  D5  D4| D3 |D2  
//D1  D0|
                                    //ף       ||      ||     

    0xcb,                            //ʾ:0xcb=11001011B,,4/16,3Mi
    0x35,0x16,0xb9,0x12,0x96,0x99,0xa5,
    0xbd,0x99,0x96,0x15,0x13,0x15,0x62,
    0x32,0x13,0xa7,0x26,0x25,0x16,0xa9,0x22,
    0xa3,0xa9,0x96,0x15,0x16,0x99,0xe5,
    0xbb,0x15,0xa7,0xaa,0x96,0x99,0xd5,
    0x13,0x15,0x23,0x15,0x16,0x17,0x9a,0xd6,0x15,0x16,
    0xb9,0x12,0x25,0x23,0x23,0x22,0x13,0x12,0x21,0x96,0x15,
    0x43,0xc9,0x96,0x99,0x96,0x15,0x13,0x15,0x16,0x99,
    0xd5,                            //ʽ:| D7  D6  D5  D4  | D3  D2  
//D1  D0|
                                    //|4λ=0ʱǹ|ݵ4λ
    0x00,                            //ֽΪ==0x00˳
};
unsigned char code music_tab2[]={    //
    0x23,0x25,0x26,0x16,0x15,    0x36,0x13,0x42,
    0x23,0x25,0x26,0x16,0x15,    0x26,0x53,
    0x23,0x25,0x26,0x16,0x15,    0x26,0x23,0x42,
    0x25,0x23,0x12,0x13,0x12,0x11,    0x22,0xd6,
    0x26,0xda,    0x25,0x53,    0x12,0x11,0xd6,
    0xad,0x23,0x12,0x13,0x12,0x11,    0x22,0xd6,
    0x00,
};
unsigned char code music_tab3[]={    //Ƽӿ
    0x55,0x23,0x25,0x26,0xa9,0x22,    0x73,
    0x45,0x25,0x26,0x23,0x22,0x21,0x23,    0x72,
    0x52,0x23,0x45,0x43,    0x22,0x21,0xa6,0x25,0x66,
    0xc9,0xa6,0x25,0x23,0x25,0x26,0xa9,    0xf5,
    0x45,0x23,0x25,0x46,0xc9,    0x22,0x13,0x12,0x21,0x22,0x63,
    0x22,0x23,0x25,0x26,0x25,0x23,0x22,0x21,    0x72,
    0x52,0x23,0x45,0x43,    0x22,0x21,0xa6,0x25,0x66,
    0xb9,0x12,0x23,0x25,0x22,0xa5,0xab,0x22,    0x71,
    0x00,
};
unsigned char code music_tab4[]={    //֮
    0x15,0x16,0x75,    0x15,0x16,0x55,0x13,0x15,0x16,0x15,0x16,0x99,0x12,0x13,
    0x65,0x45,0x13,0x12,0x11,0x12,    0x73,
    0x62,0x42,0x12,0x11,0x96,0x15,    0x76,
    0x55,0x23,0x45,0xa9,0x22,    0x53,0x12,0x13,0x65,
    0x52,0x22,0x42,0x21,0xa6,    0xe9,0x91,0x12,0x13,0x12,0x13,0x15,0x99,0x12,
    //Ϊ
    0x20,0x23,0x23,0x23,0x63,    0x22,0x23,0x23,0x22,0x41,0xa6,0x25,
    0x53,0x22,0x21,0xa9,0x21,0xa6,    0x75,
    0x26,0xa9,0x21,0xa6,0xc9,0x12,0x11,0x96,0x15,
    0x23,0x25,0x25,0x26,0x45,0x21,0x22,
    0x13,0x35,0x25,0xa9,0xa6,0x25,0x23,0x22,    0x71,
    0x52,0x25,0x45,0x13,0x15,0x13,0x12,    0x21,0x41,0x22,0x43,0x45,
    0x23,0x25,0x26,0xa9,0x42,0x12,0x33,    0x72,
    0x51,0x22,0x43,0x22,0x21,    0xc6,0xc9,0x29,0xc6,0x45,0x23,0x23,
    0x53,0x25,0x26,0x25,0x13,0x12,0x21,    0x62,0x42,0x23,0x25,
    0x55,0x26,0x25,0x23,0x45,    0x26,0xa9,0x21,0x22,0x63,
    0x52,0x22,0x22,0x13,0x12,0x21,0xa6,0xf9,
    0x00,
};

unsigned char code music_l_tab[8]={0,1,2,3,4,6,8,16};//ʱλ
unsigned char code music_freq_tab[64]={             //ʱֵ
    0xff,0xea,                                      //0 ֹ
    255-FREQ/24/131/256,     //256-FREQ/24/x/256    //1 do ֽ
    256-FREQ/24/131%256,     //256-FREQ/24/x%256    //1 do ֽ
    255-FREQ/24/147/256,256-FREQ/24/147%256,        //2 re
    255-FREQ/24/165/256,256-FREQ/24/165%256,        //3 mi
    255-FREQ/24/175/256,256-FREQ/24/175%256,        //4 fa
    255-FREQ/24/196/256,256-FREQ/24/196%256,        //5 suo
    255-FREQ/24/221/256,256-FREQ/24/221%256,        //6 la
    255-FREQ/24/248/256,256-FREQ/24/248%256,        //7 xi

    0xff,0xea,                                      //0 ֹ
    255-FREQ/24/262/256,256-FREQ/24/262%256,        //1 do
    255-FREQ/24/294/256,256-FREQ/24/294%256,        //2 re
    255-FREQ/24/330/256,256-FREQ/24/330%256,        //3 mi
    255-FREQ/24/350/256,256-FREQ/24/350%256,        //4 fa
    255-FREQ/24/393/256,256-FREQ/24/393%256,        //5 suo
    255-FREQ/24/441/256,256-FREQ/24/441%256,        //6 la
    255-FREQ/24/495/256,256-FREQ/24/495%256,        //7 xi

    0xff,0xea,                                      //0 ֹ
    255-FREQ/24/525/256,256-FREQ/24/525%256,        //1 do
    255-FREQ/24/589/256,256-FREQ/24/589%256,        //2 re
    255-FREQ/24/661/256,256-FREQ/24/661%256,        //3 mi
    255-FREQ/24/700/256,256-FREQ/24/700%256,        //4 fa
    255-FREQ/24/786/256,256-FREQ/24/786%256,        //5 suo
    255-FREQ/24/882/256,256-FREQ/24/882%256,        //6 la
    255-FREQ/24/990/256,256-FREQ/24/990%256,        //7 xi

    0xff,0xea,                                      //0 ֹ
    255-FREQ/24/1049/256,256-FREQ/24/1049%256,      //1 do
    255-FREQ/24/1178/256,256-FREQ/24/1178%256,      //2 re
    255-FREQ/24/1322/256,256-FREQ/24/1322%256,      //3 mi
    255-FREQ/24/1400/256,256-FREQ/24/1400%256,      //4 fa
    255-FREQ/24/1572/256,256-FREQ/24/1572%256,      //5 suo
    255-FREQ/24/1665/256,256-FREQ/24/1665%256,      //6 la
    255-FREQ/24/1869/256,256-FREQ/24/1869%256,      //7 xi

};

unsigned char code music_frequp_tab[64]={           //
    0xff,0xea,                                      //0 ֹ
    255-FREQ/24/139/256,        //1 do ֽ //255-FREQ/24/x/256
    256-FREQ/24/139%256,        //1 do ֽ //256-FREQ/24/x%256
    255-FREQ/24/156/256,256-FREQ/24/156%256,        //2 re
    255-FREQ/24/175/256,256-FREQ/24/175%256,        //3 mi
    255-FREQ/24/185/256,256-FREQ/24/185%256,        //4 fa
    255-FREQ/24/208/256,256-FREQ/24/208%256,        //5 suo
    255-FREQ/24/234/256,256-FREQ/24/234%256,        //6 la
    255-FREQ/24/262/256,256-FREQ/24/262%256,        //7 xi

    0xff,0xea,                                      //0 ֹ
    255-FREQ/24/278/256,256-FREQ/24/278%256,        //1 do
    255-FREQ/24/312/256,256-FREQ/24/312%256,        //2 re
    255-FREQ/24/350/256,256-FREQ/24/350%256,        //3 mi
    255-FREQ/24/371/256,256-FREQ/24/371%256,        //4 fa
    255-FREQ/24/416/256,256-FREQ/24/416%256,        //5 suo
    255-FREQ/24/467/256,256-FREQ/24/467%256,        //6 la
    255-FREQ/24/525/256,256-FREQ/24/525%256,        //7 xi

    0xff,0xea,                                      //0 ֹ
    255-FREQ/24/556/256,256-FREQ/24/556%256,        //1 do
    255-FREQ/24/624/256,256-FREQ/24/624%256,        //2 re
    255-FREQ/24/700/256,256-FREQ/24/700%256,        //3 mi
    255-FREQ/24/742/256,256-FREQ/24/742%256,        //4 fa
    255-FREQ/24/833/256,256-FREQ/24/833%256,        //5 suo
    255-FREQ/24/935/256,256-FREQ/24/935%256,        //6 la
    255-FREQ/24/1049/256,256-FREQ/24/1049%256,      //7 xi

    0xff,0xea,                                      //0 ֹ
    255-FREQ/24/1112/256,256-FREQ/24/1112%256,      //1 do
    255-FREQ/24/1248/256,256-FREQ/24/1248%256,      //2 re
    255-FREQ/24/1400/256,256-FREQ/24/1400%256,      //3 mi
    255-FREQ/24/1484/256,256-FREQ/24/1484%256,      //4 fa
    255-FREQ/24/1618/256,256-FREQ/24/1618%256,      //5 suo
    255-FREQ/24/1764/256,256-FREQ/24/1764%256,      //6 la
    255-FREQ/24/1968/256,256-FREQ/24/1968%256,      //7 xi
};
unsigned char temp_TH1;
unsigned char temp_TL1;

    //  _2 -- IO  //
sbit PIN_MSC=P2^0;                   //  ˿  //

    //  _2 -- ԭ//
void music_delay(unsigned char x);   //ֽʱ
void music_play(unsigned char *msc); //ӳ

    //  _2 --     //
//---------------------------------------------------------------------------//
void music_int_t1 (void) interrupt 3 using 1    //ʱж1//
    {
    PIN_MSC=~PIN_MSC;
    TH1=temp_TH1;
    TL1=temp_TL1;
}

//---------------------------------------------------------------------------//
void music_delay(unsigned char n)     //ʱ 125*n 
    {
    unsigned char i=125,j;
    do {
        do {
            for (j=0; j<230; j++) _nop_(); //j=(11159KHz/12-10)/4
        }while(--i);
    }while(--n);
}

//---------------------------------------------------------------------------//
void music_play(unsigned char *msc)   //
    {
    unsigned char music_freq=32;      // 
    unsigned char music_long;         //
    unsigned char music_data=0;       //
    bit music_up=0;                   //
    bit music_break=0;                //
    temp_TH1=0xff;
    temp_TL1=0xea;                    //()
    TMOD=0x11;                        //T016λʱT116λʱ
    ET0=0;                          //T0ʱж
    ET1=1;                            //T1ʱж
//---------------------------------------------------------
    while (*msc != 0x00)
        {
        music_data=*msc & 0x07;
        music_long=*msc>>4;
        //---------------------------------------------------------
        if (music_long != 0)          //
            {
            if (*msc >=128)           //
                {
                if (((*msc) & 0x08) == 0)
                    {if (music_freq >= 16) music_freq -= 16;}    //½ 
                else
                    {if (music_freq <  48) music_freq += 16;}    //
             }
            //---------------------------------------------------------
            if (music_up==1)          //
                {
                temp_TH1=music_frequp_tab[(music_freq  + (music_data <<1))];
                temp_TL1=music_frequp_tab[(music_freq + (music_data <<1)+1)];
            }
            else                      //
                {
                temp_TH1=music_freq_tab[(music_freq + (music_data <<1))];
                temp_TL1=music_freq_tab[(music_freq + (music_data <<1)+ 1)];
            }
            //---------------------------------------------------------
            if (music_break)          //
                {
                music_delay(music_l_tab[music_long&0x07]-1);
                temp_TH1=0xff;
                temp_TL1=0xea;
                music_delay(1);
            }
            else                      //
                music_delay(music_l_tab[music_long&0x07]);
        }
        //---------------------------------------------------------
        else                          //ǹ
            {
            switch(music_data)
                {
                case 0x04:
                    music_up=0;       //
                    break;
                case 0x05:
                    music_up=1;       //
                    break;
                case 0x06:
                    music_break=0;    //
                    break;
                case 0x07:
                    music_break=1;    //
                    break;
                default:
                    break;
            }
        }
        //---------------------------------------------------------
        msc++;
    }
    ET1=0;                           //Ž,T1ж
    PIN_MSC=1;                       ////   
    temp_TH1=0xff;   
    temp_TL1=0xea;                 //()
    ET0=1;                         //T0ʱж
    TMOD=0x51;                     //T016λʱT116λ
}

//---------------------------------------------------------------------------//
void main(void)                      //ʾ
{
    //    öʱ--------------------------------------
        TMOD   =  0x11;         // TMOD: ʱ1:ģʽ1:16λ;ʱ2:ģʽ1:16
        TCON   =  0x50;       // TCON: ʱ 1;      ʱ 2      //    òж: 
        IP  = 0x08;             //жȼĴIP:|D7_x |x|x  |PS|PT1|PX1|PT0|D0_PX0|//
        IE  = 0x88;             //жĴIE:|D7_EA|x|ET2|ES|ET1|EX1|ET0|D0_EX0|//
   for (;;) {
      //ڴ˵ü̺ʾ//
      music_play(music_tab1);
      music_play(music_tab2);
      music_play(music_tab3);
      music_play(music_tab4);
   }
}
//----