⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 music play.c

📁 单片机用T1中断在IO口P1.0输出乐曲(在P1.0口与VCC间接一喇叭即可听到) // // 1.由于输出的是方波
💻 C
📖 第 1 页 / 共 2 页
字号:
    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=P1^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;                        //T0:16位定时器、T1:16位定时器
//    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;                     //T0:16位定时器、T1:16位计数器
}

//---------------------------------------------------------------------------//
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);
   }
}
//---------------------------------------------------------------------------// 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -