C51单片机播放音乐《起风了》
生活随笔
收集整理的這篇文章主要介紹了
C51单片机播放音乐《起风了》
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
單片機控制蜂鳴器發(fā)聲的基本原理和方法:只需對驅(qū)動口輸出驅(qū)動電平并通過放大電路放大驅(qū)動電流就能使蜂鳴器發(fā)出聲音。改變引腳的頻率,就可以調(diào)整蜂鳴器的音調(diào),產(chǎn)生各種不同的聲音。
同時改變輸出電平的高低電平占空比,則可以控制蜂鳴器的聲音大小
下面給出代碼
main.c
(這里注意要把數(shù)組類型從char改為int要不然字符數(shù)組存不下,音樂不會完整播放),更改SPEED可改變曲子的播放速度。
#include <REGX52.H>#include "Delay.h" #include "Timer0.h"//蜂鳴器端口定義 sbit Buzzer=P2^5;//播放速度,值為四分音符的時長(ms) #define SPEED 700//音符與索引對應(yīng)表,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,63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283, };//樂譜 unsigned int code Music[]={//音符,時值,//1M2,3,M1,1,M2,3,M1,1,M2,2,M3,2,M5,2,M3,2,M2,3,M1,1,M2,3,M1,1,M2,1,M3,1,M2,1,M1,1,L5,2,P,2,M2,3,M1,1,M2,3,M1,1,M2,2,M3,2,M5,2,M3,2,M2,3,M3,1,M2,2,M1,1,M2,5,P,4,M2,3,M1,1,M2,3,M1,1,M2,2,M3,2,M5,2,M3,2,M2,3,M3,1,M2,2,M1,1,L6,3,P,2,M3,1,M2,1,M1,1,M2,1,M1,2,P,2,M3,1,M2,1,M1,1,M2,1,M1,2,P,2,M3,1,M2,1,M1,1,M2,1,M1,4,P,6,M1,2,M2,2,M3,2,M1,2,M6,2,M5,1,M6,3,P,1,M1,1,M7,2,M6,1,M7,3,P,2,M7,2,M6,1,M7,3,M3,2,H1,1,H2,1,H1,1,M7,1,M6,2,M5,2,M6,2,M5,1,M6,2,M5,1,M6,1,M5,1,M6,2,M5,1,M2,2,M5,1,M5,1,M3,5,P,4,M1,2,M2,2,M3,2,M1,2,M6,2,M5,1,M6,3,P,1,M1,1,M7,2,M6,1,M7,3,P,2,M7,2,M6,1,M7,3,M3,2,H1,1,H2,1,H1,1,M7,1,M6,2,M5,2,M6,2,H3,4,M5,2,M6,2,H3,3,M5,1,M5,1,M6,11,P,2,H1,2,H2,2,H3,2,H6,1,H5,3,H6,1,H5,3,H6,1,H5,3,H2,1,H3,3,H6,1,H5,3,H6,1,H5,3,H6,1,H5,2,H3,1,H3,3,H2,2,H1,1,M6,2,H1,3,H2,2,H1,1,M6,2,H1,2,H3,6,H2,1,H3,1,H2,2,P,2,H1,2,H2,2,H3,2,H6,1,H5,3,H6,1,H5,3,H6,1,H5,2,P,1,H2,1,H3,2,H6,1,H5,3,H6,1,H5,3,H6,1,H5,2,H3,2,H3,1,H2,2,H1,1,M6,2,H3,2,H2,2,H1,1,M6,3,H1,2,H1,8,M6,1,H3,3,H2,2,H1,1,M6,1,M6,1,H3,2,H2,2,H1,1,M6,3,H1,7,H1,8,P,8,0xFF//終止標志 };unsigned int FreqSelect,MusicSelect;void main() {Timer0Init();while(1){if(Music[MusicSelect]!=0xFF) //如果不是停止標志位{FreqSelect=Music[MusicSelect]; //選擇音符對應(yīng)的頻率MusicSelect++;Delay(SPEED/4*Music[MusicSelect]); //選擇音符對應(yīng)的時值MusicSelect++;TR0=0;Delay(5); //音符間短暫停頓TR0=1;}else //如果是停止標志位{TR0=0;while(1);}} }void Timer0_Routine() interrupt 1 {if(FreqTable[FreqSelect]) //如果不是休止符{/*取對應(yīng)頻率值的重裝載值到定時器*/TL0 = FreqTable[FreqSelect]%256; //設(shè)置定時初值TH0 = FreqTable[FreqSelect]/256; //設(shè)置定時初值Buzzer=!Buzzer; //翻轉(zhuǎn)蜂鳴器IO口} }Timer0.c
#include <REGX52.H>/*** @brief 定時器0初始化* @param無* @retval 無 */ void Timer0Init()//1毫秒@11.0592MHz {TMOD &= 0xF0; //設(shè)置定時器模式TMOD |= 0x01; //設(shè)置定時器模式TL0 = 0x66; //設(shè)置定時初始值TH0 = 0xFC; //設(shè)置定時初始值TF0 = 0; //清除TF0標志TR0 = 1; //定時器0開始計時ET0=1; //打開定時器0中斷EA=1; //開總中斷PT0=0; }/*定時器終端模板函數(shù) void Timer0_Routine() interrupt 1 {static unsigned int T0Count;TL0 = 0x66; //設(shè)置定時初始值TH0 = 0xFC; //設(shè)置定時初始值T0Count++;if(T0Count>=1000){T0Count=0;P2_0=~P2_0;} } */Timer0.h
#ifndef __TIMER0_H__//防重復(fù)定義 #define __TIMER0_H__void Timer0Init();#endifDelay.c
#include <REGX52.H> void Delay(unsigned int xms) {unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);} }Delay.h
#ifndef __DELAY_H__ #define __DELAY_H__void Delay(unsigned int xms);#endif總結(jié)
以上是生活随笔為你收集整理的C51单片机播放音乐《起风了》的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【操作系统】设备管理
- 下一篇: 常用字符串函数的使用