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();
}
}
}

设计的相关音乐说明
要产生音频脉冲,只要算出某一音频的周期(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单片机

SONG_TONE[i]/3
产生一个短延时,延时的时间正好是音符的频率

延时时间越短产生的频率就越高,发出的声音也越高

SONG_LONG[i]*20
是用于音符的持续时间。

就相当于长按跟短按一个按键一样

那里不说了吗?
LONG是拍子的长度,就是一个音节的长度,
而TONE是这个音节的频率.
例如:我要发一个音,在LONG循环里不断地取反蜂鸣器,你把TONE设得越大,它取反的速度就越慢,不正好模拟出音的频率了吗?
而LONG到了就表示这个音结束.不正是音的长度了吗?

这两个地方都是延时用的,为什么这么做与表中值的大小,晶振大小有关,你可以修改大小试验。


51单片机写音乐的一个程序,求详解,以下是程序。
SONG_LONG[i]*20 是用于音符的持续时间。就相当于长按跟短按一个按键一样

求 单片机中用汇编语言写的简单的音乐演示
MOV DPTR,#TABLE ;生日快乐的TABLE JMP CON MUSIC1: CJNE A,#01,MUSIC2 MOV DPTR,#TABLE1 JMP CON MUSIC2:CJNE A,#02,MUSIC3 MOV DPTR,#TABLE2 JMP CON MUSIC3:CJNE A,#03,MUSIC4 MOV DPTR,#TABLE3 JMP CON MUSIC4:CJNE A,#04,MUSIC5 MOV DPTR,#TABLE4 JMP CON MUSIC5:CJNE ...

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

单片机高手帮我看看这个世上只有妈妈好的音乐程序,解释两句话。_百度...
void t0int() interrupt 1 { \/\/定时器里面让speaker根据定时时间开关,产生不同频率的声音,就是上面定义的音节频率 TR0=0;speaker=!speaker;TH0=timer0h;TL0=timer0l;TR0=1;} delay(time); \/\/很显然,这就是延时几拍了 \/\/这里很显然,就是计算出每一个音的音阶(包含计算了高低音,每...

单片机音乐代码
\/\/1. 迟来的爱 };code uchar SONG1 [ ]={ \/\/2.两只蝴蝶 };code uchar SONG3 [ ]={ \/\/4.一个师傅三个徒弟 };uchar hjsz;uchar ljsz;uchar jpm;uchar yfm;uchar t0 =0;uint i=0;sbit Speaker =P1^0;uint k;void Delay1(){ for ( k=0;k<20000;k++);} voi...

怎么用单片机编写音乐程序
单片机比如51系列都有定时器,因此可以利用它来控制扬声器按一定频率发声,以下就是一个例程,用按键的按下和抬起来模拟电子琴的控制程序。T0HEQU 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,...

单片机播放音乐的工作原理
单片机播放音乐的工作原理 单片机播放音乐的工作原理主要基于其内部的定时器和I\/O端口,通过编程控制输出特定频率的方波信号来驱动扬声器或蜂鸣器,从而产生声音。在深入了解原理之前,我们先了解一下音乐的基本知识。音乐中的每个音符都对应一个特定的频率。例如,中央C(C4)的频率是261.63Hz,而高一个八度...

这些单片机代码根据曲谱怎么写出来的,求大神详细教啊!
1,音高(频率) 2,节拍(音符长度)3,强度。其次,单片机演奏音乐的原理?1,硬件方面:以I\/o口输出方波,驱动无源蜂鸣器震动,方波频率与乐谱中音符的频率对应(实现了音乐的第1要素)2,软件方面,有两点 (1)如何产生某一频率的方波?通过定时器产生周期性中断,在中断里将IO口的电平翻转即可,...

单片机用汇编语言写个音乐程序
最后一字节是节拍时间.你可以用一个定时器1产生一路PWM去驱动一个蜂鸣器发声,然后再用一个定时器2,用来定时节拍的持续时间.取第一个音阶的频率,做为PWM的频率设定到定时器1,然后再把音阶节拍时间设置到定时器2.当节拍时间到达后,再取下一个音阶,重复以上过程就能放出音乐了....

51music单片机音乐代码生成器怎么用?
黑白底色是模拟琴键的。白底黑字是正常音符1234567,黑底白字的1是一个介于普通音符1和2之间的音,频率也在do和ra之间。

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

沈阳市15277728886: 用51单片机抄的一段C程序,谁来帮我解释一下music - tab1,music - tab2怎么根据歌曲修改 -
五畅卓夫: music_tab1是音高按他的写法15是低音so,16是低音la,1是中音do以此类推,music_tab2是music_tab1中音符对应的节拍,2代表八分音符,4代表四分音符,8代表二分音符

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

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

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

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

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

沈阳市15277728886: 求: 用51单片机c语言操作使蜂鸣器奏出“祝你生日快乐”音乐的全部程序!
五畅卓夫: #include <reg51.h> sbit speaker=P1^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,...

沈阳市15277728886: 用AT89c51单片机如何编出歌 -
五畅卓夫: 先将每个音调的频率定下来!然后编写延时程序实现每个音调!最后需要哪个音调就调用哪个音调,至于间隔,就是所谓的内部延时了!有了这些音调,你可以任意编写歌曲咯!可以参考:http://wenku.baidu.com/view/43653ed4b14e852458fb57b2.html

沈阳市15277728886: 用51单片机做音乐程序的思路是怎么样的?
五畅卓夫: 结合振荡电路 计算好音调的频率 通过不同的频率来得到不同的音调

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