久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 基于單片機(jī)的音樂播放 [打印本頁]

作者: QQQQQQQY    時(shí)間: 2019-5-23 13:26
標(biāo)題: 基于單片機(jī)的音樂播放
#include "MusicPlay.h"
unsigned char *PP[]={song1,song2,song3};//指向歌曲的指針數(shù)組
unsigned char *p;//只想歌曲的指針
unsigned int Point = 0;//歌曲播放位置
bit flag_pause=1;//暫停標(biāo)志位
bit flag_up=0;//上一曲標(biāo)志位
bit flag_down=0;//下一曲標(biāo)志位
int flag_order=0;//歌曲順序
void Delay1ms(unsigned int count);//簡單延時(shí)
void InitialSound(void);//初始化
void Play(unsigned char *sound,unsigned char Signature,unsigned Octachord,unsigned int Speed);//音樂播放函數(shù)
//******************主程序***************************************************
void main()
{
    InitialSound();
    while(1)
    {
        if(k_state==0)//有按鍵按下
        {
            if(k_pause==0)//開始/暫停鍵
            {
                while(k_pause==0);
                flag_pause=~flag_pause;
            }
        }
        while(!flag_pause)
        {
            Play(p+Point,0,3,360);
            Delay1ms(300);
            if(flag_down | flag_up)
            {
                if(flag_down) flag_down=0;
                if(flag_up)   flag_up  =0;
                Point = 0;
            }
            else flag_order++;
            if(flag_pause==1) flag_order--;
        
            if(flag_order == 3)
                flag_order = 0;
            p=PP[flag_order];   
        }
    }
}
//***********************中斷服務(wù)程序*************************************//
void BeepTimer0(void) interrupt 1   //音符中斷程序
{
    BeepIO = !BeepIO;
    TH0    = Sound_Temp_TH0;
    TL0    = Sound_Temp_TL0;
}
//***********************簡單延時(shí)*******************************************//
void Delay1ms(unsigned int count)
{
    unsigned int i,j;
    for(i=0;i<count;i++)
    for(j=0;j<120;j++);
}
//***********************系統(tǒng)初始化********************************************//
void InitialSound(void)
{
    BeepIO = 0;
    Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;   // 計(jì)算TL1應(yīng)裝入的初值  (10ms的初裝值)
    Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;   // 計(jì)算TH1應(yīng)裝入的初值
    TH1 = Sound_Temp_TH1;
    TL1 = Sound_Temp_TL1;
    TMOD  |= 0x11;
    ET0    = 1;
    ET1    = 0;
    TR0    = 0;
    TR1    = 0;
    EA     = 1;
    p=PP[0];
}
/****************************音樂播放函數(shù)***************************************/
/*  input:歌曲名sound
                    調(diào)號signature
          音階octachord
                    速度speed
*/
void Play(unsigned char *sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
{
    unsigned int NewFreTab[12];//新的頻率表
    unsigned char i,j;
    unsigned int LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
    unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;
    if(p==song1) flag_order=0;
    else if (p==song2) flag_order=1;
    else if (p==song3)  flag_order=2;
    for(i=0;i<12;i++)// 根據(jù)調(diào)號及升降八度來生成新的頻率表
    {
        j = i + Signature;
        if(j > 11)
        {
            j = j-12;
            NewFreTab[i] = FreTab[j]*2;
        }
        else
            NewFreTab[i] = FreTab[j];
        if(Octachord == 1)
            NewFreTab[i]>>=2;
        else if(Octachord == 3)
            NewFreTab[i]<<=2;
    }                                   
    SoundLength = 0;
    while(sound[SoundLength] != 0x00)   //計(jì)算歌曲長度
    {
        SoundLength+=2;
    }
//  Point = 0;
    Tone   = sound[Point];
    Length = sound[Point+1];            // 讀出第一個(gè)音符和它時(shí)時(shí)值
   
    LDiv0 = 12000/Speed;                // 算出1分音符的長度(幾個(gè)10ms)
    LDiv4 = LDiv0/4;                    // 算出4分音符的長度
    LDiv4 = LDiv4-LDiv4*SOUND_SPACE;    // 普通音最長間隔標(biāo)準(zhǔn)
    TR0   = 0;
    TR1   = 1;
    while(Point < SoundLength)
    {
        SL=Tone%10;                                 //計(jì)算出音符
        SM=Tone/10%10;                              //計(jì)算出高低音
        SH=Tone/100;                                //計(jì)算出是否升半
        CurrentFre = NewFreTab[SignTab[SL-1]+SH];   //查出對應(yīng)音符的頻率     
        if(SL!=0)
        {
            if (SM==1) CurrentFre >>= 2;        //低音
            if (SM==3) CurrentFre <<= 2;        //高音
            Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//計(jì)算計(jì)數(shù)器初值
            Sound_Temp_TH0 = Temp_T/256;
            Sound_Temp_TL0 = Temp_T%256;
            TH0 = Sound_Temp_TH0;  
            TL0 = Sound_Temp_TL0 + 12; //加12是對中斷延時(shí)的補(bǔ)償
        }
        SLen=LengthTab[Length%10];  //算出是幾分音符
        XG=Length/10%10;            //算出音符類型(0普通1連音2頓音)
        FD=Length/100;
        LDiv=LDiv0/SLen;            //算出連音音符演奏的長度(多少個(gè)10ms)
        if (FD==1)
            LDiv=LDiv+LDiv/2;
        if(XG!=1)
            if(XG==0)               //算出普通音符的演奏長度
                if (SLen<=4)   
                    LDiv1=LDiv-LDiv4;
                else
                    LDiv1=LDiv*SOUND_SPACE;
            else
                LDiv1=LDiv/2;       //算出頓音的演奏長度
        else
            LDiv1=LDiv;
        if(SL==0) LDiv1=0;
            LDiv2=LDiv-LDiv1;       //算出不發(fā)音的長度
      if (SL!=0)
        {
            TR0=1;
            for(i=LDiv1;i>0;i--)    //發(fā)規(guī)定長度的音
            {
                while(TF1==0);
                TH1 = Sound_Temp_TH1;
                TL1 = Sound_Temp_TL1;
                TF1=0;
            }
        }
        if(LDiv2!=0)
        {
            TR0=0; BeepIO=0;
            for(i=LDiv2;i>0;i--)    //音符間的間隔
            {
                while(TF1==0);
                TH1 = Sound_Temp_TH1;
                TL1 = Sound_Temp_TL1;
                TF1=0;
            }
        }
        Point+=2;
        Tone=p[Point];
        Length=p[Point+1];
//按鍵掃描
        if(k_state==0)
        {//掃描開始
            if(k_pause==0)
            {
                while(k_pause==0);
                flag_pause=~flag_pause;
                TR1   = flag_pause;
                return;
            }
            if(k_up==0)
            {
                while(k_up==0);
                flag_up=~flag_up;
                flag_order--;
                if(flag_order < 0)
                    flag_order = 2;//第三首
                 p=PP[flag_order];
                break;
            }
            if(k_down==0)
            {
                while(k_down==0);
                flag_down=~flag_down;
                flag_order++;
                if(flag_order > 2)
                    flag_order=0;//第一首
                 p=PP[flag_order];
                break;
            }
        }//按鍵掃描結(jié)束
    }
    BeepIO = 0;//播放結(jié)束,關(guān)閉
}#include "MusicPlay.h"
unsigned char *PP[]={song1,song2,song3};//指向歌曲的指針數(shù)組
unsigned char *p;//只想歌曲的指針
unsigned int Point = 0;//歌曲播放位置
bit flag_pause=1;//暫停標(biāo)志位
bit flag_up=0;//上一曲標(biāo)志位
bit flag_down=0;//下一曲標(biāo)志位
int flag_order=0;//歌曲順序
void Delay1ms(unsigned int count);//簡單延時(shí)
void InitialSound(void);//初始化
void Play(unsigned char *sound,unsigned char Signature,unsigned Octachord,unsigned int Speed);//音樂播放函數(shù)
//******************主程序***************************************************
void main()
{
    InitialSound();
    while(1)
    {
        if(k_state==0)//有按鍵按下
        {
            if(k_pause==0)//開始/暫停鍵
            {
                while(k_pause==0);
                flag_pause=~flag_pause;
            }
        }
        while(!flag_pause)
        {
            Play(p+Point,0,3,360);
            Delay1ms(300);
            if(flag_down | flag_up)
            {
                if(flag_down) flag_down=0;
                if(flag_up)   flag_up  =0;
                Point = 0;
            }
            else flag_order++;
            if(flag_pause==1) flag_order--;
        
            if(flag_order == 3)
                flag_order = 0;
            p=PP[flag_order];   
        }
    }
}
//***********************中斷服務(wù)程序*************************************//
void BeepTimer0(void) interrupt 1   //音符中斷程序
{
    BeepIO = !BeepIO;
    TH0    = Sound_Temp_TH0;
    TL0    = Sound_Temp_TL0;
}
//***********************簡單延時(shí)*******************************************//
void Delay1ms(unsigned int count)
{
    unsigned int i,j;
    for(i=0;i<count;i++)
    for(j=0;j<120;j++);
}
//***********************系統(tǒng)初始化********************************************//
void InitialSound(void)
{
    BeepIO = 0;
    Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;   // 計(jì)算TL1應(yīng)裝入的初值  (10ms的初裝值)
    Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;   // 計(jì)算TH1應(yīng)裝入的初值
    TH1 = Sound_Temp_TH1;
    TL1 = Sound_Temp_TL1;
    TMOD  |= 0x11;
    ET0    = 1;
    ET1    = 0;
    TR0    = 0;
    TR1    = 0;
    EA     = 1;
    p=PP[0];
}
/****************************音樂播放函數(shù)***************************************/
/*  input:歌曲名sound
                    調(diào)號signature
          音階octachord
                    速度speed
*/
void Play(unsigned char *sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
{
    unsigned int NewFreTab[12];//新的頻率表
    unsigned char i,j;
    unsigned int LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
    unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;
    if(p==song1) flag_order=0;
    else if (p==song2) flag_order=1;
    else if (p==song3)  flag_order=2;
    for(i=0;i<12;i++)// 根據(jù)調(diào)號及升降八度來生成新的頻率表
    {
        j = i + Signature;
        if(j > 11)
        {
            j = j-12;
            NewFreTab[i] = FreTab[j]*2;
        }
        else
            NewFreTab[i] = FreTab[j];
        if(Octachord == 1)
            NewFreTab[i]>>=2;
        else if(Octachord == 3)
            NewFreTab[i]<<=2;
    }                                   
    SoundLength = 0;
    while(sound[SoundLength] != 0x00)   //計(jì)算歌曲長度
    {
        SoundLength+=2;
    }
//  Point = 0;
    Tone   = sound[Point];
    Length = sound[Point+1];            // 讀出第一個(gè)音符和它時(shí)時(shí)值
   
    LDiv0 = 12000/Speed;                // 算出1分音符的長度(幾個(gè)10ms)
    LDiv4 = LDiv0/4;                    // 算出4分音符的長度
    LDiv4 = LDiv4-LDiv4*SOUND_SPACE;    // 普通音最長間隔標(biāo)準(zhǔn)
    TR0   = 0;
    TR1   = 1;
    while(Point < SoundLength)
    {
        SL=Tone%10;                                 //計(jì)算出音符
        SM=Tone/10%10;                              //計(jì)算出高低音
        SH=Tone/100;                                //計(jì)算出是否升半
        CurrentFre = NewFreTab[SignTab[SL-1]+SH];   //查出對應(yīng)音符的頻率     
        if(SL!=0)
        {
            if (SM==1) CurrentFre >>= 2;        //低音
            if (SM==3) CurrentFre <<= 2;        //高音
            Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//計(jì)算計(jì)數(shù)器初值
            Sound_Temp_TH0 = Temp_T/256;
            Sound_Temp_TL0 = Temp_T%256;
            TH0 = Sound_Temp_TH0;  
            TL0 = Sound_Temp_TL0 + 12; //加12是對中斷延時(shí)的補(bǔ)償
        }
        SLen=LengthTab[Length%10];  //算出是幾分音符
        XG=Length/10%10;            //算出音符類型(0普通1連音2頓音)
        FD=Length/100;
        LDiv=LDiv0/SLen;            //算出連音音符演奏的長度(多少個(gè)10ms)
        if (FD==1)
            LDiv=LDiv+LDiv/2;
        if(XG!=1)
            if(XG==0)               //算出普通音符的演奏長度
                if (SLen<=4)   
                    LDiv1=LDiv-LDiv4;
                else
                    LDiv1=LDiv*SOUND_SPACE;
            else
                LDiv1=LDiv/2;       //算出頓音的演奏長度
        else
            LDiv1=LDiv;
        if(SL==0) LDiv1=0;
            LDiv2=LDiv-LDiv1;       //算出不發(fā)音的長度
      if (SL!=0)
        {
            TR0=1;
            for(i=LDiv1;i>0;i--)    //發(fā)規(guī)定長度的音
            {
                while(TF1==0);
                TH1 = Sound_Temp_TH1;
                TL1 = Sound_Temp_TL1;
                TF1=0;
            }
        }
        if(LDiv2!=0)
        {
            TR0=0; BeepIO=0;
            for(i=LDiv2;i>0;i--)    //音符間的間隔
            {
                while(TF1==0);
                TH1 = Sound_Temp_TH1;
                TL1 = Sound_Temp_TL1;
                TF1=0;
            }
        }
        Point+=2;
        Tone=p[Point];
        Length=p[Point+1];
//按鍵掃描
        if(k_state==0)
        {//掃描開始
            if(k_pause==0)
            {
                while(k_pause==0);
                flag_pause=~flag_pause;
                TR1   = flag_pause;
                return;
            }
            if(k_up==0)
            {
                while(k_up==0);
                flag_up=~flag_up;
                flag_order--;
                if(flag_order < 0)
                    flag_order = 2;//第三首
                 p=PP[flag_order];
                break;
            }
            if(k_down==0)
            {
                while(k_down==0);
                flag_down=~flag_down;
                flag_order++;
                if(flag_order > 2)
                    flag_order=0;//第一首
                 p=PP[flag_order];
                break;
            }
        }//按鍵掃描結(jié)束
    }
    BeepIO = 0;//播放結(jié)束,關(guān)閉
}


untitled.png (278.08 KB, 下載次數(shù): 53)

untitled.png

音樂r.zip

18.57 KB, 下載次數(shù): 10, 下載積分: 黑幣 -5






歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 精品亚洲一区二区三区 | 欧美日韩一区二区三区在线观看 | 亚洲国产精品久久人人爱 | 中文字幕在线中文 | 欧美一级黄色片免费观看 | 99日韩| 日韩在线播放一区 | 日韩成人 | 日本一道本视频 | 亚洲免费在线视频 | 日韩一区二区福利视频 | 成人网视频 | 欧美日韩中文字幕在线播放 | 久久精品亚洲精品国产欧美 | 91秦先生艺校小琴 | 欧美日本在线 | 嫩草伊人 | 亚洲91精品 | 国产午夜精品一区二区三区嫩草 | 在线观看视频一区 | 91美女视频 | 久久久久1 | 91精品国产日韩91久久久久久 | 精品一区欧美 | av免费网址 | 在线播放第一页 | 精品国产一区一区二区三亚瑟 | h视频在线免费 | 日韩精品一区在线观看 | 一级片在线观看 | 日韩在线观看一区 | 日本久久福利 | 天天爽综合网 | 国产午夜精品一区二区三区四区 | 日韩欧美福利视频 | 欧美午夜一区 | 久久久日韩精品一区二区三区 | 岛国av免费看 | 亚洲区中文字幕 | 99久久婷婷国产综合精品电影 | 欧美日韩美女 |