?? 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 + -