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

我的邮箱是scarlettmsj@yahoo.cn
2024-12-04 11:44:46
推荐回答(2个)
回答(1):

  #include
  #include
  //本例采用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
  }
  }

回答(2):

51唱歌程序网上有下载的,简谱不是转化为二进制数,而是用来设置定时器的一个数值,比如初值或是循环次数等,也就是用一个函数来读懂音乐.