分享

易上手的蜂鸣器放歌

 carl_xie12 2019-12-11

     简明易懂易上手!
单片机产生音乐的原理:
     音乐的产生主要是通过单片机的
I/O口输出高低不同的脉冲信号来控制蜂鸣器发音,要想产生音频脉冲信号,需要算出某音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用单片机定时器计时这个半周期的时间,每当计时到后就输出脉冲的I/O口反相,这样就在此I/O口上得到此脉冲的频率。

        通常,利用单片机的内部定时器0,工作在方式一下,改变计数初始值TH0TL0来产生不同的率。

        例如,若单片机采用12MHzs晶振,要产生频率为587Hzs的音频脉冲时,其音频信号的脉冲周期T=1/587=1703.5775us,半周期时间为852us,因此总要令计时器计数=852us/1us=852,在每计数852时将I/O口反相,就得到C大调的中调Re

        由于定时器0的在方式一计数方式为16位计数器,最多只能装载的数为216次方即65536个,也就是说定时器计数到65536就会进入中断函数,而在中断函数中将输出脉冲的I/O口反相即可,故只需设置好定时器0的初值就可以了发出特定的音频了。初值与音频的对应关系见下表所示:

音频

定时器初值

1do

63628

2re

63835

3mi

64021

4fa

64103

5so

64260

6la

64400

7si

64524

1do

64580

2re

64684

3mi

64777

4fa

64820

5so

64898

6la

64968

7si

65030

1do

65058

2re

65110

3mi

65157

4fa

65160

5so

65217

6la

65252

7si

65282


#include"STC12C5A.h"
int tab[]={64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217,65252,65282}; //网上找到的音符与定时器初值对照表中的数据,用来设定时器0初值
sbit bell=P1^3;//位定义蜂鸣器  
int i; //用于赋定时器0初值
/*延时函数*/
void delay_ms(unsigned int time)
{
 unsigned int t;
 for(;time>0;time--)
 {
  t=1500;
  while(t--);
 }
}
/*定时器0初始化函数*/
void Timer0_init()
{
  TMOD=0x01;//选择定时器0方式1
 ET0=1;   //开启定时器0中断
 EA=1;  
 TR0=1;
 TL0=tab;
 TH0=tab>>8;
}
void Timer0_Isp() interrupt 1
{
  TL0=tab;
 TH0=tab>>8;
 bell=!bell;
}
//放音符的数组前面记得加个code,延迟时间凭乐感吧!要关掉蜂鸣器貌似蜂鸣器跟定时器都要关哦,歌曲暂停与播放,强烈推荐用外部中断!

void main()
{
 int s;
code int song[]={6,5,6,8,9,10,7,6,5,3,5,9,8};
code int song1[]={2,3,5,6,5,3,2,1} ;
code song2[]={10,9,8,5,9,3,5,9,5};
code int song3[]={8,9,10,12,13,10,9};
code int song4[]={9,8,9,10,12,10};

 /*心中有江山的人岂能快意潇洒*/
 for(s=0;s<13;s++)
 {
   i=song-1;
  Timer0_init();
  Timer0_init();
  delay_ms(450);

 }
 delay_ms(500);
 /*我只求于你共华发*/
 for(s=0;s<8;s++)
 {
   i=song1-1;
  Timer0_init();
  Timer0_init();
  delay_ms(450);

 }
 delay_ms(700);
 /*剑出鞘,恩怨了*/
 for(s=1;s<3;s++)
 { 
     i=4;
  Timer0_init();
  Timer0_init();
  delay_ms(450);
  i=5;
  Timer0_init();
  Timer0_init();
  delay_ms(450);
  i=9;
  Timer0_init();
  Timer0_init();
  delay_ms(700);
 }
/*谁笑*/
  i=7;
  Timer0_init();
  Timer0_init();
  delay_ms(450);
  i=8;
  Timer0_init();
  Timer0_init();
  delay_ms(1000);
/*我只求今朝拥你入环抱*/
 for(s=0;s<9;s++)
 {
   i=song2-1;
  Timer0_init();
  Timer0_init();
  delay_ms(450);

 }
 delay_ms(100);
 i=7;
 Timer0_init();
 Timer0_init();
 delay_ms(1000); 
 /*红尘客栈风似刀*/
 for(s=0;s<7;s++)
 {
   i=song3-1;
  Timer0_init();
  Timer0_init();
  delay_ms(450);

 }
 delay_ms(1000);
 /*骤雨落宿命敲*/
 for(s=0;s<6;s++)
 {
   i=song4-1;
  Timer0_init();
  Timer0_init();
  delay_ms(450);

 }
 delay_ms(1000);
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多