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

作者&投稿:塔强 (若有异议请与网页底部的电邮联系)
求一个用C语言编写的51单片机音乐程序代码。~

#include
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, 1,2,2, 7,1,2, 6,1,2,
4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};
// 音阶频率表 高八位
code unsigned char FREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
} ;
// 音阶频率表 低八位
code unsigned char FREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
void delay(unsigned char t)
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++)
{
;
}
}
TR0=0;
}
void t0int() interrupt 1
{
TR0=0;
speaker=!speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}

void main(void)
{
unsigned char k,i;
TMOD=1; //置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();
}
}
}

T0H EQU 30H
T0L EQU 31H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#01H
SETB ET0
SETB EA
LOOP:
MOV DPTR,#FREQ
MOV A,P2 ;控制高中低音区
MOV R1,#0
ANL A,#03H
JB ACC.0,LOOP01
MOV R1,#14
SJMP LOOP0
LOOP01:
JB ACC.1,LOOP0
MOV R1,#28
LOOP0:
JB P0.0,LOOP1 ;控制音频1234567
MOV A,R1
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP1:
JB P0.1,LOOP2
MOV A,R1
ADD A,#2
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
ADD A,#2
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP2:
JB P0.2,LOOP3
MOV A,R1
ADD A,#4
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
ADD A,#4
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP3:
JB P0.3,LOOP4
MOV A,R1
ADD A,#6
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
ADD A,#6
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP4:
JB P0.4,LOOP5
MOV A,R1
ADD A,#8
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
ADD A,#8
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP5:
JB P0.5,LOOP6
MOV A,R1
ADD A,#10
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
ADD A,#10
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP6:
JB P0.6,LOOP7
MOV A,R1
ADD A,#12
MOVC A,@A+DPTR
MOV T0H,A
INC DPTR
MOV A,R1
ADD A,#12
MOVC A,@A+DPTR
MOV T0L,A
LJMP LOOP
LOOP7:
CLR TR0
LJMP LOOP
;-----------------------------
T0ISR:
CLR TR0
MOV TH0,T0H
MOV TL0,T0L
SETB TR0
CPL P3.0
RETI
;-----------------------------
FREQ:
DB 0F2H,03DH ;低音1
DB 0F3H,0BDH ;低音2
DB 0F5H,014H ;低音3
DB 0F5H,0B1H ;低音4
DB 0F6H,0D0H ;低音5
DB 0F7H,0D1H ;低音6
DB 0F8H,0B5H ;低音7
DB 0F9H,01EH ;中音1
DB 0F9H,0DEH ;中音2
DB 0FAH,08AH ;中音3
DB 0FAH,0D8H ;中音4
DB 0FBH,068H ;中音5
DB 0FBH,0E8H ;中音6
DB 0FCH,05AH ;中音7

DB 0FCH,08FH ;高音1
DB 0FCH,0EFH ;高音2
DB 0FDH,045H ;高音3
DB 0FDH,06CH ;高音4
DB 0FDH,0B4H ;高音5
DB 0FDH,0F4H ;高音6
DB 0FEH,029H ;高音7
;-----------------------------
END

设计的相关音乐说明

要产生音频脉冲,只要算出某一音频的周期(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、单片机发声的基本原理
我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的高电平或低电平,则在该口线上就能产生一定频率形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制高 、低电平的持续时间,就能改变输出频率,从而改变音调。音符的节拍我们可以用定时器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。


51编写音乐程序基本也就用蜂鸣器,设定不同音调频率然后按照顺序和时长放出来差不多,至于mp3播放器之类的,就别想太多了,根本达不到PCM码流的最低通讯速率,上硬解码都没机会

一、总体原理:
乐曲中不同的音符,实质就是不同频率的声音。通过单片机产生不同的频率的脉冲信号,
经过放大电路,由蜂鸣器放出,就产生了美妙和谐的乐曲。
二、单片机产生不同频率脉冲信号的原理:
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...

求一个用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单片机唱歌怎么实现啊
单片机可以演奏从低音、中音、高音和超高音,四个八度共28个音符。演奏乐曲时,就根据音符的不同数值,从半周期数据表中找到定时时间初始值,送入定时器即可控制发音的音调。比如把表中的0xF2和0x42送到定时器,定时器按照这个初始值来产生中断,输出的方波,人们听起来,这就是低音1。乐曲的数据,也要...

51单片机如何实现语音功能
单片机需要增加语音功能,要么选择功能强大stm32之类的芯片,用内部的dac来模拟输出,要么就外挂一个语音芯片 语音芯片的作用 1、顾名思义,就在是产品上增加语音播报的功能,实现的也就是把语音播放出来 2、常见的如:停车场报金额、电梯报站、货车报“左转弯,请注意”等等,应用非常的广泛 语音芯片的...

51单片机控制喇叭
可以使用一个PNP型的晶体管,如8550,构成一个驱动器,电路如下所示。注意:不发音的时候,应该保持引脚的输出为高电平;如果难以保证,则应该在电阻支路中,再串联一个10uF的电容器,起到隔直的作用。

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

使用51单片机蜂鸣器播放音乐 求keil程序
include<reg52.h> sbit SPK = P3^7; \/\/P3.7外接扬声器,可以改成你所说的P1^5 define uint unsigned int;define uchar unsigned char;uint x,y;uint i,j,k;\/\/以下是根据歌谱转来的音乐代码 3代表中音咪 1个全音被分成4个1\/4 音符 \/\/小燕子第一句 3,5,21,6,5,5,5,5, 21...

用51单片机实现音乐播放的原理是什么
需要写一段程序。如果是简单的音乐,编乐谱推蜂鸣器就可以;如果是mp3\/wav之类的音乐,需要芯片自带解码模块,或者使用外部解码芯片,还需要dac将声音推出来。声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上...

跪求单片机51_C语言音乐程序,音乐是国际歌!谢谢!
{0xFF24,0xFF3C,0xFF51,0xFF5B,0xFF6D,0xFF7D,0xFF8B},};\/ 格式:音调+音阶+拍数 \/ code uint m1[]= { \/\/《最炫民族风》262,261,251,262,261,311,312,321,311,261,0,312,311,252,311,322,331,351,351,331,322,331,0,361,361,361,351,331,331,312,261,261,261,332,...

舞阳县18391211210: 51单片机音乐播放器c程序 -
萧享重组: 先将乐曲做一次AD转换,转成一个数组,然后将数组写进C程序中,烧入单片机,播放的时候在做一次DA转换,将转换后的信号进行功放再通过喇叭就能播放了.

舞阳县18391211210: 怎么用单片机编写音乐程序 -
萧享重组: 单片机比如51系列都有定时器,因此可以利用它来控制扬声器按一定频率发声,以下就是一个例程,用按键的按下和抬起来模拟电子琴的控制程序. T0H EQU 30H T0L EQU 31H ORG 0000H LJMP MAIN ORG 000BH LJMP T0ISR ORG 0030H ...

舞阳县18391211210: 51单片机唱歌怎么实现啊 -
萧享重组: 单片机可以演奏从低音、中音、高音和超高音,四个八度共28个音符. 演奏乐曲时,就根据音符的不同数值,从半周期数据表中找到定时时间初始值,送入定时器即可控制发音的音调. 比如把表中的0xF2和0x42送到定时器,定时器按照这个...

舞阳县18391211210: 单片机音乐程序怎么编? -
萧享重组: 写一个函数,函数有一个参数,参数是一个数组,数组的元素是一个结构体,结构体有两个成员:一个是声音的频率,另一个是声音响的时间;在函数里让单片机的某个脚按数组顺序发出一定时长的一定...

舞阳县18391211210: 51单片机汇编语言怎么编个歌曲演奏的程序 -
萧享重组: 到图书管去找 51单片机的程序书上面一般都有的 很简单 就用中断写就行了

舞阳县18391211210: 求一个51单片机的音乐发生器的程序 -
萧享重组: (一) 任务二:音乐发生器1、说明:单片机发声原理:利用定时器,可以发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同的音调.定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反转...

舞阳县18391211210: 据说在51单片机可以编简单的音乐,我的开发板是STC89C52RC,哪位大虾有现成的C语言程序,让我试试啊. -
萧享重组: 现成的程序早没有了,不过可以给你个思路.52的三个定时器,一个控制通讯,一个控制喇叭的频率,也就是音高,一个控制这个音高的持续时间,有了这两个定时器,你就能把乐谱翻译成数据流了.音高与频率的转换关系在网上就能查到,我当初也是在网上找的.另外,建议你把歌曲数据存在CODE里,这样比较流畅.

舞阳县18391211210: 向单片机高手求助,怎样用C语言编写歌曲程序和歌曲代码?需要用那些工具怎么样编写的要求详细解答.谢谢! -
萧享重组: //绝对调试通过,AVR-GCC,mega16,带数码显示,单键开关多功能控制 #include <avr/io.h> #include <avr/interrupt.h> #include <tone.h> #include <avr/pgmspace.h> #define uchar unsigned char #define uint unsigned int #define key_input PINA ...

舞阳县18391211210: 怎样用51单片机实现音乐播放?
萧享重组: 单片机的强项是控制,不能解码音频文件,而且不同的音频编码格式不一样,不是普通的程序就能解决的.应该用专门的音频解码芯片.

舞阳县18391211210: 51单片机曲谱编写音乐程序,我看不懂曲谱,谁能教下我! -
萧享重组: //《世上只有妈妈好》51单片机C语言程序和音乐采灯程序 //此程序在硬件上调试通过 //本程序的单片机晶振采用11.0592MHZ //此程序的流水灯随音乐的节拍的快慢而动 #include <reg51.h> sbit speaker=P2^0; //接音频放大电路, //sbit ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网