定时器T0控制演奏乐曲《梁祝》
proteus仿真电路如图:
程度清单:
#include<reg51.h> //包含51单片机寄存器定义的头文件
sbit sound=P3^7; //将sound位定义为P3.7
unsigned int C; //储存定时器的定时常数
//以下是C调低音的音频宏定义
#define l_do 262 //将“l_do”宏定义为低音“1”的频率262Hz
#define l_re 286 //将“l_re”宏定义为低音“2”的频率286Hz
#define l_mi 311 //将“l_mi”宏定义为低音“3”的频率311Hz
#define l_fa 349 //将“l_fa”宏定义为低音“4”的频率349Hz
#define l_suo 392 //将“l_suo”宏定义为低音“5”的频率392Hz
#define l_la 440 //将“l_a”宏定义为低音“6”的频率440Hz
#define l_si 494 //将“l_si”宏定义为低音“7”的频率494Hz
//以下是C调中音的音频宏定义
#define do 523 //将“do”宏定义为中音“1”的频率523Hz
#define re 587 //将“re”宏定义为中音“2”的频率587Hz
#define mi 659 //将“mi”宏定义为中音“3”的频率659Hz
#define fa 698 //将“fa”宏定义为中音“4”的频率698Hz
#define suo 784 //将“suo”宏定义为中音“5”的频率784Hz
#define la 880 //将“la”宏定义为中音“6”的频率880Hz
#define si 987 //将“si”宏定义为中音“7”的频率523H
//以下是C调高音的音频宏定义
#define h_do 1046 //将“h_do”宏定义为高音“1”的频率1046Hz
#define h_re 1174 //将“h_re”宏定义为高音“2”的频率1174Hz
#define h_mi 1318 //将“h_mi”宏定义为高音“3”的频率1318Hz
#define h_fa 1396 //将“h_fa”宏定义为高音“4”的频率1396Hz
#define h_suo 1567 //将“h_suo”宏定义为高音“5”的频率1567Hz
#define h_la 1760 //将“h_la”宏定义为高音“6”的频率1760Hz
#define h_si 1975 //将“h_si”宏定义为高音“7”的频率1975Hz
/*******************************************
函数功能:1个延时单位,延时200ms,此曲目可适当加长延时时间
******************************************/
void delay()
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++)
;
}
void main()
{
//×××××××××××××××《梁祝》简谱××××××××××××××××
unsigned int code f[]={l_mi,l_suo,l_la,do,re,l_la,do,l_suo,
suo,h_do,la,suo,mi,suo,re,
re,re,mi,l_si,l_la,l_suo,l_la,do,re,
l_mi,do,l_la,l_suo,l_la,do,l_suo,
mi,suo,l_si,re,l_la,do,l_suo,
l_mi,l_suo,l_mi,l_suo,l_la,l_si,re,l_la,
l_suo,l_la,do,re,mi,suo,mi,re,do,l_la,l_suo,l_mi,do,
l_la,do,l_la,l_suo,l_mi,l_suo,l_la,do,suo,0xff};
//-------节拍----------
unsigned int code JP[]={4,2,1,2,1,1,1,2,
2,1,1,1,1,1,8,
2,1,1,2,2,2,1,2,2,
2,2,1,1,1,1,8,
2,1,2,2,1,1,2,
1,1,2,1,1,1,1,4,
1,1,2,1,2,1,1,2,1,1,2,1,1,4,4,
1,1,1,1,1,1,1,1,4};
unsigned char i,j;
EA=1;
ET0=1;
TMOD=0x00;
while(1)
{
i=0;
while(f[i]!=0xff)
{
C=500000/f[i]; //12M晶振,C为定时常数
TH0=(8192-C)/32; //这是可以证明的。。。
TL0=(8192-C)%32;
TR0=1;
for(j=0;j<JP[i];j++)
delay();
TR0=0;
i++;
}
}
}
void Time0(void) interrupt 1 using 1
{
sound=!sound;
TH0=(8192-C)/32; //
TL0=(8192-C)%32; //低5位的值
}


浙公网安备 33010602011771号