windows.h 头文件里面有beep(1,2) 函数。参数1是频率,参数2是发声时间。利用这个函数可以实现蜂鸣器播音乐。
网上有些工具,可以将简谱转换为数组,搜索 “51单片机乐谱转换器” “51单片机蜂鸣器音乐简谱转换工具-输入简谱就能自动生成音乐程序的工具Music Encode”,可以搜到
对应频率值如图:(标准C大调的do是440hz)
下面是vc下的测试代码,可以放《生日快乐》
#include <windows.h> #include <stdio.h> //#pragma comment(lib, "Winmm.lib") const int song[]={6,5,6,8,9,10,7,6,5,3,5,9,8}; const int song1[]={2,3,5,6,5,3,2,1} ; const song2[]={10,9,8,5,9,3,5,9,5}; const int song3[]={8,9,10,12,13,10,9}; const int song4[]={9,8,9,10,12,10}; //标准音调频率 const unsigned int hzs[]={131,147,165,175,196,220,247,262,294,330,349,392,440,494,523,587,659,698,784,880,988,1047,1175,1319,1397,1568,1760,1976}; //频率控制数组 const char dots[]={8,28,10,12,12,13,28,28,12,28,10,28,8,12,12,12,10,28,28,8,28,5,5,5,5,5,5,8,'#'}; void delay(unsigned int u) //延时 { while(u--); } void play_hz(unsigned int u) { unsigned int i=u; while(i--) { //delay(18432/u-24); } } void play_sound(int i) { if(i<28) //play_hz(hzs[i-1]); // Beep(hzs[i-1],hzs[i-1]*(18432/hzs[i-1]-24)); Beep(hzs[i-1],hzs[i-1]*2); else delay(500); } void playNation(void)//播放国歌,这个没有音长表,好难听 { while(1) { int i=0; while(dots[i]!='#') { play_sound(dots[i++]); delay(20000); } } } //生日歌 const unsigned FREQUENCY[]={392,392,440,392,523,494, 392,392,440,392,587,523, 392,392,784,659,523,494,440, 698,698,659,523,587,523, 392,392,440,392,523,494, 392,392,440,392,587,523, 392,392,784,659,523,494,440, 698,698,659,523,587,523}; const unsigned DELAY[]={375,125,500,500,500,1000, 375,125,500,500,500,1000, 375,125,500,500,500,500,1000, 375,125,500,500,500,1000, 375,125,500,500,500,1000, 375,125,500,500,500,1000, 375,125,500,500,500,500,1000, 375,125,500,500,500,1000}; //播放生日歌 void playHappybirth(void) { int CIRCLE; for(CIRCLE=0;CIRCLE<50;CIRCLE++) { Beep(FREQUENCY[CIRCLE],DELAY[CIRCLE]); } } #define uchar unsigned char #define uint unsigned int uchar ttt[]={8,12,8,12,8,12,8,100}; uchar fff[]={69,61,53,45}; void playMideaSound(void)//播放美的声音 { //1000000/(4*(x+1)*2) int i; int fre,tm1,tm2; for(i=0;i<sizeof(fff);i++) { fre=(int)(125000/(fff[i]+1)); tm1=(int)(ttt[i*2]*10); //本来是一个正常音,一个拖音,电脑模拟不了拖音 tm2=(int)(ttt[i*2+1]*10); Beep(fre,tm1+tm2); //Beep(fre,tm2); //Sleep(tm2); } //Beep } #include<iostream.h> #include<windows.h> //基础音符 enum fy{ d1 = 262, d1_ = 277, d2 = 294, d2_ = 311, d3 = 330, d4 = 349, d5 = 392, d5_= 415, d6 = 440, d6_= 466, d7 = 494, z1 = 523, z1_ = 554, z2 = 578, z2_ = 622, z3 = 659, z4 = 698, z4_ = 740, z5 = 784, z5_ = 831, z6 = 880, z6_ = 932, z7 = 988, g1 = 1046, g1_ = 1109, g2 = 1175, g2_ = 1245, g3 = 1318, g4 = 1397, g4_ = 1480, g5 = 1568, g5_ = 1661, g6 = 1760, g6_ = 1865, g7 = 1976, yaya = 0 }; struct yf { enum fy s; //音调 int t; //音长 }; const struct yf a[1000]={{z3,125},{z3,50},{z4,100},{z3,50},{z2,50}, //5 {z2,125},{z2,50},{z5,100},{z2,50},{z1,50}, //10 {z1,125},{z1,50},{z6,100},{z5,100}, //14 {z3,125},{z4,25},{z3,25},{z2,100},{z2,100}, //19 {z3,125},{z3,50},{z4,100},{z5,50},{z3,50}, //24 {z5,125},{z5,50},{g2,100},{z7,50},{g1,50}, //29 {g1,200},{g1,50},{z7,50},{z6,50},{z7,50}, //34 {g1,125},{z7,50},{g1,200}, //37 {g1,50},{z7,50},{g1,50},{z7,50},{g1,100},{z3,50},{z5,50}, //44 {z5,250},{z6,50},{z7,50}, //47 {g1,50},{z7,50},{g1,50},{z7,50},{g1,100},{g2,100},{g3,100}, //54 {g3,300},{z6,50},{z7,50}, //57 {g1,50},{z7,50},{g1,50},{z7,50},{g1,100},{g3,100}, //63 {z7,50},{z6,50},{z7,50},{z6,50},{z7,50},{z5,50},{z5,50},{g1,50}, //71 {g1,200},{g3,75},{g4,25},{g4,50},{g3,50}, //76 {g2,200},{yaya,50},{z5,50},{g1,50},{g2,50}, //81 {g3,50},{g1,50},{g1,50},{z5,50},{z5,100},{z5,50},{g3,50}, //88 {g2,50},{g3,50},{g2,50},{g1,50},{z5,50},{z5,50},{z6,50},{z7,50}, //96 {g1,50},{z6,50},{z6,50},{z3,50},{z3,100},{yaya,50},{z7,50}, //103 {g1,50},{z7,50},{g1,50},{g2,50},{z6,50},{z5,50},{z5,100}, //110 {z6,100},{z5,50},{z6,50},{z7,100},{g3,50},{g4,50}, //116 {g3,50},{g4,50},{g3,50},{g2,50},{g2,50},{g1,100},{z5,50}, //123 {z5,50},{z4,50},{z4,50},{g1,50},{g1,50},{g3,50},{g3,50},{g1,50}, //131 {g2,200},{yaya,50},{z5,50},{g1,50},{g2,50}, //136 {g3,50},{g1,50},{g1,50},{z5,50},{z5,100},{z5,50},{g3,50}, //143 {g2,50},{g3,50},{g2,50},{g1,50},{z5,50},{z5,50},{z6,50},{z7,50}, //151 {g1,50},{z6,50},{z6,50},{z3,50},{z3,100},{z3,50},{z7,50}, //158 {g1,50},{z7,50},{g1,50},{g2,50},{z6,50},{z5,50},{z5,100}, //165 {z6,50},{z7,50},{g1,50},{g2,100},{g3,50},{g4,50}, //171 {g3,50},{g4,50},{g2,50},{g1,50},{g2,50},{g1,50},{g1,100}, //178 {g2,50},{g1,50},{g2,50},{z6,50},{g1,100},{g2,50},{g1,50}, //185 {g1,400}, //186 {g2,50},{g1,50},{g2,50},{z6,50},{z7,100},{z7,50},{g1,50}, //193 {g1,400}, //194 }; int playXiaoJiuWo(void)//播放小酒窝 { int n = 0; struct yf *atop; atop = (struct yf *)a; n = 194; while(n--) { Beep(atop->s,atop->t*5); atop++; } return 0; } int main() { printf("%d",sizeof(ttt)); #if 0 playMideaSound(); #endif #if 0 playXiaoJiuWo(); #endif #if 0 playNation(); #endif #if 0 playHappybirth(); #endif return 0; }