打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
易上手的蜂鸣器放歌

    简明易懂易上手!
单片机产生音乐的原理:
     音乐的产生主要是通过单片机的
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);
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
第5章 定时器计数器
LPC1768 定时器初值计算
用单片机设计的豆浆机控制电路原理图 _ 工控PLC博客_工控人家园_电工论坛_电工学习网_防爆电气_...
单片机PWM技术实现呼吸灯和KTV等娱乐场所的灯光闪烁效果
单片机定时器/计数器
HT66F50 C程序框架及注意事项
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服