㈠ 谁能给我几首51单片机流行歌曲 的源代码!
<!--[if !supportLists]-->2. <!--[endif]-->程序代码:(以下代码奏出八月桂花香这首曲子) ORG 0000H LJMP START ORG 000BH INC 20H ;中断服务,中断计数器加1 MOV TH0, #0DBH MOV TL0, #0FFH ;11.0592M晶振,形成10毫秒中断 RETISTART: MOV SP, #50H MOV TH0, #0DBH MOV TL0, #0FFH MOV TMOD, #01H MOV IE, #82HMUSIC0: NOP MOV DPTR, #DAT ;表头地址送DPTR MOV 20H, #00H ;中断计数器清0MUSIC1: NOP CLR A ;A清零 MOVC A, @A+DPTR ;查表取代码 JZ END0 ;是00H,则结束 CJNE A, #0FFH, MUSIC5 ;如果不是休止符,往下执行,;以R6作为音符频率控制,唱R7节拍那么久。 LJMP MUSIC3MUSIC5: NOP MOV R6, A ;R6=18H音符的频率 INC DPTR ;DPTR加1 MOV A, #0 MOVC A, @A+DPTR ;取节拍代码送R7 MOV R7,A ;R7=30H音符发音的时间 SETB TR0 ;启动计数MUSIC2: NOP CPL P3.2 ;P3.2是音乐输出引脚 MOV A, R6 MOV R3, A ;R3=R6=18H LCALL DEL MOV A, R7 CJNE A, 20H, MUSIC2 ;中断计数器(20H)=R7否?;不等,则继续循环 MOV 20H, #00H ;等于,则取下一代码 INC DPTR LJMP MUSIC1MUSIC3: NOP ;休止100毫秒 CLR TR0 MOV R2, #0DH ;R2=13MUSIC4: NOP MOV R3, #0FFH ;R3=255 LCALL DEL DJNZ R2, MUSIC4 INC DPTR LJMP MUSIC1END0: NOP MOV R2, #0FFH ;歌曲结束,延时1秒后继续MUSIC6: MOV R3, #00H LCALL DEL DJNZ R2, MUSIC6 LJMP MUSIC0DEL: NOPDEL3: MOV R4, #02H DEL4: NOP DJNZ R4, DEL4 NOP DJNZ R3, DEL3 RET NOPDAT:DB 18H, 30H, 1CH, 10H, 20H, 40H, 1CH, 10HDB 18H, 10H, 20H, 10H, 1CH, 10H, 18H, 40HDB 1CH, 20H, 20H, 20H, 1CH, 20H, 18H, 20HDB 20H, 80H, 0FFH, 20H,30H, 1CH, 10H, 18HDB 20H, 15H, 20H, 1CH, 20H, 20H, 20H, 26HDB 40H, 20H, 20H, 2BH, 20H, 26H, 20H, 20HDB 20H, 30H, 80H, 0FFH,20H, 20H, 1CH, 10HDB 18H, 10H, 20H, 20H, 26H, 20H, 2BH, 20HDB 30H, 20H, 2BH, 40H, 20H, 20H, 1CH, 10HDB 18H, 10H, 20H, 20H, 26H, 20H, 2BH, 20HDB 30H, 20H, 2BH, 40H, 20H, 30H, 1CH, 10HDB 18H, 20H, 15H, 20H, 1CH, 20H, 20H, 20HDB 26H, 40H, 20H, 20H, 2BH, 20H, 26H, 20HDB 20H, 20H, 30H, 80H, 20H, 30H, 1CH, 10HDB 20H, 10H, 1CH, 10H, 20H, 20H, 26H, 20HDB 2BH, 20H, 30H, 20H, 2BH, 40H, 20H, 15HDB 1FH, 05H, 20H, 10H, 1CH, 10H, 20H, 20HDB 26H, 20H, 2BH, 20H, 30H, 20H, 2BH, 40HDB 20H, 30H, 1CH, 10H, 18H, 20H, 15H, 20HDB 1CH, 20H, 20H, 20H, 26H, 40H, 20H, 20HDB 2BH, 20H, 26H, 20H, 20H, 20H, 30H, 30HDB 20H, 30H, 1CH, 10H, 18H, 40H, 1CH, 20HDB 20H, 20H, 26H, 40H, 13H, 60H, 18H, 20HDB 15H, 40H, 13H, 40H, 18H, 80H, 00HEND
㈡ 简单的单片机音乐程序
#include <REG52.H>
#include "SoundPlay.h"
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,
0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,
0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,
0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,
0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,
0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,
0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,
0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,
0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,
0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,
0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,
0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,
0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,
0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,
0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,
0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,
0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,
0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,
0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,
0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,
0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,
0x10,0x03, 0x15,0x00, 0x00,0x00 };
//***********************************************************************************
main()
{
InitialSound();
while(1)
{
Play(Music_Girl,0,3,360);
Delay1ms(500);
Play(Music_Same,0,3,360);
Delay1ms(500);
Play(Music_Two,0,3,360);
Delay1ms(500);
}
}
/**************************************************************************
SOUND PLAY FOR 51MCU
COPYRIGHT (c) 2005 BY JJJ.
-- ALL RIGHTS RESERVED --
File Name: SoundPlay.h
Author: Jiang Jian Jun
Created: 2005/5/16
Modified: NO
Revision: 1.0
*******************************************************************************/
/*说明**************************************************************************
曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末尾:0,0 表示结束(Important)
音高由三位数字组成:
个位是表示 1~7 这七个音符
十位是表示音符所在的音区:1-低音,2-中音,3-高音;
百位表示这个音符是否要升半音: 0-不升,1-升半音。
音长最多由三位数字组成:
个位表示音符的时值,其对应关系是:
|数值(n): |0 |1 |2 |3 | 4 | 5 | 6
|几分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n
十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音
百位是符点位: 0-无符点,1-有符点
调用演奏子程序的格式
Play(乐曲名,调号,升降八度,演奏速度);
|乐曲名 : 要播放的乐曲指针,结尾以(0,0)结束;
|调号(0-11) : 是指乐曲升多少个半音演奏;
|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;
|演奏速度(1-12000): 值越大速度越快;
***************************************************************************/
#ifndef __SOUNDPLAY_H_REVISION_FIRST__
#define __SOUNDPLAY_H_REVISION_FIRST__
//**************************************************************************
#define SYSTEM_OSC 12000000 //定义晶振频率12000000HZ
#define SOUND_SPACE 4/5 //定义普通音符演奏的长度分率,//每4分音符间隔
sbit BeepIO = P3^7; //定义输出管脚
unsigned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表
unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在频率表中的位置
unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };
unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存
unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存
//**************************************************************************
void InitialSound(void)
{
BeepIO = 0;
Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 计算TL1应装入的初值 (10ms的初装值)
Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 计算TH1应装入的初值
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TMOD |= 0x11;
ET0 = 1;
ET1 = 0;
TR0 = 0;
TR1 = 0;
EA = 1;
}
void BeepTimer0(void) interrupt 1 //音符发生中断
{
BeepIO = !BeepIO;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0;
}
//**************************************************************************
void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
{
unsigned int NewFreTab[12]; //新的频率表
unsigned char i,j;
unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;
for(i=0;i<12;i++) // 根据调号及升降八度来生成新的频率表
{
j = i + Signature;
if(j > 11)
{
j = j-12;
NewFreTab[i] = FreTab[j]*2;
}
else
NewFreTab[i] = FreTab[j];
if(Octachord == 1)
NewFreTab[i]>>=2;
else if(Octachord == 3)
NewFreTab[i]<<=2;
}
SoundLength = 0;
while(Sound[SoundLength] != 0x00) //计算歌曲长度
{
SoundLength+=2;
}
Point = 0;
Tone = Sound[Point];
Length = Sound[Point+1]; // 读出第一个音符和它时时值
LDiv0 = 12000/Speed; // 算出1分音符的长度(几个10ms)
LDiv4 = LDiv0/4; // 算出4分音符的长度
LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准
TR0 = 0;
TR1 = 1;
while(Point < SoundLength)
{
SL=Tone%10; //计算出音符
SM=Tone/10%10; //计算出高低音
SH=Tone/100; //计算出是否升半
CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率
if(SL!=0)
{
if (SM==1) CurrentFre >>= 2; //低音
if (SM==3) CurrentFre <<= 2; //高音
Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值
Sound_Temp_TH0 = Temp_T/256;
Sound_Temp_TL0 = Temp_T%256;
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿
}
SLen=LengthTab[Length%10]; //算出是几分音符
XG=Length/10%10; //算出音符类型(0普通1连音2顿音)
FD=Length/100;
LDiv=LDiv0/SLen; //算出连音音符演奏的长度(多少个10ms)
if (FD==1)
LDiv=LDiv+LDiv/2;
if(XG!=1)
if(XG==0) //算出普通音符的演奏长度
if (SLen<=4)
LDiv1=LDiv-LDiv4;
else
LDiv1=LDiv*SOUND_SPACE;
else
LDiv1=LDiv/2; //算出顿音的演奏长度
else
LDiv1=LDiv;
if(SL==0) LDiv1=0;
LDiv2=LDiv-LDiv1; //算出不发音的长度
if (SL!=0)
{
TR0=1;
for(i=LDiv1;i>0;i--) //发规定长度的音
{
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
}
if(LDiv2!=0)
{
TR0=0; BeepIO=0;
for(i=LDiv2;i>0;i--) //音符间的间隔
{
while(TF1==0);
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TF1=0;
}
}
Point+=2;
Tone=Sound[Point];
Length=Sound[Point+1];
}
BeepIO = 0;
}
//**************************************************************************
#endif
㈢ 求几首单片机经典歌曲乐谱,及蜂鸣器驱动原理和 C语言程序。
建议用小喇叭,效果比蜂鸣器好很多,驱动就是正负极啊,一接就好了,当时做这个不是难点。C语言程序网上可以搜到的,这里歌曲乐谱都是一些数组组成,你换歌相当于换数组里的数,所以意思就是程序模板是不变的。定时器可能会用到,你说的中断切换歌曲也是可以实现的。
㈣ 利用单片机播放音乐存放几首歌
利用单片机播放音乐存放三首歌。可以播放储存的三首歌曲,分别为《挥着翅膀的女孩》、《同一首歌》、《两只蝴蝶》,其他歌曲可以通过参考资料中的软件编码后写入单片机中,按键共有两个,一个是复位按键,按下后直接从第一首歌开始播放。另一个是暂停键,按下后暂停,指示灯点亮。
㈤ 单片机 音乐程序编写 歌曲《小星星》
只有音乐发声汇编程序,没有加入LED灯,供参考。数据代码已改为小星星发声
;**********************************************
ORG
0000H
SJMP
MAIN
ORG
0BH
AJMP
TIME0
;*************主程序************************
MAIN:
MOV
SP,#60
MOV
TMOD,#01H
;T0定时工作方式
MOV
IE,#82H
;CPU
中断允许,T0中断允许
START0:
MOV
30H,#00H
;TABLE
相对地址指针
NEXT:
MOV
A,30H
MOV
DPTR,#TABLE
;到TABLE处取
简谱码
节拍
码
MOVC
A,@A+DPTR
MOV
R2,A
;取到的简谱码
节拍码
暂存于R2中
JZ
ENDF
;取到
00
结束
ANL
A,#0FH
;否,取低四位
节拍
码
MOV
R5,A
;将节拍码存于R5中
MOV
A,R2
;简谱码
节拍
码
给A
SWAP
A
;高4位
与
低4位
交换
ANL
A,#0FH
;取简谱
码
JNZ
SING
;取到的简谱
码不是0,则去发声
CLR
TR0
;取到0
则不发声
SJMP
DLY1
;节拍延时子程序(
随节拍码变化,延时时间不同)
;---------------发声-----------------------
SING:
DEC
A
;取到的简谱码减1
;(简谱码计数值16位数据存储首地址从TABLE1
《相对地址》0处开始放起,所以要减1)
MOV
22H,A
;存入(22H)中
RL
A
;乘2
因为取的数据占两字节(16位)
;所以指针增加量要乘2
MOV
DPTR,#TABLE1
;...........简谱码转换为相应定时器16位计数值.............
MOVC
A,@A+DPTR
;到TABLE1取相应的高字节计数值
MOV
TH0,A
;高字节计数值存入TH0和(21H)中
MOV
21H,A
MOV
A,22H
;减1的简谱码给A
RL
A
;乘2
因为取的数据占两字节(16位)
;所以指针增加量要乘2
INC
A
;A
增加
取下一个字节计数值
;...........简谱码转换为相应定时器16位计数值.............
MOVC
A,@A+DPTR
;到TABLE1取相应的低字节计数值
MOV
TL0,A
;低字节计数值存入TL0和(20H)中
MOV
20H,A
SETB
TR0
;启动T0定时器让喇叭发出不同频率声音
;---------------节拍延时-------------------
DLY1:
ACALL
DELAY
;基本单位时间为1/4拍
187ms
INC
30H
;取下一个简谱码
节拍
码
SJMP
NEXT
;---------------歌放完结束---------------
ENDF:
CLR
TR0
;关闭T0定时器
AJMP
START0
;反复循环
;****T0中断子程序(用来驱动喇叭发出不同频率声音)**************
TIME0:
PUSH
ACC
PUSH
PSW
MOV
TL0,20H
;重装计数值
MOV
TH0,21H
CPL
P3.7
;驱动发声
POP
PSW
POP
ACC
RETI
;******************节拍延时187ms****************************
DELAY:
MOV
R7,#187
;187ms延时子程序
DLY2:
MOV
R4,#02
DLY3:
MOV
R3,#248
DJNZ
R3,$
DJNZ
R4,DLY3
DJNZ
R7,DLY2
DJNZ
R5,DELAY
RET
;*******音符T值表(用来让定时器发出不同的频率)**DW
表示一个
计数值
占两个字节存储单元***************
TABLE1:
DW
64260,64400,64524,64580,64684
;低音SO
低音LA
低音SI
/中音DO
中音RE
DW
64777,64820,64898,64968,65030
;中音MI
中音FA
中音SO
中音LA
中音SI
DW
65058,65110,65157,65178,65217
;高音DO
高音RE
高音MI
高音FA
高音SO
;*********简谱码
节拍码(高4位简谱码
,低4位节拍码)*************
TABLE:
DB
44H,44H,84H,84H
;
1
1
5
5
DB
094H,094H,88h
;
6
6
5
-
DB
74H,74H,63H,63H;
4
4
3
3
DB
52H,52H,48h
;
2
2
1-
DB
84H,84H,74H,74H
;
5
5
4
4
DB
64H,64H,58h;
3
3
2-
DB
84H,84H,74H,74H
;
5
5
4
4
DB
64H,64H,58h
;
3
3
2-
DB
44H,44H,84H,84H
;
1
1
5
5
DB
094H,094H,88h;
6
6
5
-
DB
74H,74H,63H,63H;
4
4
3
3
DB
52H,52H,48h;
2
2
1-
END
加入了LED灯,水平有限,效果有点不太好
;**********************************************
ORG
0000H
SJMP
MAIN
ORG
0BH
AJMP
TIME0
;*************主程序************************
MAIN:
MOV
SP,#60
MOV
TMOD,#01H
;TO定时工作方式
MOV
IE,#82H
;CPU
中断允许,TO中断允许
START0:
MOV
30H,#00H
;TABLE
相对地址指针
NEXT:
MOV
A,30H
MOV
DPTR,#TABLE
;到TABLE处取
简谱码
节拍
码
MOVC
A,@A+DPTR
MOV
R2,A
;取到的简谱码
节拍码
暂存于R2中
JZ
ENDF
;取到
00
结束
ANL
A,#0FH
;否,取低四位
节拍
码
MOV
R5,A
;将节拍码存于R5中
MOV
A,R2
;简谱码
节拍
码
给A
SWAP
A
;高4位
与
低4位
交换
ANL
A,#0FH
;取简谱
码
JNZ
SING
;取到的简谱
码不是0,则去发声
CLR
TR0
;取到0
则不发声
SJMP
DLY1
;节拍延时子程序(
随节拍码变化,延时时间不同)
;---------------发声-----------------------
SING:
DEC
A
;取到的简谱码减1
;(简谱码计数值16位数据存储首地址从TABLE1
《相对地址》0处开始放起,所以要减1)
MOV
22H,A
;存入(22H)中
RL
A
;乘2
因为取的数据占两字节(16位)
;所以指针增加量要乘2
MOV
DPTR,#TABLE1
;...........简谱码转换为相应定时器16位计数值.............
MOVC
A,@A+DPTR
;到TABLE1取相应的高字节计数值
MOV
TH0,A
;高字节计数值存入TH0和(21H)中
MOV
21H,A
MOV
A,22H
;减1的简谱码给A
RL
A
;乘2
因为取的数据占两字节(16位)
;所以指针增加量要乘2
INC
A
;A
增加
取下一个字节计数值
;...........简谱码转换为相应定时器16位计数值.............
MOVC
A,@A+DPTR
;到TABLE1取相应的低字节计数值
MOV
TL0,A
;低字节计数值存入TL0和(20H)中
MOV
20H,A
SETB
TR0
;启动T0定时器让喇叭发出不同频率声音
;---------------节拍延时-------------------
DLY1:
ACALL
DELAY
;基本单位时间为1/4拍
187ms
INC
30H
;取下一个简谱码
节拍
码
CPL
P1.0
LED灯
闪烁
CPL
P1.1
CPL
P1.2
CPL
P1.3
CPL
P1.4
CPL
P1.5
CPL
P1.6
CPL
P1.7
SJMP
NEXT
;---------------歌放完结束---------------
ENDF:
CLR
TR0
;关闭T0定时器
AJMP
START0
;反复循环
;****T0中断子程序(用来驱动喇叭发出不同频率声音)**************
TIME0:
PUSH
ACC
PUSH
PSW
MOV
TL0,20H
;重装计数值
MOV
TH0,21H
CPL
P3.7
;驱动发声
POP
PSW
POP
ACC
RETI
;******************节拍延时187ms****************************
DELAY:
MOV
R7,#187
;187ms延时子程序
DLY2:
MOV
R4,#02
DLY3:
MOV
R3,#248
DJNZ
R3,$
DJNZ
R4,DLY3
DJNZ
R7,DLY2
DJNZ
R5,DELAY
RET
;*******音符T值表(用来让定时器发出不同的频率)**DW
表示一个
计数值
占两个字节存储单元***************
TABLE1:
DW
64260,64400,64524,64580,64684
;低音SO
低音LA
低音SI
/中音DO
中音RE
DW
64777,64820,64898,64968,65030
;中音MI
中音FA
中音SO
中音LA
中音SI
DW
65058,65110,65157,65178,65217
;高音DO
高音RE
高音MI
高音FA
高音SO
;*********简谱码
节拍码(高位简谱码
,低位节拍码)*************
TABLE:
DB
44H,44H,84H,84H
;
1
1
5
5
DB
094H,094H,88h
;
6
6
5
--表示有节拍
DB
74H,74H,63H,63H
;
4
4
3
3
DB
52H,52H,48h
;
2
2
1-
DB
84H,84H,74H,74H
;
5
5
4
4
DB
64H,64H,58h
;
3
3
2-
DB
84H,84H,74H,74H
;
5
5
4
4
DB
64H,64H,58h
;
3
3
2-
DB
44H,44H,84H,84H
;
1
1
5
5
DB
094H,094H,88h
;
6
6
5
-
DB
74H,74H,63H,63H
;
4
4
3
3
DB
52H,52H,48h
;
2
2
1-
END
㈥ 编写单片机音乐。
就用单片机和蜂鸣器应该就可以。你控制蜂鸣器的频率改变,这样蜂鸣器发声的“音调”就会不一样,然后再自己慢慢调那些频率,就可以构成一个单片机控制的音乐了。
至于音乐里面的12345671怎么发声,请参考以下资料(采用51单片机):
为了输出准确的音阶频率,我们需要用定时器输出来控制蜂鸣器的驱动,这里用的 T0。
我们再每一次定时器中断溢出时取反 P17 引脚,以形成频率驱动蜂鸣器,定时器 0 工
作在 16 位方式,需要在中断里重新置入初始值。这个值就决定了 P17输出的频率。我们在
程序里先做好了一张表,预先写好了每个音阶的频率需要设置的初始值。到时调入对应的值
进去 T0,不断溢出时就 P17 可以输出对应的频率。
在这个程序里,我们自动地输出 8 个音符,每个音符保持 1 秒钟左右。
―――――――――――――――――――――――
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h> //包括一个 52 标准内核的头文件
char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
sbit BEEP=P1^7; //喇叭输出脚
uchar th0_f; //在中断中装载的 T0 的值高 8 位
uchar tl0_f; //在中断中装载的 T0 的值低 8 位
//T0 的值,及输出频率对照表
uchar code freq[36*2]={
0xA9,0xEF,//00220HZ ,1 //0
0x93,0xF0,//00233HZ ,1#
0x73,0xF1,//00247HZ ,2
0x49,0xF2,//00262HZ ,2#
0x07,0xF3,//00277HZ ,3
0xC8,0xF3,//00294HZ ,4
0x73,0xF4,//00311HZ ,4#
0x1E,0xF5,//00330HZ ,5
0xB6,0xF5,//00349HZ ,5#
0x4C,0xF6,//00370HZ ,6
0xD7,0xF6,//00392HZ ,6#
0x5A,0xF7,//00415HZ ,7
0xD8,0xF7,//00440HZ 1 //12
0x4D,0xF8,//00466HZ 1# //13
0xBD,0xF8,//00494HZ 2 //14
0x24,0xF9,//00523HZ 2# //15
0x87,0xF9,//00554HZ 3 //16
0xE4,0xF9,//00587HZ 4 //17
0x3D,0xFA,//00622HZ 4# //18
0x90,0xFA,//00659HZ 5 //19
0xDE,0xFA,//00698HZ 5# //20
0x29,0xFB,//00740HZ 6 //21
0x6F,0xFB,//00784HZ 6# //22
0xB1,0xFB,//00831HZ 7 //23
0xEF,0xFB,//00880HZ `1
0x2A,0xFC,//00932HZ `1#
0x62,0xFC,//00988HZ `2
0x95,0xFC,//01046HZ `2#
0xC7,0xFC,//01109HZ `3
0xF6,0xFC,//01175HZ `4
0x22,0xFD,//01244HZ `4#
0x4B,0xFD,//01318HZ `5
0x73,0xFD,//01397HZ `5#
0x98,0xFD,//01480HZ `6
0xBB,0xFD,//01568HZ `6#
0xDC,0xFD,//01661HZ `7 //35
};
//定时中断 0,用于产生唱歌频率
timer0() interrupt 1
{
TL0=tl0_f;TH0=th0_f; //调入预定时值
BEEP=~BEEP; //取反音乐输出 IO
P2=~P2;
}
//音阶声音自动输出试验
void main(void) // 主程序
{
ulong n;
uchar i;
uchar code jie8[8]={12,14,16,17,19,21,23,24};//1234567`1 八个音符在频率表中的位置
TMOD = 0x01; //使用定时器 0 的 16 位工作模式
TR0 = 1;
ET0 = 1;
EA = 1;
while(1)
{
for(i=0;i<8;i++) //循环播放 8 个音符
{
tl0_f=freq[jie8[i]*2]; //置一个音符的值
th0_f=freq[jie8[i]*2+1];
for(n=0;n<50000;n++); //延时 1 秒左右
}
}
}
―――――――――――――――――――――――――――――――
请编译,运行。可以听到 8 个音符不断循环输出。
㈦ 能提供几首单片机的歌曲代码用蜂鸣器唱的
#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
}
}
㈧ 用单片机播放音乐
作为单片机的重要硬件资源之一,利用定时器可以产生各种固定频率的方波信号,也可以产生包括“Do”、“Re”、“Me”——等音阶在内的各种频率声音。将各个音阶连接在一起,便可组成一支曲子或是演奏一段旋律。基于这个思想,笔者设计了一款特殊的“音乐播放器”,其核心器件采用AT89C2051单片机。本播放器具有电路简单,功能强大等特点。极为适合初学者仿制。 一、功能特色 本播放器可实现循环播放、上一曲、下一曲、复位等功能。为了体现乐曲播放过程中的动态效果,在P1口增加了8只LED,作随机闪烁以指示旋律的节奏。 二、硬件设计 电路以AT89C2051为主控制器,S1为复位键,S2、S3分别为上一曲、下一曲选择键。晶振采用12MHz,音乐信号由P3.7口输出,经9012放大后推动喇叭发声(电路图见附图)。 三、软件设计 程序中根音选取的是C调三个8度内的音符,共21个音。每个音符对应频率由定时器T0产生(音符频率及对应计数初值见附表)。为了程序调用方便,每个音符都对应一个编码。占用一个字节。在程序中以查表的方式加载计数初值。当值为00H时表示空拍,与节拍码配合完成节拍发音。节拍码也占一个字节,其总时间长度等于基本时间乘以节拍码的值。节拍码值为01H时,表示当前乐曲结束,为00H时,表示全部乐曲结束。为了编码简单,一般节拍码高半字节表示整拍,低半字节表示分数,只要基本延时设定恰当即可,为了及时响应键盘操作。键扫描指令安排在基本延时时间子程序中。按键每按下一次,乐曲数目计数器R5加“1”或减“1”,然后根据R5的内容转向不同的乐曲。 本程序包含4首乐曲,若要增加更多的乐曲,在存储空间许可的情况下(可直接换用4k的AT89C4051),只要参照所附的编码表将简谱转化为相应的代码附着在乐曲数据表中即可。
㈨ 急求 单片机音乐 一生有你
TAB_L0: DB 32,16,16,32,16,16,32,16,16,24,8,64 ;《DINGO BELL 》
DB 16,16,32,16,16,32,16,16,16,16,64
DB 16,16,32,16,16,32,16,16,24,8,64
DB 16,16,32,16,16,32,16,16,16,16,32,32
TAB_L1: DB 32,32,32,32,32,32,32,32,32,32,32,32,32,48,16,64 ;欢乐颂
DB 32,32,32,32,32,32,32,32,32,32,32,32,48,16,64
DB 32,32,32,32,32,16,16,32,32,32,16,16,32,32,32,32,32,64
DB 32,32,32,32,32,32,32,32,32,32,32,32,16,16,64
TAB_L2: DB 32,32,16,16,16,16,32,32,32,32,16,16,16,16,32,32,32 ;小步舞曲
DB 32,16,16,16,16,32,16,16,16,16,32,16,16,16,16,32,64,32
DB 32,16,16,16,16,32,32,32,32,16,16,16,16,32,32,32
DB 32,16,16,16,16,32,16,16,16,16,32,16,16,16,16,64,32,32
TAB_L3: DB 32,16,16,32,16,16,32,16,16,16,16,16,16,32 ;小蜜蜂
DB 16,16,32,16,16,32,16,16,16,16,64
DB 16,16,16,16,16,16,32,16,16,16,16,16,16,32
DB 16,16,32,16,16,32,16,16,16,16,32
TAB_L4: DB 32,16,16,32,32,32,64,16,16,32,32,32,64 ;生日快乐
DB 16,16,32,32,32,32,64,16,16,32,32,32,64
TAB_L5: DB 32,32,16,16,64,32,32,64,32,16,16,32,16,16,96+32 ;送别
DB 32,16,16,48,16,32,32,64,32,16,16,48,16,128
DB 32,32,64,32,16,16,64,16,16,16,16,16,16,16,16,96+32
DB 32,16,16,48,16,32,32,64,32,16,16,48,16,96,32
TAB_L6: DB 32,32,32,64,32,32,64,32,32,32,32,32,16,16,64 ;樱花
DB 32,32,32,32,32,16,16,64,32,32,32,32,32,16,16,64
DB 32,32,32,32,32,16,16,64,32,32,64,32,32,64,
DB 32,32,16,16,32,96
TAB_L7: DB 32,32,16,16,32,16,16,16,32,16,64,32,16,16,32,16,16,16,32,16,64 ;虹彩妹妹
DB 32,16,16,16,16,16,16,16,32,16,64,32,16,16,32,32,16,32,16,48
TAB_L8: DB 32,16,16,48,16, 16,16,16,32,16,16,16, 32,16,16,16,16,16,16, 128+32 ;童年
DB 16,16,32,16,16, 16,16,16,32,16,16,16, 32,16,16,16,16,16,16, 128
DB 16,16,16,32,16,16,16, 32,16,16,16,16,16,16, 32,16,16,16,16,16,16, 128
DB 16,32,16,32,32, 16,32,16,16,16,16,16, 16,32,16,16,16,16,16, 128
TAB_L9: DB 32,00H
TAB_L10: DB 32,00H
㈩ 单片机播放音乐的原理
单片机发音原理:利用定时器或PWM功能,输出PWM,经一级有源滤波后放大驱动扬声器。
单片机演奏音乐基本是单音频率,它不包含相应幅度的谐波频率,
也就是说不能象电子琴那样能奏出多种音色的声音,但一定要弄清楚两个概念即可,也就是“音调”和“节拍” 。音调 表示一个音符唱多高的频率。节拍 表示一个音符唱多长的时间
1.要生产音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间.利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
2. 利用8051的内部定时器使用其工作在计数器模式MODE1下,改变计数值THO及TLO以产生不同频率的方法。