⑴ 單片機蜂鳴器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
⑵ 51單片機蜂鳴器音樂
你需要把青花瓷的譜子變成數字(定時器的時間)
⑶ 求幾首單片機經典歌曲樂譜,及蜂鳴器驅動原理和 C語言程序。
建議用小喇叭,效果比蜂鳴器好很多,驅動就是正負極啊,一接就好了,當時做這個不是難點。C語言程序網上可以搜到的,這里歌曲樂譜都是一些數組組成,你換歌相當於換數組里的數,所以意思就是程序模板是不變的。定時器可能會用到,你說的中斷切換歌曲也是可以實現的。
⑷ 單片機蜂鳴器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
⑸ 用89C51單片機和蜂鳴器播放「 生日快樂」歌的C程序 12M晶振
1、寫入頭文件。
⑹ 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
}
}
⑺ 用單片機蜂鳴器做音樂
蜂鳴器不能輸出音樂的!你要接個喇叭才行,我試過的。
我是一樓,給你個頻率表http://www.mirle.com.tw/big%205/p2_controllers/manual/SC/006.pdf
自己編吧,不難,定時中斷就行了。
⑻ 用單片機控制蜂鳴器放音樂
看起來數組應該是音樂數據,其中包括四種數據,就是休止符(每個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函數的具體定義才行。
⑼ 使用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;
}
}
}
⑽ 能提供幾首單片機的歌曲代碼用蜂鳴器唱的
#include <reg52.h>
#include <intrins.h>
//本例採用89C52, 晶振為11.0592MHZ
//關於如何編制音樂代碼, 其實十分簡單,各位可以看以下代碼.
//頻率常數即音樂術語中的音調,而節拍常數即音樂術語中的多少拍;
//所以拿出譜子, 試探編吧!
sbit out=P2^3;
unsigned char n=0; //n為節拍常數變數
unsigned char code music_tab[] ={
0x18, 0x30, 0x1C , 0x10, //格式為: 頻率常數, 節拍常數, 頻率常數, 節拍常數,
0x20, 0x40, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x10,
0x1C, 0x10, 0x18 , 0x40,
0x1C, 0x20, 0x20 , 0x20,
0x1C, 0x20, 0x18 , 0x20,
0x20, 0x80, 0xFF , 0x20,
0x30, 0x1C, 0x10 , 0x18,
0x20, 0x15, 0x20 , 0x1C,
0x20, 0x20, 0x20 , 0x26,
0x40, 0x20, 0x20 , 0x2B,
0x20, 0x26, 0x20 , 0x20,
0x20, 0x30, 0x80 , 0xFF,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x80,
0x20, 0x30, 0x1C , 0x10,
0x20, 0x10, 0x1C , 0x10,
0x20, 0x20, 0x26 , 0x20,
0x2B, 0x20, 0x30 , 0x20,
0x2B, 0x40, 0x20 , 0x15,
0x1F, 0x05, 0x20 , 0x10,
0x1C, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x30,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x40, 0x1C , 0x20,
0x20, 0x20, 0x26 , 0x40,
0x13, 0x60, 0x18 , 0x20,
0x15, 0x40, 0x13 , 0x40,
0x18, 0x80, 0x00
};
void int0() interrupt 1 //採用中斷0 控制節拍
{ TH0=0xd8;
TL0=0xef;
n--;
}
void delay (unsigned char m) //控制頻率延時
{
unsigned i=3*m;
while(--i);
}
void delayms(unsigned char a) //豪秒延時子程序
{
while(--a); //採用while(--a) 不要採用while(a--); 各位可編譯一下看看匯編結果就知道了!
}
void main()
{ unsigned char p,m; //m為頻率常數變數
unsigned char i=0;
TMOD&=0x0f;
TMOD|=0x01;
TH0=0xd8;TL0=0xef;
IE=0x82;
play:
while(1)
{
a: p=music_tab[i];
if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到結束符,延時1秒,回到開始再來一遍
else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延時100ms,繼續取下一音符
else {m=music_tab[i++], n=music_tab[i++];} //取頻率常數 和 節拍常數
TR0=1; //開定時器1
while(n!=0) out=~out,delay(m); //等待節拍完成, 通過P1口輸出音頻(可多聲道哦!)
TR0=0; //關定時器1
}
}