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

如题所述

设计的相关音乐说明

要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期时间。利用半周期时间定时这个半周期时间,每当计时到后就将输出的I/O反向,然后重复计时此半周期再对I/O反向,就可以在I/O脚上得到此频率的脉冲。

记数脉冲值与频率的关系公式如:N=Fi/2/Fr。N:记数值;Fi:内部计时依次为1us,故其频率为1 MHZ;Fr:要产生的频率。

其记数值的求法如:T=65536-N=65536-Fi/2/Fr。例:设K=65536,F=1000000=Fi=1 MHZ。求低音DO(26HZ),中音DO(523HZ),高音DO(1046HZ)的记数值。

每个音符使用1个音节,字节的高四位代表音符的高低,低四位代表音符的节拍。如果1拍为0.4秒,1/4拍为0.1秒,假设1/4拍为 DELAY,则1拍为4 DELAY。

扩展资料

功能特性

1,可以仿真63K程序空间,接近64K 的16位地址空间;

2,可以仿真64Kxdata 空间,全部64K 的16位地址空间;

3,可以真实仿真全部32 条IO脚;

4,完全兼容keilC51 UV2 调试环境,可以通过UV2 环境进行单步,断点, 全速等操作;

5,可以使用C51语言或者ASM汇编语言进行调试 ;

6,可以非常方便地进行所有变量观察,包括鼠标取值观察,即鼠标放在某 变量上就会立即显示出它此的值;

7,可选 使用用户晶振,支持0-40MHZ晶振频率;

8,片上带有768字节的xdata,您可以在仿真时选 使用他们,进行xdata 的仿真;

9,可以仿真双DPTR 指针;

10,可以仿真去除ALE 信号输出. ;

11,自适应300-38400bps 的所有波特率通讯;

12,体积非常细小,非常方便插入到用户板中.插入时紧贴用户板,没有连接电缆,这样可以有效地减少运行中的干扰,避免仿真时出现莫名其妙的故障;

13,仿真插针采用优质镀金插针,可以有效地防止日久生锈,选择优质园脚IC插座,保护仿真插针,同时不会损坏目标板上的插座. ;

14,仿真时监控和用户代码分离,不可能产生不能仿真的软故障;

15,RS-232接口不计成本采用MAX202集成电路,串行通讯稳定可靠,绝非一般三极管的简易电路可比。

参考资料来源:百度百科-51单片机

温馨提示:内容为网友见解,仅供参考
第1个回答  2017-01-04
1、单片机发声的基本原理
我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的高电平或低电平,则在该口线上就能产生一定频率形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制高 、低电平的持续时间,就能改变输出频率,从而改变音调。音符的节拍我们可以用定时器T0来控制,送入不同的初值,就可以产生不同的定时时间。便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。但是,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变T0的时间初值来实现不同节拍。我们可以用T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。例如对1/4拍音符,定时时间为0.16秒,相应的时间常数为16(即10H);对3拍音符,定时时间为1.92秒,相应时间长数为192(即C0H)。我们将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就可以实现演奏效果。此外,结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不同的音符
2、设计的相关音乐说明
要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期时间。利用半周期时间定时这个半周期时间,每当计时到后就将输出的I/O反向,然后重复计时此半周期再对I/O反向,就可以在I/O脚上得到此频率的脉冲。
记数脉冲值与频率的关系公式如:N=Fi/2/Fr。N:记数值;Fi:内部计时依次为1us,故其频率为1 MHZ;Fr:要产生的频率。
其记数值的求法如:T=65536-N=65536-Fi/2/Fr。例:设K=65536,F=1000000=Fi=1 MHZ。求低音DO(26HZ),中音DO(523HZ),高音DO(1046HZ)的记数值。
每个音符使用1个音节,字节的高四位代表音符的高低,低四位代表音符的节拍。如果1拍为0.4秒,1/4拍为0.1秒,假设1/4拍为 DELAY,则1拍为4 DELAY。
第2个回答  2017-02-22
51编写音乐程序基本也就用蜂鸣器,设定不同音调频率然后按照顺序和时长放出来差不多,至于mp3播放器之类的,就别想太多了,根本达不到PCM码流的最低通讯速率,上硬解码都没机会
第3个回答  2017-05-02
一、总体原理:
乐曲中不同的音符,实质就是不同频率的声音。通过单片机产生不同的频率的脉冲信号,
经过放大电路,由蜂鸣器放出,就产生了美妙和谐的乐曲。
二、单片机产生不同频率脉冲信号的原理:
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=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)
的计数值。
T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr
低音DO 的T=65536-500000/262=63627
中音DO 的T=65536-500000/523=64580
高音DO 的T=65536-500000/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单片机音乐程序
1)要产生音频脉冲,只要算出某一音频的脉冲(1\/频率),然后将此周期除以2,即为半周 期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I\/O 反相,然 后重复计时此半周期的时间再对I\/O 反相,就可以在I\/O 脚上得到此频率的脉冲。2)利用8051 的内部定时器使其工作在计数...

求一个用C语言编写的51单片机音乐程序代码。
include <reg52.h> sbit speaker=P2^2;unsigned char timer0h,timer0l,time;\/\/生日歌 code unsigned char sszymmh[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,5,1,1, 5,1,1, 5,2,2, 3,2,2,...

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

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

80c51单片机音乐播放器设计
⑹ 建立音乐的步骤:1)先把吧乐谱的音符找出,然后由上表建立T值表的顺序。2)把T值表建立在TABLE1,构成发音符的计数值放在“TABLE”。3)简谱码(音符)为高位,节拍为(节拍数)为低4位,音符节拍码放在程序的“TABLE”处。表9.4 简谱对应的简谱码、T值、节拍数 简谱 发音 简谱码 T值 ...

求89C51单片机播放音乐的C语言代码!
flag置0,准备frq递增 delayms(15);} } void timer0() interrupt 1 using 1 { TH0 = 0xfe;TL0 = frq;SPK = ~SPK;} void delayms(unsigned char ms)\/\/ 延时子程序 { unsigned char i;while(ms--){ for(i = 0; i < 120; i++);} } 这是蜂鸣器报警的代码 ...

求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单片机蜂鸣器程序,音乐的随时跳转
== 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,...

相似回答