51单片机唱歌怎么实现啊

2025-03-12 02:57:55
推荐回答(3个)
回答1:

  单片机可以演奏从低音、中音、高音和超高音,四个八度共28个音符。

  演奏乐曲时,就根据音符的不同数值,从半周期数据表中找到定时时间初始值,送入定时器即可控制发音的音调。

  比如把表中的0xF2和0x42送到定时器,定时器按照这个初始值来产生中断,输出的方波,人们听起来,这就是低音1。

乐曲的数据,也要写个数据表,程序中以 code unsigned char sszymmh[] 命名。

  1. 这个表中每三个数字,说明了一个音符,它们分别代表:

  2. 第一个数字是音符的数值1234567之一,代表多来咪发...;

  3. 第二个数字是0123之一,代表低音、中音、高音、超高音;

  4. 第三个数字是时间长度,以半拍为单位。

  5. 乐曲数据表的结尾是三个0。

回答2:

用蜂鸣器实现。。。

回答3:

/************************************************************************ C51音乐程序(八月桂花) /**********************************************************************/ #include #include //本例采用89C52, 晶振为11.0592MHZ //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码. //频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍; //所以拿出谱子, 试探编吧! sbit Beep = P1^5 ; unsigned char n=0; unsigned char code music_tab[] ={ 0x18, 0x30, 0x1C , 0x10, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10, 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20, 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15, 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20, 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20, 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00 }; void int0() interrupt 1 { TH0=0xd8; TL0=0xef; n--; } void delay (unsigned char m) { unsigned i=3*m; while(--i); } void delayms(unsigned char a) { while(--a); } void main() { unsigned char p,m; unsigned char i=0; TMOD&=0x0f; TMOD|=0x01; TH0=0xd8;TL0=0xef; IE=0x82; play: while(1) { a: p=music_tab[i]; if(p==0x00) { i=0, delayms(1000); goto play;} else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} else {m=music_tab[i++], n=music_tab[i++];} TR0=1; //开定时器1 while(n!=0) Beep=~Beep,delay(m); TR0=0; //关定时器1 } } 给你一个实例。你自己看看吧P1.5接个蜂蜜器哦。

求采纳