51单片机C语言

2022-08-03 社会 124阅读
  1. 这两组数据不是算的,而是根据音符实际频率实验得到的。

  2. 硬要说算的也要根据你定时器的频率具体得到。

  3. 如果想要自己利用蜂鸣器编歌,可用下面程序(极乐净土蜂鸣器版)

    贴上极乐净土的简谱,对照下就能自己用蜂鸣器编歌了


#include 
#define uchar unsigned char
#define uint unsigned int
sbit beep=P1^5;//蜂鸣器端口定义
uint i,j;
unsigned int C;
#define l1 262         
#define l2 284
#define l3 311
#define l4 349
#define l5 392
#define l6 440
#define l7 494
#define z1 523
#define z2 587
#define z3 659
#define z4 698
#define z5 784
#define z6 880
#define z7 987
#define h1 1046
#define h2 1174
#define h3 1318
#define h4 1396
#define h5 1567
#define h6 1760
#define h7 1975
#define zi  0
void delay();

unsigned code GP[]={zi,zi,zi,z3,z5,/**/z6,zi,zi,z5,z6,zi,zi,z5,/**/z6,h1,z5,z6,z3,zi,z3,z5,/**/z6,zi,zi,z5,z6,zi,zi,z5,/**/z6,h3,h1,h2,z6,zi,z3,z5,/**/
z6,zi,zi,z5,z6,zi,zi,z5,/**/z6,h1,z5,z6,z3,z5,z1,z2,/**/z3,h1,z6,h3,/**/h2,h3,h2,h1,h2,z6,zi,/**/z6,z6,z6,z6,h1,h2,h3,/**/
z6,z6,z6,z5,z5,z6,/**/z6,z6,z6,z6,h1,h2,h3,/**/z6,z6,z6,h4,h4,h3,/**/z6,z6,z6,z6,h1,h2,h3,/**/ z6,z6,z6,z5,z5,z6,/**/
z6,z6,z6,z6,h1,h2,h3,/**/h6,z5,z5,z6,z6,/**/0xff} ;
//该数组保存乐谱  
//高7音 h开头  中7音 z开头   低7音 l开头  休止符 zi 

                     
unsigned code JP[]={8,8,8,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/4,4,4,4,4,4,4,4,/**/
                    8,8,8,8,/**/4,2,2,4,4,8,8,/**/8,8,8,2,2,2,2,/**/8,8,4,4,4,4,/**/8,8,8,2,2,2,2,/**/8,8,4,4,4,4,/**/
8,8,8,2,2,2,2,/**/8,8,4,4,4,4,/**/8,8,8,2,2,2,2,/**/12,4,4,4,8,/**/
                    }  ;
//该数组保存相对应的延长,至于延长时长可参照乐谱

void main()
{ uchar i,j;
TMOD=0x00;
EA=1;         //开总中断
ET0=1;        //开t0中断
while(1)
{ i=0;
while(GP[i]!=0xff)
{if(GP[i]!=0)
{C=460830/GP[i];
TH0=(8192-C)/32;
TL0=(8192-C)%32;
TR0=1;}//开定时器0
for(j=0;j{delay();}
TR0=0;
i++;

}
beep=0;
}

}
void delay()          
{

for(i=70;i>0;i--)
   {for(j=85;j>0;j--);}
}
void T0_time()interrupt 1
{ TR0=0;
beep=!beep;
TH0=(8192-C)/32;
TL0=(8192-C)%32;
TR0=1;
}
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com