这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 基础知识每日一题——第五十四题

共2条 1/1 1 跳转至

基础知识每日一题——第五十四题

高工
2014-08-25 10:02:07     打赏
活动简介:

“每日一题”是EEPW参考西电XDLab社推出的旨向初学者普及基础知识的一项活动,每天在此帖内公布“每日一题”的题目。大家可以根据自己的理解对题目进行回答和相互讨论,我们鼓励大家积极发言。第二天会给出参考答案。每天一帖,所有的题目都将汇集至此,以期方便大家查找。

 

活动宗旨:

活动目的在于通过“每日一题”让大家每天进步一点点,增强大家的基础知识,提高大家对电子制作的兴趣。我们鼓励大家积极发言,如果不懂、是菜鸟,请积极发问;如果懂、是大神,请慷慨解囊。


        今日题目:如何用单片机实现音乐的播放(以生日歌为例)?





基础知识每日一题

高工
2014-08-26 10:18:58     打赏
2楼

  /* 名称:播放音乐

  说明:程序运行时播放生日快乐歌,未使用定时器中断,所有频

  率完全用延时实现

  */

  #include

  #define uchar unsigned char

  #define uint unsigned int

  sbit BEEP=P3^7;

  //生日快乐歌的音符频率表,不同频率由不同的延时来决定

  uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,

  212,212,106,126,159,169,190,119,119,126,159,142,

  159,0};

  //生日快乐歌节拍表,节拍决定每个音符的演奏长短

  uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,

  9,3,12,12,12,12,12,9,3,12,12,12,24,0};

  //延时

  void DelayMS(uint x)

  {

  uchar t;

  while(x--) for(t=0;t<120;t++);

  }

  //播放函数

  void PlayMusic()

  {

  uint i=0,j,k;

  while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)

  { //播放各个音符,SONG_LONG 为拍子长度

  for(j=0;j

  {

  BEEP=~BEEP;

  //SONG_TONE 延时表决定了每个音符的频率

  for(k=0;k

  }

  DelayMS(10);

  i++;

  }

  }

  void main()

  {

  BEEP=0;

  while(1)

  {

  PlayMusic(); //播放生日快乐

  DelayMS(500); //播放完后暂停一段时间

  }

  }



共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]