#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
int cnt_h,cnt_l;
sbit spk=P2^3;
//sbit led=P2^0;
uchar cnt,i,step,s_bit;
code uint yin[7]={1912,1704,1516,1432,1276,1136,1012}; //1:低八度 3:高八度
//《北京欢迎你》 简谱代码
code uint song[]={123,125,123,122,123,122,223,123,122,116,121,123,122,222,122,121,116,121,122,123,125,122,123,126,125,116,122,121,121
,122,121,116,121,122,123,125,122,123,126,125,125,123,123,122,123,122,121,125,126,222,115,123,123,222,223,
116,123,122,122,221,423,425,131,125,226,226,125,123,123,125,225,123,125,126,131,132,131,125,123,122,125,223,223,123,125,131,125,226,231,132,131,125,123,125,127,226,223,122,123,125,133,232,127,331,999};
void delay(uint a);//
void init(); // 简谱代码解释:每个音及其节拍用一个三位数表示
void main() // 三位数的百位表示节奏的整数倍
{ // 十位表示音的高低(1位低音,3为高音)
init(); // 个位数表示是哪个基本音素
while(1)
{
step=(song[i]/100)*4; //将2变成其他 数可改变节奏的快慢
// TH1=(65536-65535)/256;
// TL1=(65536-65535)%256;
switch((song[i]/10)%10)
{
case 1:
{
cnt_h=-(yin[song[i]%10-1]*2)/256;
cnt_l=-(yin[song[i]%10-1]*2)%256;
break;
}
case 2:
{
cnt_h=-yin[song[i]%10-1]/256;
cnt_l=-yin[song[i]%10-1]%256;
break;
}
case 3:
{
cnt_h=-(yin[song[i]%10-1]/2)/256;
cnt_l=-(yin[song[i]%10-1]/2)%256;
break;
}
}
TH0=cnt_h;
TL0=cnt_l;
TR1=1;
TR0=1;
next:
while(cnt!=step)
goto next;
// led=~led;
TR0=0;
cnt=0;
TR1=0;
delay(200);
i++;
if(song[i]==999)
{
i=0;
delay(900);
}
}
}
void init()
{
EA=1;
ET0=1;
ET1=1;
TMOD=0x11;
i=0;
cnt=0;
TR0=0;
TR1=0 ;
}
#define uchar unsigned char
#define uint unsigned int
int cnt_h,cnt_l;
sbit spk=P2^3;
//sbit led=P2^0;
uchar cnt,i,step,s_bit;
code uint yin[7]={1912,1704,1516,1432,1276,1136,1012}; //1:低八度 3:高八度
//《北京欢迎你》 简谱代码
code uint song[]={123,125,123,122,123,122,223,123,122,116,121,123,122,222,122,121,116,121,122,123,125,122,123,126,125,116,122,121,121
,122,121,116,121,122,123,125,122,123,126,125,125,123,123,122,123,122,121,125,126,222,115,123,123,222,223,
116,123,122,122,221,423,425,131,125,226,226,125,123,123,125,225,123,125,126,131,132,131,125,123,122,125,223,223,123,125,131,125,226,231,132,131,125,123,125,127,226,223,122,123,125,133,232,127,331,999};
void delay(uint a);//
void init(); // 简谱代码解释:每个音及其节拍用一个三位数表示
void main() // 三位数的百位表示节奏的整数倍
{ // 十位表示音的高低(1位低音,3为高音)
init(); // 个位数表示是哪个基本音素
while(1)
{
step=(song[i]/100)*4; //将2变成其他 数可改变节奏的快慢
// TH1=(65536-65535)/256;
// TL1=(65536-65535)%256;
switch((song[i]/10)%10)
{
case 1:
{
cnt_h=-(yin[song[i]%10-1]*2)/256;
cnt_l=-(yin[song[i]%10-1]*2)%256;
break;
}
case 2:
{
cnt_h=-yin[song[i]%10-1]/256;
cnt_l=-yin[song[i]%10-1]%256;
break;
}
case 3:
{
cnt_h=-(yin[song[i]%10-1]/2)/256;
cnt_l=-(yin[song[i]%10-1]/2)%256;
break;
}
}
TH0=cnt_h;
TL0=cnt_l;
TR1=1;
TR0=1;
next:
while(cnt!=step)
goto next;
// led=~led;
TR0=0;
cnt=0;
TR1=0;
delay(200);
i++;
if(song[i]==999)
{
i=0;
delay(900);
}
}
}
void init()
{
EA=1;
ET0=1;
ET1=1;
TMOD=0x11;
i=0;
cnt=0;
TR0=0;
TR1=0 ;
}
void t0(void) interrupt 1
{
TH0=cnt_h;
TL0=cnt_l;
spk=~spk;
}
void t1(void) interrupt 3
{
// TH1=(65536-65535)/256;
// TL1=(65536-65535)%256;
cnt++;
}
void delay(uint a)
{
uint q,k;
for(q=0;q<84;q++)
for(k=0;k<a;k++);
}
{
TH0=cnt_h;
TL0=cnt_l;
spk=~spk;
}
void t1(void) interrupt 3
{
// TH1=(65536-65535)/256;
// TL1=(65536-65535)%256;
cnt++;
}
void delay(uint a)
{
uint q,k;
for(q=0;q<84;q++)
for(k=0;k<a;k++);
}
转载于:https://blog.51cto.com/zgzyue/234032