<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 用M16單片機I/O口生成模擬音樂

          用M16單片機I/O口生成模擬音樂

          作者: 時間:2011-09-20 來源:網絡 收藏

          * 用I/O口生成 *
          * 功 能:用I/O口生成 *
          * 時鐘頻率:內部1M *
          * 設 計:tonghe *
          * 修改日期:2007年04月13日 *
          * 編譯環(huán)境:ICC-AVR6.31 *
          * 實驗環(huán)境:本站M16學習板 *
          * 發(fā) 聲:無源蜂鳴器 *
          * 結 果:試驗通過 *
          * 要 求:插上JP1、JP2、LED_EN短路塊 *
          *****************************************/
          #include iom16v.h>
          #include macros.h>
          #define uchar unsigned char
          #define uint unsigned int
          /****************************************
          * 定義音樂數據二維數組{x,y} *
          * x:對應音符音階(頻率),0表示休止符 *
          * y:對應音符節(jié)拍,0表示音樂結束 *
          * 此數據取自《ICC AVR應用實例》 *
          ****************************************/
          //以下音樂數據為《卡秋莎》,位于程序區(qū)
          flash uint music_data[][2]=
          {
          {440,600},{494,200},{523,600},{443,200},{523,400},{494,200},
          {440,200},{494,400},{330,400},{494,600},{523,200},{578,600},
          {494,200},{578,400},{523,200},{494,200},{440,800},{659,400},
          {880,400},{784,400},{880,200},{784,200},{698,400},{659,200},
          {578,200},{659,400},{440,400},{ 0,200},{698,400},{578,200},
          {659,600},{523,200},{494,200},{330,200},{523,200},{494,200},
          {440,800},{659,400},{880,400},{784,400},{880,200},{784,200},
          {698,400},{659,200},{578,200},{659,400},{440,400},{ 0,200},
          {698,400},{578,200},{659,600},{523,200},{494,200},{330,200},
          {523,200},{494,200},{440,800},{ 0, 0}
          };

          #pragma data:data //設置回到數據存儲器區(qū)
          /************************************
          * 延時函數:1M時鐘時為MS *
          ************************************/
          void delay_ms(uint i)
          {
          uchar a;
          for(;i;i--)
          {
          for (a = 220; a; a--)
          {
          ;
          }
          }
          }
          /************************************
          * 端口初始化函數 *
          ************************************/
          void port_init(void)
          {
          DDRD=0xff; //D口配置為輸出,驅動蜂鳴器
          DDRB=0xff; //B口配置為輸出,驅動LED
          PORTB=0xff; //LED初值為滅
          }
          /***********************************
          * 音樂產生函數 *
          * 功能:輸出頻率為x的方波,延時y MS*
          * 范圍:x:100-20000Hz,0:不發(fā)聲 *
          * y:0-65536 MS *
          ***********************************/
          void sound(uchar i)
          {
          uint x;
          x=music_data[i][0]; //取音樂的頻率數據
          if(x!=0)
          {
          x=500000/x; //1M時鐘數據計算
          OCR1A=x; //比較值賦值
          TCCR1A = 0x40; //允許比較反轉輸出
          }
          else
          {
          TCCR1A = 0x00; //頻率為0,休止符,不發(fā)聲
          }
          }
          /*******************************
          * 主函數 *
          *******************************/
          void main(void)
          {
          uchar i=0;
          port_init(); //端口初始化
          TCCR1A = 0x40; //將T/C1配置為比較匹配,OC1A取反
          TCCR1B = 0x09;
          while(1)
          {
          while(music_data[i][1]!=0) //等待最后一個音符到來
          {
          sound(i); //輸出音符
          delay_ms(music_data[i][1]);//節(jié)拍延時
          TCCR1A = 0x00; //奏完一個音符停止
          PORTB^=15; //音符節(jié)拍由LD5閃亮顯示
          PORTD|=15;
          i++; //準備一下個音符
          }
          delay_ms(1000);
          i=0; //一遍結束,停1秒,從頭開始
          }
          }



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();