📄 51音乐.c
字号:
/*6Mhz晶振工作*/
#include <at89x51.h>
#define uint unsigned int
#define uchar unsigned char
sbit BUZZER=P1^6; //声音输出接口,可自定义
uint m,i,rti,l;
/**************************************************************/
//在6M频率下的高低音音频率表,toneh为高字节,toneh1为低字节
//此段不需要更改。
/*************************************************************/
uchar code toneh[14]={0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
uchar code toneh1[14]={0x22,0x56,0x85,0x9a,0xc1,0xe3,0x03,0x10,0x2b,0x42,0x4c,0x60,0x71,0x81};
/************************************************************
以下为用户自定义内容。
song[]为用户想要的音乐乐谱,1~7为高音。a~g为低音
length[]为音长,就是每一个音节放音的长度。
************************************************************/
uchar code song[]="123112313455345556543256543215111511abcaabcacdeecdeeefedcbefedcbaeaaaeaa"; //音谱,把你喜欢的乐谱加入就可
uchar code length[]="444444444444444422224422224422224444444444444444444422224422224422224444"; //音长 ;
void timer0(void)interrupt 1 //音谱定时器
{
BUZZER=!BUZZER; //音频输出
TH0=toneh[rti];
TL0=toneh1[rti];
}
void timerl(void)interrupt 3 //音长定时器
{
TH1=0x0c;
TL1=0xdc; //音长定时值。125毫秒
m++; //音长计数器
}
playc(char ch)
{
int ti;
switch(ch)
{
case'a': ti=0;break;
case'b': ti=1;break;
case'c': ti=2;break;
case'd': ti=3;break;
case'e': ti=4;break;
case'f': ti=5;break;
case'g': ti=6;break;
case'1': ti=7;break;
case'2': ti=8;break;
case'3': ti=9;break;
case'4': ti=10;break;
case'5': ti=11;break;
case'6': ti=12;break;
case'7': ti=13;break;
default:ti=50;break;
}
return(ti);
}
void main()
{
m=0;
TMOD=0X11;
BUZZER=0;
TH0=toneh[0];
TL0=toneh1[0];
TH1=0x0c; //音长定时器125ms中断
TL1=0xdc;
IP=0x08; //定时器1中断优先高
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
i=0;
while(1)
{
if(song[i]=='\0') //是否放音到结尾
i=0;
rti=playc(song[i]); //把音谱加入寄存器并送入定时器0。
l=length[i]-0x30; //把音长加入寄存器
while(m<l); //等待音长结束
m=0; //音长清归零
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -