定时器T0控制演奏乐曲《梁祝》

proteus仿真电路如图:

定时器T0控制演奏乐曲《梁祝》 - 漠然22 - 漠然22

程度清单:

#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位的值
}

 

posted @ 2013-03-18 19:53  天涯海角路  阅读(239)  评论(0)    收藏  举报