① 单片机蜂鸣器音阶代码
3.3 蜂鸣器播放歌曲原理 一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅 度的谐波频率. 因此单片机奏乐只需弄清楚两个概念即可, 也就是 “音 调”和“节拍” ...
② 51单片机蜂鸣器程序是什么
51单片机蜂鸣器程序为:
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit beep=P1^5;
void delay(u16 i)
{
while(i--);
}
void main()
{
while(1)
{
beep=~beep;
delay(1000);//控制音调频率
beep=~beep;/控制声音大小
delay(10);
}
}
(2)单片机蜂鸣器音乐代码扩展阅读:
BUZZER蜂鸣器的分类:
1、按其驱动方式的原理分,可分为:有源蜂鸣器(内含驱动线路,也叫自激式蜂鸣器)和无源蜂鸣器(外部驱动,也叫他激式蜂鸣器)。
2、按构造方式的不同,可分为:电磁式蜂鸣器和压电式蜂鸣器。
3、按封装的不同,可分为:DIP BUZZER(插针蜂鸣器)和SMD BUZZER(贴片式蜂鸣器)。
4、按电流的不同,可分为:直流蜂鸣器和交流蜂鸣器,其中,以直流最为常见压电式蜂鸣器,用的是压电材料,即当受到外力导致压电材料发生形变时压电材料会产生电荷。同样,当通电时压电材料会发生形变。
电磁式蜂鸣器,主要是利用通电导体会产生磁场的特性,用一个固定的永久磁铁与通电导体产生磁力推动固定在线圈上的鼓膜。
由于两种蜂鸣器发音原理不同,压电式结构简单耐用但音调单一音色差,适用于报警器等设备。而电磁式由于音色好,所以多用于语音、音乐等设备。
③ 51单片机蜂鸣器 献给爱丽丝代码
#include<reg52.h> sbit SPK=P1^2; //定义音乐输出端口unsigned char t; // 休止符标志unsigned char w; // 节拍选择 unsigned char Timer0_H,Timer0_L,Time; //致爱丽丝unsigned char code MUSIC[]={ 3,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 7,1,1, 2,2,1, 1,2,1, 6,1,2, 6,0,1, 1,1,1, 3,1,1, 6,1,1, 7,1,2, 5,0,1, 3,1,1, 5,1,1, 7,1,1, 1,2,2, 6,1,1, 3,1,1, 3,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 7,1,1, 2,2,1, 1,2,1, 6,1,2, 6,0,1, 1,1,1, 3,1,1, 6,1,1, 7,1,2, 5,0,1, 3,1,1, 5,1,1, 7,1,1, 6,1,2, 6,0,1, 7,1,1, 1,2,1, 2,1,1, 3,1,2, 1,1,1, 5,1,1, 4,2,1, 3,2,1, 2,2,2, 7,0,1, 4,1,1, 3,2,1, 2,2,1, 1,2,2, 6,0,1, 3,1,1, 2,2,1, 1,2,1, 7,0,1, 3,1,1, 3,1,1, 3,2,1, 3,1,1, /* 3,2,1, 3,2,1, 3,3,1, 2,2,1, 3,2,1, 2,3,1, //高音 3,3,1, 2,2,1, 3,2,1, 2,3,1, 3,3,1, 2,3,1, 3,3,1, 2,3,1, 3,3,1, 7,2,1, 2,3,1, 1,3,1, */ 3,2,1, 3,2,1, 3,2,1, 2,2,1, 3,2,1, 2,2,1, //低音 3,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 7,1,1, 2,2,1, 1,2,1, 6,2,2, 6,1,1, 1,2,1, 3,2,1, 6,2,1, 7,2,2, 5,1,1, 3,2,1, 5,2,1, 7,2,1, 1,3,2, 6,1,1, 3,2,1, 3,3,1, 2,3,1, 3,3,1, 2,3,1, 3,3,1, 7,2,1, 2,3,1, 1,3,1, 6,2,2, 6,1,1, 1,2,1, 3,2,1, 6,2,1, 7,2,2, 5,2,1, 3,2,1, 1,3,1, 7,2,1, 6,2,4, 6,2,4, 11 }; // 音阶频率表 高八位code unsigned char FREQH[]={ 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC, 0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE, //1,2,3,4,5,6,7,8,i 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,0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, //1,2,3,4,5,6,7,8,i 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16, }; /*------------------------------------------------ 节拍延时函数 各调1/4节拍时间: 调4/4 125ms 调2/4 250ms ------------------------------------------------*/void delay_ms(){ unsigned char i; for(i=0;i<230;i++);}void delay(unsigned char t){ unsigned char i; for(i=0;i<t;i++) { unsigned int k,j; j=500; for(k=0;k<j;k++) { delay_ms(); } } }/*------------------------------------------------ 定时器0中断------------------------------------------------*/void TIM0_ISR() interrupt 1{ TR0=0; if(t!=0) { SPK=!SPK; } else { SPK=0; } TH0=Timer0_H; TL0=Timer0_L; TR0=1; }/*------------------------------------------------ 歌曲处理函数------------------------------------------------*/void Song(){ TH0=Timer0_H;//赋值定时器时间,决定频率 TL0=Timer0_L; TR0=1; //打开定时器 delay(Time); //延时所需要的节拍 }/*------------------------------------------------ 主函数------------------------------------------------*/ void main(void) { unsigned int k,i; TMOD|=0x01; //置定时器0工作方式1 EA=1; //打开全局中断 ET0=1; //打开定时0中断 while(1) { i=0;// w=0; while(MUSIC[i]!=11) { //音乐数组长度 ,唱完从头再来 k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振荡频率所需数据 t=MUSIC[i]; Timer0_H=FREQH[k]; Timer0_L=FREQL[k]; Time=MUSIC[i+2]; //节拍时长 i=i+3;// w++; Song(); } } }
④ 单片机蜂鸣器c语言《兰花草》音乐代码
程序名: MCS51U实验板配套程序-歌曲:兰花草
;电路介绍:蜂鸣器接P2.0;实验前要连接J12
;***********************************************************************
OUT BIT P2.0
ORG 0
AJMP START
ORG 0BH
AJMP TIM0
START: MOV TMOD,#1
MOV IE,#10000010B
START0: MOV 30H,#0
NEXT: MOV A,30H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R2,A
JZ END0
ANL A,#0FH
MOV R5,A
MOV A,R2
SWAP A
ANL A,#0FH
JNZ SING
CLR TR0
AJMP D1
SING: DEC A
MOV 22H,A
RL A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV TH0,A
MOV 21H,A
MOV A,22H
RL A
INC A
MOVC A,@A+DPTR
MOV TL0,A
MOV 20H,A
SETB TR0
D1: CALL DELAY
INC 30H
AJMP NEXT
END0: CLR TR0
AJMP START0
TIM0: PUSH ACC
PUSH PSW
MOV TL0,20H
MOV TH0,21H
CPL OUT
POP PSW
POP ACC
RETI
DELAY: MOV R7,#2
D2: MOV R4,#125
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY
RET
;====================================
TABLE1: DW 64021,64103,64260,64400
DW 64524,64580,64684,64777
DW 64820,64898,64968,65030
DW 64934
TABLE: ;1
DB 42H,82H,82H,82H,84H,02H,72H
DB 62H,72H,62H,52H,48H
DB 0B2H,0B2H,0B2H,0B2H,0B4H,02H,0A2H
;2
DB 12H,0A2H,0D2H,92H,88H
DB 82H,0B2H,0B2H,0A2H,84H,02H,72H
DB 62H,72H,62H,52H,44H,02H,12H
;3
DB 12H,62H,62H,52H,44H,02H,82H
DB 72H,62H,52H,32H,48H
DB 00H
END
⑤ 求stm32单片机的程序,用触摸板控制蜂鸣器发出不同的歌曲。
摘要 程序中首先准备音频数据表:
⑥ 用11.0592m晶振的51单片机的蜂鸣器音乐代码生成软件
音符频率(Hz)
低1DO262
#1DO#277
低2RE294
#2RE#311
低3M330
低4FA349
#4FA#370
低5SO392
#5SO#415
低6LA440
#6466
低7SI494
中1DO523
#4FA#740
中5SO784
#5SO#831
中6LA880
#66LA#932
中7SI988
高1DO1046
#1DO#1109
高2RE1175
#2RE#1245
高3M1318
高4FA1397
#4FA#1480
高5SO1568
#5SO#1661
高6LA1760
#61865
高7SI1967
初值计算公式:65536-460800/Fr
⑦ 求单片机 音乐播放的c代码
代码的格式,是由编程者设计的,并没有统一的规范。
下面的链接可供参考。
http://hi..com/%d7%f6%b6%f8%c2%db%b5%c0/blog/item/88bfff323ec42ef21b4cff09.html
⑧ 使用51单片机蜂鸣器播放音乐 求keil程序
//主程序查音符码,将不同的初值装入定时器,定时器每中断一次,P3.7取反一次,形成不同频率的方波
//11代表低音哆 21代表高音哆 1代表中音哆
//12代表低音来 22代表高音来 2代表中音来,是不是翻译乐谱很方便
#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是高音哆 ,后面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,6,21,5,5,5,5, 3,3,5,6,6,5,6, 21,21,22,5,6,6,6,6, 3,3,1,1,2,2,2,2,2,
2,2,2,3,5,5,5,5, 21,21,2,3,5,5,5,5, 2,1,16,1,15,15,15,15, 0,0,0,0,16,16,1,1, 15,15,16,16,1,1,1,1, 5,5,6,6,4,4,3,3, 2,2,2,2,2,2,5,5, 5,5,2,2,4,4,3,3, 2,2,1,2,4,4,4,4,
16,16,1,1,2,2,4,4, 2,1,16,1,15,15,15,15, 16,16,16,16,15,15,15,15, 15,15,15,15,15,15,15,15, 0,0,5,5,5,5,0,0, 5,5,5,5,4,4,4,4,
5,5,5,5,2,2,2,2, 2,2,5,5,4,4 ,4,4, 16,16,1,1,2,2,2,2, 4,4,2,2,2,2,4,4, 5,5,5,5,5,5,6,6, 21,21,21,21,6,6,21,21,
21,21,6,6,5,5,5,5, 5,5,6,6,5,5,4,4, 2,2,2,2,2,2,5,5, 5,5,2,2,4,4,3,3, 2,2,1,2,4,4,4,4, 16,16,1,1,2,2,4,4,
2,1,16,1,15,15,15,15, 16,16,16,16,15,15,15,15, 5,5,6,6,5,5,6,6, 5,5,4,4,5,5,5,5, 1,1,2,2,1,1,2,2, 15,15,16,16,1,1,1,1,
5,5,6,6,5,5,6,6, 21,21,6,6,5,5,5,5, 1,1,2,2,1,1,2,2, 15,15,16,16,1,1,1,1, 5,5,6,6,5,5,4,4, 5,5,5,5,1,1,2,2, 15,15,16,16,1,1,1,1,
5,5,6,6,5,5,5,5, 1,1,2,2,1,1,1,1, 5,5,6,6,5,5,5,5, 1,1,2,2,1,1,1,1, 5,5,5,5,1,1,1,1, 5,5,5,5,1,1,1,1, 5,5,5,5,1,1,5,5,
1,1,5,5,1,1,5,5, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 0,0,1,1,1,1,0,0, 5,5,5,5,4,4,4,4, 5,5,5,5,2,2,2,2, 2,2,5,5,4,4,4,4,
6,6,1,1,2,2,2,2, 4,4,2,2,2,2,4,4, 5,5,5,5,5,5,6,6, 21,21,21,21,6,6,21,21, 21,21,6,6,5,5,5,5, 5,5,6,6,5,5,4,4, 2,2,2,2,2,2,5,5,
5,5,2,2,4,4,3,3, 2,2,1,22,4,4,4,4, 16,16,1,1,2,2,4,4, 4,4,6,6,5,5,5,5, 5,5,5,5,5,5,5,5, 6,6,6,6,5,5,5,5};
uchar code table[] = { 0,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,0,0,0, //定时半周期的初始值中音123 4 5 67高8位
//三个0是补位码,为了使表格整齐,便于按规律查询 首个0是休止符11个
0xf8,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,0,0,0, //低音1 2 3 4 5 67高8位 10个
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff, //高音1 2 3 4 5 67高8位 7个
0,0x44,0xad,0x0a,0x34,0x82,0xc8,0x06,0,0,0, //中音123 4 5 67低8位 10个
0x89,0x59,0x13,0x68,0x04,0x90,0x0c,0 ,0,0, //低音1 2 3 4 5 6 7低8位10个
0x22,0x56,0x85,0x9a,0xc1,0xe4,0x03}; //高音1 2 3 4 5 6 7低8位 7个
void delay(i) //晶振12MHZ时延时1ms
{
for(j=i;j>0;j--)
for(k=121;k>0;k--);
}
void TIM0_ISR() interrupt 1
{
SPK=!SPK;//定时取反,形成方波
TH0=table[x]; //重新载入定时半周期的初始值
TL0=table[x+28];//为什么加28 11+10+7=28
}
void main(void)
{
TMOD|=0x01;
EA=1;
ET0=1;
while(1)
{
y=0;
while(y<592)//此乐谱里面有592个音符
{
x=MUSIC[y];//查乐谱表
TH0=table[x]; //查不同音节的定时器初值
TL0=table[x+28];
TR0=1; //打开定时器
if(y>72)//两首曲子不同节奏,延时不同
{
delay(125); //延时125ms
}
else
{
delay(250); //延时250ms
}
y++;
TR0=0;
}
}
}
⑨ 51单片机蜂鸣器程序,音乐的随时跳转
这里修改:
sbitkey1=P1^0;
sbitkey2=P1^1;
voidPlay_Song(unsignedchari)
{
unsignedcharTemp1,Temp2;
unsignedintAddr;
Count=0;//中断计数器清0
Addr=i*217;
while(1)
{
if(key2==0)break;//插入这一句
Temp1=SONG[Addr++];
if(Temp1==0xFF)//休止符
{
TR0=0;
Delay_xMs(100);
}
elseif(Temp1==0x00)//歌曲结束符
{
return;
}
else
{
Temp2=SONG[Addr++];
TR0=1;
while(1)
{
_Speak=~_Speak;
Delay_xMs(Temp1);
if(Temp2==Count)
{
Count=0;
break;
}
}
}
}
}
PlaySong2(................
{
....
whlie(1)
{
if(key1==0)break;//插入这一句
.....
}
}
voidmain()
{
Time0_Init();//定时器0中断初始化
while(1)
{
Play_Song(0);//播放1
Play_Song2(0);//播放2
}
}
⑩ 用单片机控制蜂鸣器放音乐
看起来数组应该是音乐数据,其中包括四种数据,就是休止符(每个100毫秒)、歌曲结束符、音阶(给出的是蜂鸣器的震荡周期)、一个音阶持续的时间长度。如果你的晶振是12MHz,按照定时器中断给Count加一来看,音阶持续的时间应该是以10毫秒为单位。
Play_Song函数要求给出参数i,我的看法是这个i是指要播放第几段乐曲,i*217表示每段乐曲都是217个字节。本例中,数组只给出217个字节,所以只有一段乐曲,播放时需要给出参数i=0.
if ( Temp1 == 0xFF ) //休止符
{
TR0 = 0;
Delay_xMs(100);
}
所以休止符每个固定是100毫秒。
如果读到第一个不是休止符或者结束符的字节,那就是音阶,而下一个字节就是这个音阶的长度或者说节拍
while(1)
{
FMQ = ~FMQ;
Delay_xMs(Temp1);
if ( Temp2 == Count )
{
Count = 0;
break;
}
}
这一段是说,如果当前音阶的时间(Temp2次定时器中断,由Count计时)还没完,就每隔Temp1毫秒震动一次蜂鸣器,就形成一个震动频率,这段时间就发出一定音调的乐音。不过我也有疑惑,震荡周期如果以毫秒为单位恐怕只能发出次声波,所以以上对有关Delay_xMs函数时间的估算都可能有问题,还得看Delay_xMs函数的具体定义才行。