📄 123.c
字号:
/*12Mhz晶振工作*/
#include <at89x51.h>
#define uint unsigned int
#define uchar unsigned char
sbit BUZZER=P2^4;
uint m,i,rti,l;
//在12M频率下的高低音音频率表,toneh为高字节,toneh1为低字节
uchar code toneh[15]={0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
uchar code toneh1[15]={0x22,0x56,0x85,0x9a,0xc1,0xe3,0x03,0x10,0x2b,0x42,0x4c,0x60,0x71,0x81,0xff};
/*******************************************************************************************
以下为用户自定义
song[]为音乐的音谱。1~7为高音。8为停音节,a~g为低音。
length[]为每个音谱的音第。如1/4节拍。1/2节拍 以下为一首名曲“茉莉花”
*****************************************************************555**************************/
uchar code song[]="335676556558335676556558555356655832353211211321322356755235231feef1223121fee8"; //音谱,把你喜欢的乐谱加入就可
uchar code length[]="422422442241422422442241444224444142242242244222244242244422222244444422222442"; //音长 ;
void timer0(void)interrupt 1
{
if(rti!=14)
{
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;
case'8': ti=14;break;
default:ti=50;break;
}
return(ti);
}
void main()
{
m=0;
TMOD=0X11;
P1_0=0;
TH0=toneh[0];
TL0=toneh1[0];
TH1=0x0c; //定时器1为125毫秒中断
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]); //把音谱加入寄存器
l=length[i]-0x30; //把音长力入寄存器
while(m<l); //等待音长结束
m=0; //音长清归零
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -