新聞中心

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

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

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

        * 用I/O口生成 *
        * 功 能:用I/O口生成 *
        * 時鐘頻率:內部1M *
        * 設 計:tonghe *
        * 修改日期:2007年04月13日 *
        * 編譯環境:ICC-AVR6.31 *
        * 實驗環境:本站M16學習板 *
        * 發 聲:無源蜂鳴器 *
        * 結 果:試驗通過 *
        * 要 求:插上JP1、JP2、LED_EN短路塊 *
        *****************************************/
        #include iom16v.h>
        #include macros.h>
        #define uchar unsigned char
        #define uint unsigned int
        /****************************************
        * 定義音樂數據二維數組{x,y} *
        * x:對應音符音階(頻率),0表示休止符 *
        * y:對應音符節拍,0表示音樂結束 *
        * 此數據取自《ICC AVR應用實例》 *
        ****************************************/
        //以下音樂數據為《卡秋莎》,位于程序區
        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 //設置回到數據存儲器區
        /************************************
        * 延時函數: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:不發聲 *
        * 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,休止符,不發聲
        }
        }
        /*******************************
        * 主函數 *
        *******************************/
        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]);//節拍延時
        TCCR1A = 0x00; //奏完一個音符停止
        PORTB^=15; //音符節拍由LD5閃亮顯示
        PORTD|=15;
        i++; //準備一下個音符
        }
        delay_ms(1000);
        i=0; //一遍結束,停1秒,從頭開始
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 玛曲县| 镇巴县| 司法| 体育| 广南县| 囊谦县| 称多县| 梅河口市| 永城市| 星子县| 定南县| 白河县| 鹤山市| 吉水县| 微博| 来凤县| 睢宁县| 宁陕县| 奉化市| 芒康县| 五原县| 嘉鱼县| 峨山| 枣强县| 建瓯市| 喜德县| 大同市| 南京市| 西林县| 开江县| 镇巴县| 麻江县| 大荔县| 平塘县| 佛坪县| 鄱阳县| 交口县| 曲水县| 屯昌县| 青阳县| 盖州市|