1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      單片機IO口播放樂曲

      更新時間: 2006-03-09 14:40:42來源: 粵嵌教育瀏覽量:2376

      //標 題: 單片機IO口播放樂曲 //
      //--------------------------------------------------------------------------//
      // 源程序大公開 //
      // (c) Copyright 2001-2002 xuwenjun //
      // All Rights Reserved //
      // V1.00 //
      //--------------------------------------------------------------------------//
      //標 題: 單片機IO口播放樂曲 //
      //版 本: V1.00 //
      //文件名: xwj_lcd16.C //
      //創(chuàng)建人: 徐文軍 E-mail:xuwenjun@21cn.com //
      //日 期: 02-11-5 //
      //描 述: 單片機利用T1中斷在IO口P1.0輸出樂曲 //
      //聲 明: //
      // 以下代碼僅免費提供給學(xué)習(xí)用途,但引用或修改后必須在文件中聲明出處. //
      // 如用于商業(yè)用途請與作者聯(lián)系. E-mail:xuwenjun@21cn.com //
      // 有問題請mailto xuwenjun@21cn.com 歡迎與我交流! //
      //--------------------------------------------------------------------------//
      //修改人: 徐文軍 E-mail:xuwenjun@21cn.com //
      //日 期: 02-11-5 //
      //說 明: //
      // 單片機用T1中斷在IO口P1.0輸出樂曲(在P1.0口與VCC間接一喇叭即可聽到) //
      // 1.由于輸出的是方波,比較難聽:-)你也可以將波形細分用DA輸出正弦波 //
      // 2.由于T1頻繁中斷,任何其他中斷發(fā)生都會是樂曲打頓,只適合試驗 //
      // 3.優(yōu)化音符編碼:一個字節(jié)中包含節(jié)拍、音符、升降調(diào),可區(qū)分數(shù)據(jù)和命令//
      // 同時人工將音符譯為機器碼非常容易。(格式看下面實例)//
      //--------------------------------------------------------------------------//
      #include
      #include
      #define FREQ 11059200
      #define freq_chn(f) 255-f/24/147/256,256-f/24/147%256

      // 音樂_編碼2 -- 存儲器定義 //
      unsigned char code music_tab1[]={ //音符碼格式:| D7 |D6 D5 D4| D3 |D2 D1 D0|
      //梁祝 |變調(diào)| 節(jié)拍|升降| 音符 |
      0xcb, //示例:0xcb=11001011B,即升調(diào),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時是功能碼|根據(jù)低4位散轉(zhuǎn) |
      0x00, //字節(jié)為功能碼必須==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};//節(jié)拍延時單位
      unsigned char code music_freq_tab[64]={ //音符定時器值表
      0xff,0xea, //0 休止符
      freq_chn(131), //freq_chn(x/256 //1 do 高字節(jié) //freq_chn(x%256 //1 do 低字節(jié)
      freq_chn(147), //2 re
      freq_chn(165), //3 mi
      freq_chn(175), //4 fa
      freq_chn(196), //5 suo
      freq_chn(221), //6 la
      freq_chn(248), //7 xi

      0xff,0xea, //0 休止符
      freq_chn(262), //1 do
      freq_chn(294), //2 re
      freq_chn(330), //3 mi
      freq_chn(350), //4 fa
      freq_chn(393), //5 suo
      freq_chn(441), //6 la
      freq_chn(495), //7 xi

      0xff,0xea, //0 休止符
      freq_chn(525), //1 do
      freq_chn(589), //2 re
      freq_chn(661), //3 mi
      freq_chn(700), //4 fa
      freq_chn(786), //5 suo
      freq_chn(882), //6 la
      freq_chn(990), //7 xi

      0xff,0xea, //0 休止符
      freq_chn(1049), //1 do
      freq_chn(1178), //2 re
      freq_chn(1322), //3 mi
      freq_chn(1400), //4 fa
      freq_chn(1572), //5 suo
      freq_chn(1665), //6 la
      freq_chn(1869), //7 xi

      };

      unsigned char code music_frequp_tab[64]={ //升半音
      0xff,0xea, //0 休止符
      freq_chn(139), //1 do 高字節(jié)
      freq_chn(156), //2 re
      freq_chn(175), //3 mi
      freq_chn(185), //4 fa
      freq_chn(208), //5 suo
      freq_chn(234), //6 la
      freq_chn(262), //7 xi

      0xff,0xea, //0 休止符
      freq_chn(278), //1 do
      freq_chn(312), //2 re
      freq_chn(350), //3 mi
      freq_chn(371), //4 fa
      freq_chn(416), //5 suo
      freq_chn(467), //6 la
      freq_chn(525), //7 xi

      0xff,0xea, //0 休止符
      freq_chn(556), //1 do
      freq_chn(624), //2 re
      freq_chn(700), //3 mi
      freq_chn(742), //4 fa
      freq_chn(833), //5 suo
      freq_chn(935), //6 la
      freq_chn(1049), //7 xi

      0xff,0xea, //0 休止符
      freq_chn(1112), //1 do
      freq_chn(1248), //2 re
      freq_chn(1400), //3 mi
      freq_chn(1484), //4 fa
      freq_chn(1618), //5 suo
      freq_chn(1764), //6 la
      freq_chn(1968), //7 xi
      };
      unsigned char temp_TH1;
      unsigned char temp_TL1;

      // 音樂_編碼2 -- IO定義 //
      sbit PIN_MSC=P1^0; // 音樂輸出端口 //

      // 音樂_編碼2 -- 函數(shù)原型//
      void music_delay(unsigned char x); //音樂節(jié)拍延時
      void music_play(unsigned char *msc); //播放音樂子程序

      // 音樂_編碼2 -- 函數(shù) //
      //---------------------------------------------------------------------------//
      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; //節(jié)拍
      unsigned char music_data=0; //音符數(shù)據(jù)
      bit music_up=0; //升半音
      bit music_break=0; //斷奏
      temp_TH1=0xff;
      temp_TL1=0xea; //關(guān)輸出(輸出超聲波)
      TMOD=0x11; //T0:16位定時器、T1:16位定時器
      // ET0=0; //關(guān)T0定時器中斷
      ET1=1; //開T1定時器中斷
      //---------------------------------------------------------
      while (*msc != 0x00)
      {
      music_data=*msc & 0x07;
      music_long=*msc>>4;
      //---------------------------------------------------------
      if (music_long != 0) //是音符
      {
      if (*msc >=128) //需升降調(diào)
      {
      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; //播放結(jié)束,關(guān)T1中斷
      PIN_MSC=1; //關(guān)輸出
      // temp_TH1=0xff;
      // temp_TL1=0xea; //關(guān)輸出(輸出超聲波)
      // ET0=1; //開T0定時器中斷
      // TMOD=0x51; //T0:16位定時器、T1:16位計數(shù)器
      }

      //---------------------------------------------------------------------------//
      void main(void) //示例
      {
      // 設(shè)置定時器--------------------------------------
      TMOD = 0x11; // TMOD: 定時器1:模式1:16位;定時器2:模式1:16位 //
      // TCON = 0x50; // TCON: 定時器 1運行; 定時器 2運行 //
      // 設(shè)置并開啟中斷:
      IP = 0x08; //中斷優(yōu)先寄存器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 (;;) {
      //在此調(diào)用鍵盤和顯示函數(shù)//
      music_play(music_tab1);
      music_play(music_tab2);
      music_play(music_tab3);
      music_play(music_tab4);
      }
      }
      //---------------------------------------------------------------------------//

      免費預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲国产空姐精品视频中文字幕 | 亚洲AV成人一区二区三区不卡 | 亚洲欧美国产国产第二页 | 最新精品国偷自产在线婷婷 | 综合色本一道在线 | 亚洲精品乱码在线 |