1 現象
利用蜂鳴器實現音樂播放功能,播放《天空之城》。
2 原理
(1)天空之城的樂譜
3 參考程序
3.1 主程序
#include #include 'delayms.h' #include 'timer0.h' //蜂鳴器端口定義 sbit buzzer = P2^5; //播放速度,值為四分音符的時長 #define SPEED 500 //音符與索引對應表,P:休止符,L:低音,M:中音,H:高音,下劃線:升半音符號# #define P 0 #define L1 1 #define L1_ 2 #define L2 3 #define L2_ 4 #define L3 5 #define L4 6 #define L4_ 7 #define L5 8 #define L5_ 9 #define L6 10 #define L6_ 11 #define L7 12 #define M1 13 #define M1_ 14 #define M2 15 #define M2_ 16 #define M3 17 #define M4 18 #define M4_ 19 #define M5 20 #define M5_ 21 #define M6 22 #define M6_ 23 #define M7 24 #define H1 25 #define H1_ 26 #define H2 27 #define H2_ 28 #define H3 29 #define H4 30 #define H4_ 31 #define H5 32 #define H5_ 33 #define H6 34 #define H6_ 35 #define H7 36 //索引與頻率對照表 unsigned int FreqTable[]={ 0, 63472,63584,63697,63797,63897,63987,64074,64156,64233,64307,64376,64441, 64502,64560,64615,64667,64715,64761,64805,64846,64885,64921,64956,64989, 65020,65048,65076,65102,65126,65149,65171,65191,65210,65229,65246,65262 }; //樂譜,天空之城,頻率,音長 unsigned char code Music[]={ //第1行 P, 4, P, 4, P, 4, M6, 2, M7, 2, H1, 4+2,M7, 2, H1, 4, H3, 4, M7, 4+4+4, M3, 2, M3, 2, //第2行 M6, 4+2,M5, 2, M6, 4, H1, 4, M5, 4+4+4, M3, 4, M4, 4+2,M3, 2, M4, 4, H1, 4, //第3行 M3, 4+2,P, 2, H1, 2, H1, 2, H1, 2, M7, 4+2,M4_,2, M4_,4, M7, 4, M7, 4+4,P, 4, M6, 2, M7, 2, //第4行 H1, 4+2,M7, 2, H1, 4, H3, 4, M7, 4+4+4, M3, 2, M3, 2, M6, 4+2, M5, 2, M6, 4, H1, 4, //第5行 M5, 4+4+4, M2, 2, M3, 2, M4, 4, H1, 2, M7, 2+2, H1, 2+4, H2, 2, H2, 2, H3, 2, H1, 2+4+4, //第6行 H1, 2, M7, 2, M6, 2, M6, 2, M7, 4, M5_,4, M6, 4+4+4, H1, 2, H2, 2, H3, 4+2,H2, 2, H3, 4, H5, 4, //第7行 H2, 4+4+4, M5, 2, M5, 2, H1, 4+2, M7, 2, H1, 4, H3, 4, H3, 4+4+4+4, //第8行 M6, 2, M7, 2, H1, 4, M7, 4, H2, 2, H2, 2, H1, 4+2,M5, 2+4+4, H4, 4, H3, 4, H2, 4, H1, 4, //第9行 H3, 4+4+4, H3, 4, H6, 4+4, H5, 4, H5, 4, H3, 2, H2, 2, H1, 4+4, P, 2, H1, 2, //第10行 H2, 4, H1, 2, H2, 2, H2, 4, H5, 4, H3, 4+4+4, H3, 4, H6, 4+4, H5, 4+4, //第11行 H3, 2, H2, 2, H1, 4+4, P, 2, H1, 2, H2, 4, H1, 2, H2, 2+4, M7, 4, M6, 4+4+4, M6, 2, M7, 2, 0xFF //終止符號 }; unsigned char FreqSelect,MusicSelect; void main() { timer0_init(); while(1) { if(Music[MusicSelect]!=0xFF) //如果不是停止標志位 { FreqSelect = Music[MusicSelect]; //選擇音符對應的頻率 MusicSelect++; delayms(SPEED/4*Music[MusicSelect]); //選擇音符對應的時值 MusicSelect++; TR0 = 0; delayms(5); //音符間短暫停頓 TR0 = 1; } else //如果是停止標志位,停止播放 { TR0 = 0; while(1); } } } void timer0_routine() interrupt 1 { if(FreqTable[FreqSelect]) //如果不是休止符 { /*取對應頻率值的重裝載值到定時器*/ TL0 = FreqTable[FreqSelect]%256; //設置定時初值 TH0 = FreqTable[FreqSelect]/256; //設置定時初值 buzzer=!buzzer; //翻轉蜂鳴器IO口 } } 3.2 延時函數 #ifndef _delayms_h_ #define _delayms_h_ delayms(unsigned int xms); #endif #include void delayms(unsigned int xms) //@11.0592MHz { unsigned char i, j; while(xms--) { _nop_(); i = 2; j = 199; do { while (--j); } while (--i); } } 3.3 定時器函數 #ifndef _timer0_h_ #define _timer0_h_ void timer0_init(void); #endif #include /** * @brief 定時器0初始化,1毫秒@11.0592MHz * @param 無 * @retval 無 */ void timer0_init(void) //1毫秒@11.0592MHz { TMOD &= 0xF0; //設置定時器模式,1111_0000,&,高四位保留,低四位清零 TMOD |= 0x01; //設置定時器模式,0000_0001,|,高四位保留,設置模式為T0 TL0 = 0x66; //設置定時初始值,1ms,@11.0592MHz TH0 = 0xFC; //設置定時初始值,1ms,@11.0592MHz TF0 = 0; //清除TF0標志 TR0 = 1; //定時器0開始計時 ET0=1; //打開定時器T0中斷開關 EA=1; //打開中斷系統總開關 PT0=0; //設置T0中斷優先級,低 }
上一篇:AT24C02數據存儲+普中51單片機+江科大自化協
下一篇:蜂鳴器播放DOREMI+普中51單片機+江科大自化協
推薦閱讀最新更新時間:2025-06-07 23:39




設計資源 培訓 開發板 精華推薦
- 意法半導體緊湊型可配置車規負載驅動器具備安全引腳
- 美光宣布在美投資增至 2000 億美元,加建晶圓廠和 HBM 封裝設施
- AMD舉辦Advancing AI 2025大會:Instinct MI350系列GPU發布,35倍推理性能提升
- 特斯拉起訴前Optimus機器人工程師,指控其竊取商業機密
- Nordic Semiconductor將在MWC上海2025上展示前沿蜂窩物聯網解決方案
- SiC 市場的下一個爆點:共源共柵(cascode)結構詳解
- 香港科技大學工學院推出擬人化自動駕駛系統
- 現代摩比斯推出新型安全技術 防止追尾碰撞
- 研究人員開發新型機器人系統 利用AI賦能機器人技術
- 研究人員開發具有突破性觸覺靈敏度的機械手 可實現類人靈巧操作