如何编写51单片机音乐程序

如题所述

第1个回答  2017-05-27
一、总体原理:
乐曲中不同的音符,实质就是不同频率的声音。通过单片机产生不同的频率的脉冲信号,
经过放大电路,由蜂鸣器放出,就产生了美妙和谐的乐曲。
二、单片机产生不同频率脉冲信号的原理:
1)要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周
期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O 反相,然
后重复计时此半周期的时间再对I/O 反相,就可以在I/O 脚上得到此频率的脉冲。
2)利用8051 的内部定时器使其工作在计数器模式MODE1 下,改变计数值TH0 及TL0 以
产生不同频率的方法如下:
例如,频率为523Hz,其周期天/523 S=1912uS,因此只要令计数器计时956uS/1us=956,
在每计数956 次时就将I/O 反接,就可得到中音DO(532Hz)。
计数脉冲值与频率的关系公式如下:
N=Fi/2/Fr
(N:计数值,Fi:内部计时一次为1uS,故其频率为1MHz,Fr:要产生的频率)
三、其计数值的求法如下:
T=65536-N=65536-Fi/2/Fr
计算举例:
设K=65536,F==Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)
的计数值。
T=65536-N=65536-Fi/2/Fr=6/2/Fr=65536-/Fr
低音DO 的T=65536-/262=63627
中音DO 的T=65536-/523=64580
高音DO 的T=65536-/1047=65059
参考程序:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP=P3^7;
// 生日快乐歌的音符频率表,不同频率由不同的延时来决定
uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};
// 生日快乐歌节拍表,节拍决定每个音符的演奏长短
uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};
// 延时
void DelayMS(uint x)
{
uchar t;
while(x--) for(t=0;t<120;t++);
}
// 播放函数
void PlayMusic()
{
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{ //播放各个音符,SONG_LONG 为拍子长度
for(j=0;j<SONG_LONG[i]*20;j++)
{
BEEP=~BEEP;
//SONG_TONE延时表决定了每个音符的频率
for(k=0;k<SONG_TONE[i]/3;k++);
}
DelayMS(10);
i++;
}
}
void main()
{
BEEP=0;
while(1)
{
PlayMusic(); //播放生日快乐
DelayMS(500); //播放完后暂停一段时间
}
}本回答被提问者采纳

如何编写51单片机音乐程序
要产生音频脉冲,只要算出某一音频的周期(1\/频率),然后将此周期除以2,即为半周期时间。利用半周期时间定时这个半周期时间,每当计时到后就将输出的I\/O反向,然后重复计时此半周期再对I\/O反向,就可以在I\/O脚上得到此频率的脉冲。记数脉冲值与频率的关系公式如:N=Fi\/2\/Fr。N:记数值;Fi:...

基于51单片机的利用定时器产生乐曲设计
在本设计中,我们利用51单片机的定时器功能,实现音乐的生成。首先,通过程序运行图和仿真原理图,直观展示了乐曲设计的实现路径。我们定义了关键变量 `Count`,作为计数器,用于管理音乐的播放流程。其中,`_Speak` 作为控制喇叭的信号脚,通过其状态变化来实现音乐的播放。歌曲字根码部分使用了 `unsigned ...

如何编写51单片机音乐程序
1)要产生音频脉冲,只要算出某一音频的脉冲(1\/频率),然后将此周期除以2,即为半周 期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I\/O 反相,然 后重复计时此半周期的时间再对I\/O 反相,就可以在I\/O 脚上得到此频率的脉冲。2)利用8051 的内部定时器使其工作在计数...

51单片机控制喇叭的程序(c语言)
[文件名] C51音乐程序(八月桂花)[功能] 通过单片机演奏音乐 注意:通过了74HC14控制ULN2003 驱动芯片驱动蜂鸣器 \/***\/ include <REG52.H> include <INTRINS.H> \/\/本例采用89C52, 晶振为11.0592MHZ \/\/关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.\/\/频率常数即音乐术语中的音调,而...

求一个用C语言编写的51单片机音乐程序代码。
\/\/置CT0定时工作方式1 EA=1;ET0=1;\/\/IE=0x82 \/\/CPU开中断,CT0开中断 while(1){ i=0;while(i<75){ \/\/音乐数组长度 ,唱完从头再来 k=sszymmh[i]+7*sszymmh[i+1]-1;timer0h=FREQH[k];timer0l=FREQL[k];time=sszymmh[i+2];i=i+3;song();} } } ...

51单片机写音乐的一个程序,求详解,以下是程序。
SONG_TONE[i]\/3 产生一个短延时,延时的时间正好是音符的频率 延时时间越短产生的频率就越高,发出的声音也越高 SONG_LONG[i]*20 是用于音符的持续时间。就相当于长按跟短按一个按键一样

51单片机蜂鸣器程序,音乐的随时跳转
== 0xFF ) \/\/休止符{TR0 = 0;Delay_xMs(100);}else if ( Temp1 == 0x00 ) \/\/歌曲结束符{return;}else{Temp2 = SONG[Addr++];TR0 = 1;while(1){_Speak = ~_Speak;Delay_xMs(Temp1);if ( Temp2 == Count ){Count = 0;break;}}}PlaySong2(......

使用51单片机蜂鸣器播放音乐 求keil程序
\/\/以下是根据歌谱转来的音乐代码 3代表中音咪 1个全音被分成4个1\/4 音符 \/\/小燕子第一句 3,5,21,6,5,5,5,5, 21是高音哆 ,后面4个5,是因为这个音节占4拍 uchar code MUSIC[]={3,5,21,6,5,5,5,5, 3,5,6,21,5,5,5,5, 21,21,21,23,22,22,21,21, 22,21,...

求51单片机蜂鸣器播放音乐的教程 C语言
uchar keyscan(void);\/\/键盘扫描程序 void delay(uint i); \/\/延时子程序\/*--- T0的值,及输出频率对照表 ---*\/ uchar code freq[36*2]={ 0xA9,0xEF, \/\/0x3F,0XEE,\/\/00220HZ ,1 \/\/0 0x93,0xF0, \/\/0X3D,0XEF,\/\/00233HZ ,1 0x73,0xF1, \/\/0X30,0XF0,\/\/0024...

51单片机,怎么用汇编语言编程一个程序。实现4个按键控制4种报警声音(1...
MAIN:MOV SP,#5FH MOV TMOD,#11H SETB EA SETB ET0 SETB ET1 LOOP:LCALL KEYSCAN MOV A,R2 JNZ LP1 MOV DPTR,#TAB110 SJMP LPRUN LP1:DEC A JNZ LP2 MOV DPTR,#TAB119 SJMP LPRUN LP2:DEC A JNZ LP3 MOV DPTR,#TAB120 SJMP LPRUN LP3:DEC A JNZ LP4 MOV DPTR,#TABBOMB ...

相似回答