STC-B学习板蜂鸣器播放音乐
生活随笔
收集整理的這篇文章主要介紹了
STC-B学习板蜂鸣器播放音乐
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
功能:單片機燒錄好程序后,按key1按鍵播放《IF YOU》,再次按key1可暫停播放,按key2可切換歌曲到《國際歌》,再按key3可切換歌曲到《孤勇者》
芯片:STC15F2K61S2
完整工程文件和hex文件在這
提取碼:1111
前言:相信大家焊好板子后最喜歡玩的就是蜂鳴器播放音樂,路過每個教室基本都是各種雜音,畢竟這玩意真挺好玩的,于是我就根據老師的代碼和譜子寫了播放其他歌曲的文件(國際歌是我直接拿往屆學長的音樂代碼,來湊個數的),說實話這玩意看起來挺簡單的,實際上挺難的,還得學一遍樂理知識,然后對著各種拍子和音調不斷調試才能得到一個比較理想的狀態,但是if you和孤勇者這兩首曲子總感覺有些地方不是很完美,但對于擺爛人來說能聽就行了。反正也是娛樂娛樂
廢話不多說,代碼如下:(譜子在最后)
/********************** 文件名稱:beep.c 說明:進行音樂播放的例程,按下key1鍵后開始播放音樂 修改記錄: ***********************//********************** 基于STC15F2K60S2系列單片機C語言編程實現 使用如下頭文件,不用另外再包含"REG51.H" ***********************/ #include <STC15F2K60S2.h> #define uint unsigned int #define uchar unsigned char sbit beep=P3^4; //蜂鳴器 sbit key1=P3^2; //按鍵1 sbit key2=P3^3; //按鍵2 uchar timeh,timel,jindu=0,gequ=0; //定義定時器的重裝值 bit flag; //播放標志位 uchar code music1[] = //音樂代碼,歌曲為《IF YOU》,格式為: 音符, 節拍, 音符, 節拍, {0x26,0x10,0x25,0x10,0x23,0x10,0x21,0x10,0x22,0x10,0x23,0x10,0x16,0x20,0x22,0x08,0x21,0x08,0x22,0x08,0x21,0x08,0x22,0x08,0x21,0x08,0x22,0x10,0x21,0x08,0x22,0x08,0x22,0x08,0x21,0x08,0x23,0x20,0x26,0x10,0x25,0x10,0x23,0x10,0x21,0x10,0x22,0x10,0x23,0x10,0x16,0x20,0x16,0x08,0x17,0x10,0x21,0x08,0x21,0x08,0x16,0x08,0x21,0x08,0x16,0x08,0x21,0x08,0x22,0x08,0x23,0x08,0x22,0x08,0x22,0x10,0x21,0x08,0x21,0x08,0x21,0x10,0x15,0x08,0x21,0x20,0x31,0x10,0x31,0x08,0x31,0x08,0x27,0x08,0x26,0x08,0x21,0x10,0x32,0x10,0x33,0x10,0x36,0x10,0x35,0x10,0x33,0x10,0x32,0x10,0x31,0x10,0x32,0x30,0x32,0x08,0x31,0x08,0x32,0x08,0x23,0x08,0x32,0x10,0x25,0x24,0x25,0x08,0x32,0x08,0x31,0x08,0x32,0x08,0x33,0x24,0x31,0x08,0x31,0x10,0x32,0x10,0x33,0x10,0x36,0x10,0x35,0x10,0x33,0x10,0x32,0x10,0x31,0x08,0x31,0x08,0x32,0x10,0x31,0x30,0x26,0x08,0x26,0x08,0x31,0x08,0x26,0x08,0x31,0x08,0x31,0x24,0x31,0x08,0x31,0x08,0x32,0x08,0x31,0x08,0x31,0x08,0x31,0x24,0x00,0x10,}; uchar code music2[] = //歌曲為國際歌 {0x25, 0x10, 0x31, 0x18, 0x27, 0x08, 0x32, 0x08, 0x31, 0x08, 0x25, 0x08, 0x23, 0x08, 0x26, 0x18, 0x26, 0x08, 0x24, 0x10, 0x20, 0x08,0x26, 0x08, 0x32, 0x18, 0x31, 0x08, 0x27, 0x08, 0x26, 0x08, 0x25, 0x08, 0x24, 0x08, 0x23, 0x30,0x25, 0x10, 0x31, 0x18, 0x27, 0x08, 0x32, 0x08, 0x31, 0x08, 0x25, 0x08, 0x23, 0x08, 0x26, 0x20, 0x24, 0x08,0x26, 0x08, 0x32, 0x08, 0x31, 0x08, 0x27, 0x10, 0x32, 0x10, 0x34, 0x10, 0x27, 0x10, 0x31, 0x20, 0x31, 0x08, 0x30, 0x08,0x33, 0x08, 0x32, 0x08, 0x27, 0x20, 0x26, 0x08, 0x27, 0x08, 0x31, 0x08, 0x26, 0x08, 0x27, 0x20, 0x25, 0x08,0x25, 0x08, 0x24, 0x08, 0x25, 0x08, 0x26, 0x18, 0x26, 0x08, 0x32, 0x18, 0x31, 0x08, 0x27, 0x20, 0x27, 0x08, 0x20, 0x08,0x32, 0x10, 0x32, 0x18, 0x27, 0x08, 0x25, 0x08, 0x25, 0x08, 0x24, 0x08, 0x25, 0x08, 0x33, 0x20, 0x31, 0x08,0x26, 0x08, 0x27, 0x08, 0x31, 0x08, 0x27, 0x10, 0x32, 0x10, 0x31, 0x10, 0x26, 0x10, 0x25, 0x20, 0x25, 0x08, 0x20, 0x08,0x33, 0x08, 0x32, 0x08, 0x31, 0x20, 0x25, 0x18, 0x23, 0x08, 0x26, 0x20, 0x24, 0x08, 0x20, 0x08,0x32, 0x0c, 0x31, 0x04, 0x27, 0x20, 0x26, 0x10, 0x25, 0x10, 0x25, 0x20, 0x25, 0x08, 0x20, 0x08,0x25, 0x10, 0x33, 0x20, 0x32, 0x10, 0x25, 0x10, 0x31, 0x20, 0x27, 0x18,0x27, 0x08, 0x26, 0x18, 0x25, 0x08, 0x26, 0x10, 0x32, 0x10, 0x32, 0x20, 0x32, 0x08, 0x30, 0x08,0x33, 0x0c, 0x32, 0x04, 0x31, 0x20, 0x25, 0x18, 0x23, 0x08, 0x26, 0x20, 0x24, 0x08, 0x20, 0x08,0x32, 0x0c, 0x31, 0x04, 0x27, 0x20, 0x26, 0x10, 0x25, 0x10, 0x33, 0x30,0x33, 0x10, 0x35, 0x20, 0x34, 0x10, 0x33, 0x10, 0x32, 0x18, 0x33, 0x08, 0x34, 0x10, 0x30, 0x08,0x34, 0x08, 0x33, 0x18, 0x33, 0x08, 0x32, 0x18, 0x32, 0x08, 0x31, 0x30,0x00, 0x00 }; uchar code music3[] = //歌曲為孤勇者 {0x16,0x08,0x17,0x08,0x21,0x08,0x22,0x08,0x17,0x08,0x21,0x08,0x21,0x10,0x21,0x08,0x17,0x08,0x21,0x08,0x22,0x08,0x17,0x08,0x21,0x08,0x21,0x10,0x21,0x08,0x22,0x08,0x23,0x08,0x22,0x08,0x23,0x08,0x22,0x08,0x23,0x10,0x23,0x08,0x22,0x08,0x23,0x10,0x25,0x10,0x23,0x10,0x16,0x08,0x17,0x08,0x21,0x08,0x22,0x08,0x17,0x08,0x21,0x08,0x21,0x10,0x21,0x08,0x17,0x08,0x21,0x08,0x22,0x08,0x17,0x08,0x21,0x08,0x21,0x10,0x21,0x08,0x22,0x08,0x23,0x08,0x22,0x08,0x23,0x08,0x22,0x08,0x23,0x10,0x23,0x08,0x22,0x08,0x23,0x10,0x25,0x10,0x23,0x10,0x25,0x10,0x23,0x14,0x25,0x08,0x23,0x14,0x25,0x08,0x23,0x08,0x25,0x08,0x26,0x08,0x23,0x08,0x25,0x10,0x25,0x08,0x23,0x14,0x25,0x08,0x23,0x14,0x25,0x08,0x23,0x08,0x25,0x08,0x26,0x08,0x23,0x08,0x25,0x10,0x25,0x08,0x25,0x08,0x23,0x08,0x22,0x08,0x22,0x10,0x22,0x10,0x21,0x08,0x23,0x08,0x23,0x08,0x22,0x08,0x22,0x10,0x22,0x10,0x21,0x08,0x21,0x08,0x16,0x20,0x25,0x08,0x25,0x08,0x23,0x08,0x22,0x08,0x22,0x10,0x22,0x10,0x21,0x08,0x23,0x08,0x23,0x08,0x22,0x08,0x22,0x10,0x22,0x10,0x21,0x08,0x21,0x08,0x16,0x20,0x00 }; uchar code quzi[] = //此數組數據為各個音符在定時器中的重裝值,第一列是高位,第二列是低位 //時間 {0xf8,0x8c, //低八度,低10xf9,0x5b,0xfa,0x15, //低30xfa,0x67,0xfb,0x04, //低50xfb,0x90,0xfc,0x0c, //低70xfc,0x44, //中央C調0xfc,0xac, //中20xfd,0x09,0xfd,0x34, //中40xfd,0x82,0xfd,0xc8, //中60xfe,0x06,0xfe,0x22, //高八度,高10xfe,0x56,0xfe,0x6e, //高30xfe,0x9a,0xfe,0xc1, //高50xfe,0xe4,0xff,0x03 //高7 }; /********************** 函數名稱:void delay(unsigned int xms) 功能描述:延時 入口參數:xms:輸入需要延時的毫秒值 出口參數:無 備注:***********************/ void delay(unsigned int xms) {uint i,j;for(i=xms; i>0; i--)for(j=124; j>0; j--); } /********************** 函數名稱:uchar quyin(uchar tem) 功能描述:在quzi數組中,找到music數組定義的簡譜音符的重裝值,并返回其在quzi數組中的位置 入口參數:tem:music數組中定義的簡譜音符 出口參數:返回的是tem音符在quzi數組中的位置值 備注:***********************/ uchar quyin(uchar tem) {uchar qudiao,jp,weizhi; //定義曲調,音符和位置qudiao=tem/16; //高4位是曲調值jp=tem%16; //低4位是音符if(qudiao==1) //當曲調值為1時,即是低八度,低八度在quzi數組中基址為0qudiao=0;else if(qudiao==2) //當曲調值為2時,即是中八度,中八度在quzi數組中基址為14qudiao=14;else if(qudiao==3) //當曲調值為3時,即是高八度,高八度在quzi數組中,基址為28qudiao=28;weizhi=qudiao+(jp-1)*2; //通過基址加上音符作為偏移量,即可定位此音符在quzi數組中的位置return weizhi; //返回這一個位置值 } /********************** 函數名稱:void playmusic() 功能描述:播放音樂 入口參數:無 出口參數:無 備注:***********************/ void playmusic() {uchar p,m,tem; //m為節拍while(1){if(flag==1) //若播放的標志位為1則播放音樂{if(gequ==0) //歌曲選擇位為0,則播放同一首歌{p=music1[jindu];if(p==0x00) //如果碰到結束符,延時1秒,回到開始再來一遍{jindu=0;delay(1000);break;}else if(p==0xff) //若碰到休止符,延時100ms,繼續取下一音符{jindu=jindu+1;delay(100);TR0=0;break;}else //正常情況下取音符和節拍{tem=quyin(music1[jindu]); //取出當前音符在quzi數組中的位置值timeh=quzi[tem]; //把音符相應的計時器重裝載值賦予timeh和timeltimel=quzi[tem+1];jindu++;TH0=timeh; //把timeh和timel賦予計時器TL0=timel;m=music1[jindu]; //取得節拍jindu++;}TR0=1; //開定時器1delay(m*180); //等待節拍完成, 通過P3^4口輸出音頻TR0=0; //關定時器1beep=0; //使beep端口置0,起保護蜂鳴器作用}else if(gequ==1) //歌曲選擇位為1,則播放小毛驢{p=music2[jindu];if(p==0x00) //如果碰到結束符,延時1秒,回到開始再來一遍{jindu=0;delay(1000);break;}else if(p==0xff) //若碰到休止符,延時100ms,繼續取下一音符{jindu=jindu+1;delay(100);TR0=0;break;}else //正常情況下取音符和節拍{tem=quyin(music2[jindu]); //取出當前音符在quzi數組中的位置值timeh=quzi[tem]; //把音符相應的計時器重裝載值賦予timeh和timeltimel=quzi[tem+1];jindu++;TH0=timeh; //把timeh和timel賦予計時器TL0=timel;m=music2[jindu]; //取得節拍jindu++;}TR0=1; //開定時器1delay(m*300); //等待節拍完成, 通過P3^4口輸出音頻TR0=0; //關定時器1beep=0; //使beep端口置0,起保護蜂鳴器作用}else if(gequ==2) //歌曲選擇位為2,則播放天空之城{p=music3[jindu];if(p==0x00) //如果碰到結束符,延時1秒,回到開始再來一遍{jindu=0;delay(1000);break;}else if(p==0xff) //若碰到休止符,延時100ms,繼續取下一音符{jindu=jindu+1;delay(100);TR0=0;break;}else //正常情況下取音符和節拍{tem=quyin(music3[jindu]); //取出當前音符在quzi數組中的位置值timeh=quzi[tem]; //把音符相應的計時器重裝載值賦予timeh和timeltimel=quzi[tem+1];jindu++;TH0=timeh; //把timeh和timel賦予計時器TL0=timel;m=music3[jindu]; //取得節拍jindu++;}TR0=1; //開定時器1delay(m*200); //等待節拍完成, 通過P3^4口輸出音頻TR0=0; //關定時器1beep=0; //使beep端口置0,起保護蜂鳴器作用}}else //播放標志位不為1時,暫停播放音樂while(flag!=1);} } /********************** 函數名稱:void init_sys() 功能描述:系統初始化,功能是配置IO口 入口參數:無 出口參數:無 備注:***********************/ void init_sys() {P0M0=0xff; //設置推挽模式P0M1=0x00;P2M0=0x08;P2M1=0x00;P3M0=0x10;P3M1=0x00;P4M0=0x00;P4M1=0x00;P5M0=0x00;P5M1=0x00; } /********************** 函數名稱:void init() 功能描述:定時器和外部中斷的初始化 入口參數:無 出口參數:無 備注:***********************/ void init() {TMOD=0x01; //設置定時器0,定時方式1,16位手動重裝模式TH0=0xD8; //設置定時初值TL0=0xEF;IE=0x87; // 1000 0111 EA=1,EX0=1,ET0=1,EX1=0;IP=0x02; // 0000 0010 PT0=1; 定時器0優先級高TR0=0; //定時器0開始運行beep=0; //使beep端口置0,起保護蜂鳴器作用 } void main() {init_sys(); //系統初始化init();P0=0x00;key1=1; //兩個按鍵設為輸入狀態,檢測中斷key2=1;flag=0; //播放標志位清零while(1){playmusic(); //播放音樂函數} } /********************** 函數名稱:void tim1() interrupt 1 功能描述:定時器0中斷處理,重新裝值,并把beep值取反,產生方波 入口參數:無 出口參數:無 備注:***********************/ void tim1() interrupt 1 //計時器控制頻率 {TH0=timeh; //賦初值TL0=timel;beep=~beep; //中斷使得beep翻轉產生方波 } /********************** 函數名稱:void ex1() interrupt 0 功能描述:按下按鍵1的外部中斷,對標志位取反,功能是暫停和播放音樂 入口參數:無 出口參數:無 備注:***********************/ void ex1() interrupt 0 {delay(5);if(key1==0) //判斷key1是否按下{delay(5);if(key1==0){while(!key1);flag=~flag; //播放中斷位取反,播放或者暫停}} } /********************** 函數名稱:void ex2() interrupt 2 功能描述:按下按鍵2的外部中斷,作用為切換歌曲 入口參數:無 出口參數:無 備注:***********************/ void ex2() interrupt 2 {delay(5);if(key2==0) //按鍵key2按下,切換歌曲{jindu=0; //歌曲的進度清零,從頭開始演唱gequ++; //下一曲if(gequ==3) //到達最后一首調到第一首gequ=0;} }
總結
以上是生活随笔為你收集整理的STC-B学习板蜂鸣器播放音乐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java写的订房系统(对于加深基础很有帮
- 下一篇: imacros:运行javascript