
;程序名: MCS51U实验板配套程序-歌曲:兰花草 ;电路介绍:蜂鸣器接P20;实验前要连接J12 ; OUT BIT P20 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
/
成都理工大学工程技术学院通信工程--漆洋
本程序用于播放音乐,采用定时器1控制时间
从而改变频率实现音节播放
/
#include<AT89X52H>
#define uchar unsigned char
#define uint unsigned int
#define buz P3_1
code uint ton[][7]= //定音所有音阶
{
{0xE600,0xE8D5,0xEB5E,0xEC86,0xEEA7,0xF08B,0xF23C},
{0xF2E6,0xF46D,0xF5BF,0xF61C,0xF750,0xF866,0xF905},
{0xf91E,0xf9DE,0xFA89,0xfaD8,0xfb68,0xfbe8,0xfc5a}, //中音C
{0xFC8F,0xFCEF,0xFD51,0xFD80,0xFDB5,0xFDF4,0xFE2D},
{0xFE47,0xFE77,0xFEA2,0xFEB6,0xFEDA,0xFEF3,0xFF17},
{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,321,0,
331,332,351,331,321,331,321,311,262,251,261,0,
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,321,0,
331,331,351,331,331,351,351,361,362,352,362,0,
262,261,252,261,312,321,331,321,311,321,332,0,
332,361,361,352,331,321,312,321,333,0,
312,261,261,321,262,331,351,331,321,312,0,
262,311,321,332,321,311,261,251,263,0,
8
};
code uint m2[]=
{ //《爱情买卖》
262,261,231,221,232,0,
222,231,221,211,222,0,
252,251,251,231,251,251,251,231,262,231,231,221,232,0,
262,261,231,221,231,0,
221,231,221,211,221,0,
251,251,251,231,251,251,251,231,271,251,251,231,251,0,
231,261,311,311,232,261,311,0,
271,261,271,261,221,231,0,
222,221,221,161,221,231,251,231,271,271,251,232,0,
232,261,311,311,231,261,311,0,
331,321,331,321,311,321,0,
331,331,321,311,321,321,311,271,251,231,251,261,263,0,
8
};
code uint m3[]=
{
//《北京爱情故事》滴答滴答
252,262,311,322,331,312,331,323,0,
322,322,321,0,321,311,311,0,262,263,0,
252,261,312,322,332,351,332,323,0,
322,321,322,321,311,312,261,331,333,0,
362,361,362,361,351,351,331,323,0,
321,321,322,321,312,311,352,351,332,0,
362,361,362,411,332,321,332,321,0,
321,321,321,321,311,261,261,311,313,0,
8
};
code uint m4[]=
{ //《同桌的你》
252,251,251,251,231,241,251,272,0,
262,261,261,261,241,262,252,0,
252,251,251,251,271,261,251,241,0,
241,241,241,241,241,231,221,212,0,
252,251,251,251,231,241,251,272,0,
262,261,261,261,241,262,252,0,
252,251,251,251,271,261,251,241,0,
241,241,241,241,241,231,221,212,0,
311,311,311,312,251,261,311,311,332,0,
322,321,321,321,311,271,262,0,
272,271,271,271,311,321,252,0,
271,271,311,321,311,271,313,0,
311,311,311,312,251,261,311,311,332,0,
322,321,321,321,311,271,262,0,
272,271,271,271,311,321,252,0,
271,271,311,321,311,271,313,0,
8
};
code uint m5[]=
{ //《荷塘月色》
211,212,161,152,161,211,211,221,233,0,
221,222,211,221,221,252,251,231,231,221,233,0,
211,212,161,152,252,231,221,231,221,212,0,
222,221,211,221,221,232,221,211,161,221,212,0,
211,212,161,152,161,211,211,221,233,0,
221,222,211,221,221,252,251,231,231,221,233,0,
211,212,161,152,252,231,221,231,221,212,0,
222,221,211,221,221,232,221,211,161,221,212,0,
231,252,251,252,251,261,251,231,221,212,0,
261,311,261,251,231,221,211,162,221,221,232,221,0,
231,252,251,252,251,261,251,231,221,212,0,
162,211,161,151,222,231,212,0,
8
};
code uint m6[]= //《猪八戒背媳妇》
{
262,331,351,332,261,312,0,
261,311,261,311,332,331,321,332,311,262,0,
332,351,361,361,361,331,352,0,
332,351,332,351,361,361,362,331,352,0,
352,261,352,261,331,331,312,0,
321,0,321,0,321,311,321,332,351,361,432,331,432,0,
331,431,331,431,331,331,313,0,
321,0,321,0,322,311,321,331,351,364,0,
8
};
void musicdelay(int q)
{
while(--q);
}
/音乐播放程序/
void musicplay(uint a)
{
uint b,i,j,k,l,m,p;
uchar KEY=0;
TMOD=0x11;
p=0;
buz=1;
while(1) //如果其它键,停止播放音乐
{
if(a[p]==8)break; //判断休止符,结束播放
if(a[p]!=8) //音频识别与转换
{
i=a[p]/100;
j=a[p]%100/10;
l=a[p]%10;
if(a[p]!=0){b=ton[i][j-1];}; //转换后存入变量b中
if(a[p]==0){b=0;};
p++;
}
k=(230414/(0xffff-b))l; //拍数
/播放当前音节/
if(b!=0) //判断为正常音符,播放
{
TH1=0;TL1=0;TR1=1;
for(m=0;m<k;m++)
{
TH1=((b&0xff00)>>8); //装定时器初值
TL1=(b&0x00ff);
while(TF1==0);
buz=~buz; //实现一次蜂鸣器震动
TF1=0;
}
TR1=0;
buz=1;
}
//
if(b==0) //判断为0(停顿),延时一节拍
{
buz=1;
for(m=0;m<80;m++)
{
musicdelay(300);};
}
}
}
void musicplayc(uchar i)
{
if(i==1){musicplay(m1);};
if(i==2){musicplay(m2);};
if(i==3){musicplay(m3);};
if(i==4){musicplay(m4);};
if(i==5){musicplay(m5);};
if(i==6){musicplay(m6);};
}
#include <windowsh>
#include <stdioh>
#include <stdlibh>
#include <stringh>
#include <conioh>
unsigned frequency[100];
char hight[100];
unsigned time[100];
unsigned rate;
void main()
{
void set(unsigned f[],char h[],unsigned t[],int r,int num);
void music(unsigned f[],unsigned t[],int num);
int flag=0;
FILE f1;
int i,n,menu;
char FileName[30];
while(1)
{ f1=NULL;
i=n=0;
printf("本程序采用编码的形式播放音乐。\n");
printf("\n用记事本编辑乐谱,然后通过输入文件名播放音乐\n");
printf("乐谱文件可以自创,也可以抄别人的\n");
printf("\n现在可以先输入数字再按回车播放音乐:\n");
printf("1 播放指定音乐music1\n");
printf("2 播放指定音乐music2\n");
printf("3 通过程序文件名播放音乐\n");
printf("4 退出\n");
while(1)
{
printf("menu=");scanf("%d",&menu);
if(menu==1)
{
strcpy(FileName,"music1txt");
break;
}
if(menu==2)
{
strcpy(FileName,"music2txt");
break;
}
if(menu==3)
{
scanf("%s",FileName);
break;
}
if(menu==4)
exit(0);
}
printf("\n该文件的音乐编码如下:\n");
if((f1=fopen(FileName,"r"))==NULL)
{
printf("不能打开文件!\n");
exit(1);
}
fscanf(f1,"%d",&rate);
while(!feof(f1)&&flag!=1)
{
fscanf(f1," %d%c%d",&frequency[i],&hight[i],&time[i]);
printf(" %d%c%d",frequency[i],hight[i],time[i]);
if(time[i]!=-1)
{
i++;n++;
}
else
flag=1;
}
printf("\n");
set(frequency,hight,time,rate,n);
music(frequency,time,n);
fclose(f1);
}
getch();
}
void set(unsigned f[],char h[],unsigned t[],int r,int num)
{
int i,k;
for(i=0;i<num;i++)
{
t[i]=t[i]r;
switch(h[i])
{
case 'H':k=4;break;
case 'M':k=2;break;
case 'L':k=1;
}
switch(f[i])
{
case 1: f[i]=262k; break;
case 2: f[i]=296k; break;
case 3: f[i]=330k; break;
case 4: f[i]=349k; break;
case 5: f[i]=392k; break;
case 6: f[i]=440k; break;
case 7: f[i]=494k; break;
}
}
}
void music(unsigned f[],unsigned t[],int num)
{
int i;
for(i=0;i<num;i++)
{
Beep(f[i],t[i]);
}
}
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include <reg52h> //包括一个52标准内核的头文件
char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
sbit BEEP=P1^7; //喇叭输出脚
sbit P10=P1^0;
sbit K1= P3^2;
sbit K2= P3^5;
sbit K3= P2^4;
sbit K4= P2^5;
uchar th0_f; //在中断中装载的T0的值高8位
uchar tl0_f; //在中断中装载的T0的值低8位
//T0的值,及输出频率对照表
uchar code freq[362]={
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
}
//
//音乐符号串解释函数
//入口:要解释的音乐符号串,输出的音调串,输出的时长串
changedata(uchar song,uchar diao,uchar jie)
{
uchar i,i1,j;
char gaodi; //高低+/-12音阶
uchar banyin;//有没有半个升音阶
uchar yinchang;//音长
uchar code jie7[8]={0,12,14,16,17,19,21,23}; //C调的7个值
diao=song;
for(i=0,i1=0;;)
{
gaodi=0; //高低=0
banyin=0;//半音=0
yinchang=4;//音长1拍
if(((song+i)=='|') || ((song+i)==' ')) i++;
//拍子间隔和一个空格过滤
switch((song+i))
{
case ',': gaodi=-12;i++;//低音
break;
case '`': gaodi=12;i++; //高音
break;
}
if((song+i)==0) //遇到0结束
{
(diao+i1)=0; //加入结束标志0
(jie+i1)=0;
return;
}
j=(song+i)-0x30; i++; //取出基准音
j=jie7[j]+gaodi; //加上高低音
yinc: switch((song+i))
{
case '#': //有半音j加一个音阶
i++;j++;
goto yinc;
case '-': //有一个音节加长
yinchang+=4;
i++;
goto yinc;
case '_': //有一个音节缩短
yinchang/=2;
i++;
goto yinc;
case '': //有一个加半拍
yinchang=yinchang+yinchang/2;
i++;
goto yinc;
}
(diao+i1)=j; //记录音符
(jie+i1)=yinchang; //记录音长
i1++;
}
}
//
//奏乐函数
//入口:要演奏的音乐符号串
void play(uchar songdata)
{
uchar i,c,j=0;
uint n;
uchar xdata diaodata[112]; //音调缓冲
uchar xdata jiedata[112]; //音长缓冲
changedata(songdata,diaodata,jiedata); //解释音乐符号串
TR0=1;
for(i=0;diaodata[i]!=0;i++) //逐个符号演奏
{
tl0_f=freq[diaodata[i]2]; //取出对应的定时值送给T0
th0_f=freq[diaodata[i]2+1];
for(c=0;c<jiedata[i];c++) //按照音长延时
{
for(n=0;n<32000;n++);
if((!K1)||(!K2)||(!K3)||(!K4))//发现按键,立即退出播放
{
TR0=0;
return;
}
}
TR0=0;
for(n=0;n<500;n++); //音符间延时
TR0=1;
}
TR0=0;
}
//仙剑
uchar code xianjian[]={
"|3_3_3_2_3-|2_3_2_2_,6,6_,7_|12_1_,7,6_,5_|,6---|"
"3_3_3_2_36_|5_6_5_5_22_3_|45_4_32_1_|3--3_|"
"67_6_55_3_|5--3_5_|26_5_32_3_|3---|"
"26_6_6-|16_6_66_7_|`17_6_76_7_|3--3_|"
"67_6_55_3_|5--3_5_|67_6_76_7_|3---|"
"26_6_6-|16_6_66_7_|`17_6_75_|6---|"
};
uchar code song3[]={
"5-5_3_2_1_|3---|6-6_4_2_1_"
",7--,5_|13_51_|,73_5 5_|"
"67_`16_|6_5_5-3_2_|11_13_2_|"
"11_12_3_|21_,62_3_|2-- ,5_|"
"13_51_|,73_55_|67_`16_|"
"6_5_5-3_2_|11_13_2_|11_12_3_"
"2,6_,71_2_|1--"
};
//世上只有妈妈好
uchar code mamahao[]={
"65_35|`16_5_6-|35_6_53_2_|1_,6_5_3_2-|"
"23_55_6_|321-|53_2_1_,6_1_|,5--"
};
//三个按键选择三首不同的音乐播放,一个键停止播放
void main(void) // 主程序
{
TMOD = 0x01; //使用定时器0的16位工作模式
TR0 = 0;
ET0 = 1; //定时器0中断
EA = 1; //打开总中断
while(1)
{
if(!K1)
{
while(!K1);
play(xianjian); //播放音乐
}
if(!K2)
{
while(!K2);
play(song3); //播放音乐
}
if(!K3)
{
while(!K3);
play(mamahao); //播放音乐
}
}
}
以上就是关于单片机蜂鸣器c语言《兰花草》音乐代码全部的内容,包括:单片机蜂鸣器c语言《兰花草》音乐代码、跪求单片机51_C语言音乐程序,音乐是国际歌!谢谢!、c语言写音乐,我要一个准确的源代码,谢谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)