您好,能把51单片机用蜂鸣器唱歌的程序发给我一份吗?还有简谱转化为二进制数的小程序?谢谢!

我的邮箱是scarlettmsj@yahoo.cn... 我的邮箱是scarlettmsj@yahoo.cn 展开
 我来答
ch314156
推荐于2018-03-26 · TA获得超过4378个赞
知道小有建树答主
回答量:2036
采纳率:100%
帮助的人:1068万
展开全部
  #include <reg52.h>
  #include <intrins.h>
  //本例采用89C52, 晶振为11.0592MHZ
  //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
  //频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
  //所以拿出谱子, 试探编吧!

  sbit out=P2^3;
  unsigned char n=0; //n为节拍常数变量
  unsigned char code music_tab[] ={
  0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
  0x20, 0x40, 0x1C , 0x10,
  0x18, 0x10, 0x20 , 0x10,
  0x1C, 0x10, 0x18 , 0x40,
  0x1C, 0x20, 0x20 , 0x20,
  0x1C, 0x20, 0x18 , 0x20,
  0x20, 0x80, 0xFF , 0x20,
  0x30, 0x1C, 0x10 , 0x18,
  0x20, 0x15, 0x20 , 0x1C,
  0x20, 0x20, 0x20 , 0x26,
  0x40, 0x20, 0x20 , 0x2B,
  0x20, 0x26, 0x20 , 0x20,
  0x20, 0x30, 0x80 , 0xFF,
  0x20, 0x20, 0x1C , 0x10,
  0x18, 0x10, 0x20 , 0x20,
  0x26, 0x20, 0x2B , 0x20,
  0x30, 0x20, 0x2B , 0x40,
  0x20, 0x20, 0x1C , 0x10,
  0x18, 0x10, 0x20 , 0x20,
  0x26, 0x20, 0x2B , 0x20,
  0x30, 0x20, 0x2B , 0x40,
  0x20, 0x30, 0x1C , 0x10,
  0x18, 0x20, 0x15 , 0x20,
  0x1C, 0x20, 0x20 , 0x20,
  0x26, 0x40, 0x20 , 0x20,
  0x2B, 0x20, 0x26 , 0x20,
  0x20, 0x20, 0x30 , 0x80,
  0x20, 0x30, 0x1C , 0x10,
  0x20, 0x10, 0x1C , 0x10,
  0x20, 0x20, 0x26 , 0x20,
  0x2B, 0x20, 0x30 , 0x20,
  0x2B, 0x40, 0x20 , 0x15,
  0x1F, 0x05, 0x20 , 0x10,
  0x1C, 0x10, 0x20 , 0x20,
  0x26, 0x20, 0x2B , 0x20,
  0x30, 0x20, 0x2B , 0x40,
  0x20, 0x30, 0x1C , 0x10,
  0x18, 0x20, 0x15 , 0x20,
  0x1C, 0x20, 0x20 , 0x20,
  0x26, 0x40, 0x20 , 0x20,
  0x2B, 0x20, 0x26 , 0x20,
  0x20, 0x20, 0x30 , 0x30,
  0x20, 0x30, 0x1C , 0x10,
  0x18, 0x40, 0x1C , 0x20,
  0x20, 0x20, 0x26 , 0x40,
  0x13, 0x60, 0x18 , 0x20,
  0x15, 0x40, 0x13 , 0x40,
  0x18, 0x80, 0x00
  };

  void int0() interrupt 1 //采用中断0 控制节拍
  { TH0=0xd8;
  TL0=0xef;
  n--;
  }

  void delay (unsigned char m) //控制频率延时
  {
  unsigned i=3*m;
  while(--i);
  }

  void delayms(unsigned char a) //豪秒延时子程序
  {
  while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
  }

  void main()
  { unsigned char p,m; //m为频率常数变量
  unsigned char i=0;
  TMOD&=0x0f;
  TMOD|=0x01;
  TH0=0xd8;TL0=0xef;
  IE=0x82;
  play:
  while(1)
  {
  a: p=music_tab[i];
  if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍
  else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符
  else {m=music_tab[i++], n=music_tab[i++];} //取频率常数 和 节拍常数
  TR0=1; //开定时器1
  while(n!=0) out=~out,delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!)
  TR0=0; //关定时器1
  }
  }
宿兴电子
2024-11-28 广告
联系我们蜂鸣器的种类规格繁多,需先知道几个参数 ( 电压,电流,驱动方式,尺寸,连接/固定方式),当然更重要的是,想要获的声音 (音压大小,频率高低).工作电压:电磁式蜂鸣器,从1.5到24V, 压电式的从3V到220V都是可行的,但一般压... 点击进入详情页
本回答由宿兴电子提供
cxtldh
2011-06-08 · TA获得超过342个赞
知道小有建树答主
回答量:640
采纳率:100%
帮助的人:448万
展开全部
51唱歌程序网上有下载的,简谱不是转化为二进制数,而是用来设置定时器的一个数值,比如初值或是循环次数等,也就是用一个函数来读懂音乐.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式