当前位置:   article > 正文

51单片机——蜂鸣器制作音乐“送你一朵小红花“_51单片机音乐播放代码

51单片机音乐播放代码

目录

一、音乐简谱<——>单片机

1.音调(歌)-->频率(单片机)

2.节拍(歌)--->延时(单片机)

3.简谱编码

4.唱歌

二、完整代码

目录

一、音乐简谱<——>单片机

1.音调(歌)-->频率(单片机)

2.节拍(歌)--->延时(单片机)

3.简谱编码

4.唱歌

5.补充——多歌切换、暂停

二、完整代码

1.单独播放一首歌的代码

2.含补充功能的代码

三、效果检验+误差分析+优化思路

1、时长

2.一些待优化的地方


一、音乐简谱<——>单片机

简谱单片机
音调频率
节拍延时

1.音调(歌)-->频率(单片机)

简谱中用1、2、3、4、5、6、7这几个数字作为符号,表示音的高低。上面加一点是高八度,下面加一点是为低八度。

单片机

简谱中的不同音调对应51单片机中提供给蜂鸣器的不同频率的脉冲。

51单片机内部含无源蜂鸣器,通过给蜂鸣器提供不同频率的脉冲,蜂鸣器可以发出不同音调的声音。频率越高,音调越高。

无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音。

以下是C调音符与脉冲频率对应表,以a为基准频率是440Hz,左右两边都是倍数关系,中间是按照等比数列进行平分:

频率的产生可用定时器中断实现,定时器初值(十进制)计算代码逻辑如下:

这里选择定时器工作方式1,为16位定时器(2^16=65535)

  1. //频率表
  2. unsigned int code FreTab[21] = {
  3. 262,294,330,349,392,440,494,
  4. 523,587,659,698,784,880,988,
  5. 1046,1175,1318,1397,1568,1760,1976};
  6. //定时器初值
  7. timer0h=(65535-(int)(1000000/(2*FreTab[k])))/256;
  8. timer0l=(65535-(int)(1000000/(2*FreTab[k])))%256;
  9. //定时中断
  10. void t0int() interrupt 1
  11. {
  12. speaker=!speaker;
  13. TH0=timer0h;
  14. TL0=timer0l;
  15. }

2.节拍(歌)--->延时(单片机)

下面这个是谱子的速度,表示一分钟104拍,一拍为60/104=0.5769230766923······s

分数---分母:看谱子的左上角的分数,以四分音符为1拍

数字右边加一个点,相当于加上半拍。

一般四分音符1拍为500ms,二分音符为1拍=1000ms······

这里1拍取整577us,以四分之一拍为单位,1个四分之一拍取整为144us。

分数---分子:每小节4拍

单片机

循环--->延时

  1. // 节奏的快慢,这里是四分之一个节拍的时间
  2. void delay(unsigned char t)
  3. {
  4. unsigned long t2;
  5. t2=t*144;
  6. while(t2--)
  7. {
  8. unsigned char data i, j;
  9. i = 2;
  10. j = 239;
  11. do
  12. {
  13. while (--j);
  14. }
  15. while (--i);
  16. }
  17. TR0=0;// 停止发音 如果屏蔽掉,会出现连音的不正常现象
  18. }

3.简谱编码

以三位数代表1个音符。

第一位:音高(低音0,中音1,高音2),其中0可省略;

第二位:音长(四分之一个节拍为1,其他依次递增,如1个节拍为1*4=4);

第三位:音调(1,2,3,4,5,6,7);

  1. code unsigned char gyz[]={
  2. 140,26,25,26,25,120,25,143,123,143,122,121,11,171,
  3. // 送你一朵小红花
  4. 140,140,140,140,140,26,25,26,25,120,25,143,123,120,123,123,121,122,141,121,141,26,26,26,65,140,140,
  5. //送你一朵小红花,开在你昨天新长的枝丫。
  6. 140,26,121,46,140, 135,113,123,125,145,140, 133,116,126,125,145,121,123, 123,123,142,140,140,
  7. //奖励你有勇气,主动来和我说话。
  8. 140,126,126,136,116,126,125, 145,121,122,142,140, 140,123,123,122,143,122, 143,26,121,141,140, 140,121,121,35,16,26,25, 125,123,123,122,142,140, 26,142,122,132,111,121,26, 26,121,181,140,
  9. //不共戴天的冰水啊,义无反顾的烈酒啊,多么苦难的日子里 ,你都已战胜了它。
  10. 140,140,140,140,140,26,25,26,25,120,25,143,123,120,123,123,121,122,141,121,141,26,26,26,65,140,140,
  11. //送你一朵小红花,遮住你今天新添的伤疤。
  12. 140,26,121,46,120,26, 135,113,123,125,145,140, 126,146,125,145,121,123, 123,162,140,140,
  13. //奖励你在下雨天,还愿意送我回家。
  14. 140,126,126,136,116,126,125, 145,121,122,142,140, 140,123,122,123,143,122, 143,26,121,141,140, 140,25,26,85, 135,115,125,123,163,123, 132,112,122,121,142,26,122, 122,161,140,140,
  15. //科罗拉多的风雪啊,喜马拉雅的骤雨啊,只要你相信我,闭上眼就能到达。
  16. 140,140,140,140,140,26,25,26,25,120,25,143,123,120,123,123,121,122,141,121,141,23,26,26,65,140,140,
  17. //送你一朵小红花,开在那牛羊遍野的天涯,
  18. 140,26,121,46,140, 133,115,125,123,143,140, 126,145,125,145,123,121, 121,122,142,140,140,
  19. //奖励你走到哪儿,都不会忘记我啊。
  20. 140,126,126,136,116,126,125, 135,115,125,122,142,140, 140,123,123,133,113,123,122, 133,16,26,121,141,140, 140,121,121,131,111,121,25, 125,123,122,123,143,140, 122,142,122,142,26,122, 122,121,181,140,
  21. //洁白如雪的沙滩啊,风平浪静的湖水啊,那些真实的幻影啊,是我给你的牵挂。
  22. 140,140,140,140,140,26,25,26,25,120,25,143,123,120,123,123,121,122,141,121,141,23,26,26,65,140,140,
  23. //送你一朵小红花,开在你心底最深的泥沙。
  24. 140,26,121,46,140, 135,113,123,125,145,140, 133,116,126,125,145,121,123, 123,162,140,140,
  25. //奖励你能感受,每个命运的挣扎。
  26. 140,126,126,136,116,126,125, 135,115,125,122,142,140, 140,123,122,123,143,122, 133,112,122,121,141,140, 140,121,121,141,25,25, 145,123,123,163,123, 132,112,122,121,142,26,122, 122,161,140,140,
  27. //是谁挥霍的时光啊,是谁苦苦的奢望啊,这不是一个问题,也不需要你的回答。
  28. 140,26,25,26,45,120, 25,143,123,143,122,121, 181,181,
  29. //送你一朵小红花
  30. 140,140,140,140, 140,26,25,26,45,120, 25,143,123,143,122,121, 181,181,
  31. //送你一朵小红花
  32. 140,140,140,140, 140,26,25,26,45,120, 25,143,123,143,122,121, 181,181,
  33. //送你一朵小红花
  34. 140,140,140,140, 140,26,25,26,45,120, 25,143,123,143,122,121, 181,181,
  35. //送你一朵小红花
  36. 0 //0标志 表示结束
  37. };

4.唱歌

蜂鸣器唱歌的整个逻辑就是,循环遍历简谱,得到每个音符对应的频率,由频率计算出定时器初值,让定时器发出对应频率的脉冲给蜂鸣器,然后蜂鸣器发出不同的音调,再看该音符要唱几排,延时相应的时间,连起来就是一首歌了。

以下是song函数:

  1. void song()
  2. {
  3. unsigned char k=0;
  4. unsigned long i=0; // 由于歌词长度问题,需要设置大一点的范围,否则还没唱完一遍又重新开始了
  5. // 这里这样做就只唱一遍,寻到最后的0值时就停止了
  6. while(time)
  7. {
  8. if(gyz[i]%10==0) // 音调为0值时停顿处理
  9. {
  10. TR0=0; // 停止发音
  11. }
  12. else
  13. {
  14. k=gyz[i]%10+7*(gyz[i]/100)-1;
  15. timer0h=(65535-(int)(1000000/(2*FreTab[k])))/256;
  16. timer0l=(65535-(int)(1000000/(2*FreTab[k])))%256;
  17. TR0=1; // 启动T0输出方波去发音
  18. }
  19. time=gyz[i]/10%10;
  20. i=i+1;
  21. delay(time);
  22. }
  23. }

5.补充——多歌切换、暂停

可以用按键控制放哪首歌,在歌前加一个按键值的条件语句即可;想在歌播放途中暂停,可用外部中断0,(缺)但是以下程序只能使歌暂停,无法继续播放,要想再播歌需按选歌的按键,但也只是从头播放。

  1. void key3_interrupt() interrupt 0
  2. {
  3. if(key3==0)
  4. {
  5. time=0;
  6. }
  7. }

二、完整代码

1.单独播放一首歌的代码

  1. #include <REG52.H>
  2. #include <INTRINS.H>
  3. sbit speaker=P1^5;
  4. unsigned char timer0h,timer0l,time=1;
  5. //送你一朵小红花
  6. code unsigned char xhh[]={
  7. 140,26,25,26,25,120,25,143,123,143,122,121,11,171,
  8. //送你一朵小红花
  9. 140,140,140,140,140,26,25,26,25,120,25,143,123,120,123,123,121,122,141,121,141,26,26,26,65,140,140,
  10. //送你一朵小红花,开在你昨天新长的枝丫。
  11. 140,26,121,46,140, 135,113,123,125,145,140, 133,116,126,125,145,121,123, 123,123,142,140,140,
  12. //奖励你有勇气,主动来和我说话。
  13. 140,126,126,136,116,126,125, 145,121,122,142,140, 140,123,123,122,143,122, 143,26,121,141,140, 140,121,121,35,16,26,25, 125,123,123,122,142,140, 26,142,122,132,111,121,26, 26,121,181,140,
  14. //不共戴天的冰水啊,义无反顾的烈酒啊,多么苦难的日子里 ,你都已战胜了它。
  15. 140,140,140,140,140,26,25,26,25,120,25,143,123,120,123,123,121,122,141,121,141,26,26,26,65,140,140,
  16. //送你一朵小红花,遮住你今天新添的伤疤。
  17. 140,26,121,46,120,26, 135,113,123,125,145,140, 126,146,125,145,121,123, 123,162,140,140,
  18. //奖励你在下雨天,还愿意送我回家。
  19. 140,126,126,136,116,126,125, 145,121,122,142,140, 140,123,122,123,143,122, 143,26,121,141,140, 140,25,26,85, 135,115,125,123,163,123, 132,112,122,121,142,26,122, 122,161,140,140,
  20. //科罗拉多的风雪啊,喜马拉雅的骤雨啊,只要你相信我,闭上眼就能到达。
  21. 140,140,140,140,140,26,25,26,25,120,25,143,123,120,123,123,121,122,141,121,141,23,26,26,65,140,140,
  22. //送你一朵小红花,开在那牛羊遍野的天涯,
  23. 140,26,121,46,140, 133,115,125,123,143,140, 126,145,125,145,123,121, 121,122,142,140,140,
  24. //奖励你走到哪儿,都不会忘记我啊。
  25. 140,126,126,136,116,126,125, 135,115,125,122,142,140, 140,123,123,133,113,123,122, 133,16,26,121,141,140, 140,121,121,131,111,121,25, 125,123,122,123,143,140, 122,142,122,142,26,122, 122,121,181,140,
  26. //洁白如雪的沙滩啊,风平浪静的湖水啊,那些真实的幻影啊,是我给你的牵挂。
  27. 140,140,140,140,140,26,25,26,25,120,25,143,123,120,123,123,121,122,141,121,141,23,26,26,65,140,140,
  28. //送你一朵小红花,开在你心底最深的泥沙。
  29. 140,26,121,46,140, 135,113,123,125,145,140, 133,116,126,125,145,121,123, 123,162,140,140,
  30. //奖励你能感受,每个命运的挣扎。
  31. 140,126,126,136,116,126,125, 135,115,125,122,142,140, 140,123,122,123,143,122, 133,112,122,121,141,140, 140,121,121,141,25,25, 145,123,123,163,123, 132,112,122,121,142,26,122, 122,161,140,140,
  32. //是谁挥霍的时光啊,是谁苦苦的奢望啊,这不是一个问题,也不需要你的回答。
  33. 140,26,25,26,45,120, 25,143,123,143,122,121, 181,181,
  34. //送你一朵小红花
  35. 140,140,140,140, 140,26,25,26,45,120, 25,143,123,143,122,121, 181,181,
  36. //送你一朵小红花
  37. 140,140,140,140, 140,26,25,26,45,120, 25,143,123,143,122,121, 181,181,
  38. //送你一朵小红花
  39. 140,140,140,140, 140,26,25,26,45,120, 25,143,123,143,122,121, 181,181,
  40. //送你一朵小红花
  41. 0
  42. };
  43. //频率表
  44. unsigned int code FreTab[21] = {
  45. 262,294,330,349,392,440,494,
  46. 523,587,659,698,784,880,988,
  47. 1046,1175,1318,1397,1568,1760,1976};
  48. void t0int() interrupt 1
  49. {
  50. speaker=!speaker;
  51. TH0=timer0h;
  52. TL0=timer0l;
  53. }
  54. // 节奏的快慢,这里是四分之一个节拍的时间
  55. void delay(unsigned char t)
  56. {
  57. unsigned long t2;
  58. t2=t*144;
  59. while(t2--)
  60. {
  61. unsigned char data i, j;
  62. i = 2;
  63. j = 239;
  64. do
  65. {
  66. while (--j);
  67. }
  68. while (--i);
  69. }
  70. TR0=0;// 停止发音 如果屏蔽掉,会出现连音的不正常现象
  71. }
  72. /**/
  73. void song()
  74. {
  75. unsigned char k=0;
  76. unsigned long i=0; // 由于歌词长度问题,需要设置大一点的范围,否则还没唱完一遍又重新开始了
  77. // 这里这样做就只唱一遍,寻到最后的0值时就停止了
  78. while(time)
  79. {
  80. if(xhh[i]%10==0) // 音调为0值时停顿处理
  81. {
  82. TR0=0; // 停止发音
  83. }
  84. else
  85. {
  86. k=xhh[i]%10+7*(xhh[i]/100)-1;
  87. timer0h=(65535-(int)(1000000/(2*FreTab[k])))/256;
  88. timer0l=(65535-(int)(1000000/(2*FreTab[k])))%256;
  89. TR0=1; // 启动T0输出方波去发音
  90. }
  91. time=xhh[i]/10%10;
  92. i=i+1;
  93. delay(time);
  94. }
  95. }
  96. void main(void)
  97. {
  98. TMOD=1; // 设置定时器0为16位计数模式
  99. EA=1;ET0=1; // 开定时器0中断
  100. while(1)
  101. {
  102. song();
  103. }
  104. }

2.含补充功能的代码

  1. #include <REG52.H>
  2. sbit speaker=P1^5;
  3. sbit key1= P3^1;
  4. sbit key2= P3^0;
  5. sbit key3= P3^2;
  6. unsigned char timer0h,timer0l,time=1;
  7. // 送你一朵小红花
  8. code unsigned char xhh[]={
  9. 140,26,25,26,25,120,25,143,123,143,122,121,11,171,
  10. //(原版)送你一朵小红花
  11. //(毕业歌)送你一朵小红花
  12. 140,140,140,140,140,26,25,26,25,120,25,143,123,120,123,123,121,122,141,121,141,26,26,26,65,140,140,
  13. //(原版)送你一朵小红花,开在你昨天新长的枝丫。
  14. //(毕业歌)送你一朵小红花,开在你昨天新长的枝丫。
  15. 140,26,121,46,140, 135,113,123,125,145,140, 133,116,126,125,145,121,123, 123,123,142,140,140,
  16. //(原版)奖励你有勇气,主动来和我说话。
  17. //(毕业歌)奖励你有勇气,主动来和我说话。
  18. 140,126,126,136,116,126,125, 145,121,122,142,140, 140,123,123,122,143,122, 143,26,121,141,140, 140,121,121,35,16,26,25, 125,123,123,122,142,140, 26,142,122,132,111,121,26, 26,121,181,140,
  19. //(原版)不共戴天的冰水啊,义无反顾的烈酒啊,多么苦难的日子里 ,你都已战胜了它。
  20. //(毕业歌)爸爸妈妈的叮咛啊,老师同学的祝福啊,多么温暖的日子里,挥挥手又要出发。
  21. 140,140,140,140,140,26,25,26,25,120,25,143,123,120,123,123,121,122,141,121,141,26,26,26,65,140,140,
  22. //(原版)送你一朵小红花,遮住你今天新添的伤疤。
  23. //(毕业歌)送你一朵小红花,遮住你今天新添的伤疤。
  24. 140,26,121,46,120,26, 135,113,123,125,145,140, 126,146,125,145,121,123, 123,162,140,140,
  25. //(原版)奖励你在下雨天,还愿意送我回家。
  26. //(毕业歌)奖励你在下雨天,还愿意送我回家。
  27. 140,126,126,136,116,126,125, 145,121,122,142,140, 140,123,122,123,143,122, 143,26,121,141,140, 140,25,26,85, 135,115,125,123,163,123, 132,112,122,121,142,26,122, 122,161,140,140,
  28. //(原版)科罗拉多的风雪啊,喜马拉雅的骤雨啊,只要你相信我,闭上眼就能到达。
  29. //(毕业歌)风华赛道的黎明啊,数图窗外的星光啊,只要你相信我,坚持走就能到达。
  30. 140,140,140,140,140,26,25,26,25,120,25,143,123,120,123,123,121,122,141,121,141,23,26,26,65,140,140,
  31. //(原版)送你一朵小红花,开在那牛羊遍野的天涯,
  32. //(毕业歌)送你一朵小红花,开在那牛羊遍野的天涯,
  33. 140,26,121,46,140, 133,115,125,123,143,140, 126,145,125,145,123,121, 121,122,142,140,140,
  34. //(原版)奖励你走到哪儿,都不会忘记我啊。
  35. //(毕业歌)奖励你走到哪儿,都不会忘记我啊。
  36. 140,126,126,136,116,126,125, 135,115,125,122,142,140, 140,123,123,133,113,123,122, 133,16,26,121,141,140, 140,121,121,131,111,121,25, 125,123,122,123,143,140, 122,142,122,142,26,122, 122,121,181,140,
  37. //(原版)洁白如雪的沙滩啊,风平浪静的湖水啊,那些真实的幻影啊,是我给你的牵挂。
  38. //(毕业歌)催人攀登的天梯啊,青春奋进的身影啊,生生不息的校园啊,是我给你的牵挂。
  39. 140,140,140,140,140,26,25,26,25,120,25,143,123,120,123,123,121,122,141,121,141,23,26,26,65,140,140,
  40. //(原版)送你一朵小红花,开在你心底最深的泥沙。
  41. //(毕业歌)送你一朵小红花,开在你心底最深的泥沙。
  42. 140,26,121,46,140, 135,113,123,125,145,140, 133,116,126,125,145,121,123, 123,162,140,140,
  43. //(原版)奖励你能感受,每个命运的挣扎。
  44. //(毕业歌)奖励你能感受,每段闪光的年华。
  45. 140,126,126,136,116,126,125, 135,115,125,122,142,140, 140,123,122,123,143,122, 133,112,122,121,141,140, 140,121,121,141,25,25, 145,123,123,163,123, 132,112,122,121,142,26,122, 122,161,140,140,
  46. //(原版)是谁挥霍的时光啊,是谁苦苦的奢望啊,这不是一个问题,也不需要你的回答。
  47. //(毕业歌)披荆斩棘的时光啊,乘风破浪的旅途啊,这不是一个问题,期待你明天的回答。
  48. 140,26,25,26,45,120, 25,143,123,143,122,121, 181,181,
  49. //送你一朵小红花
  50. 140,140,140,140, 140,26,25,26,45,120, 25,143,123,143,122,121, 181,181,
  51. //送你一朵小红花
  52. 140,140,140,140, 140,26,25,26,45,120, 25,143,123,143,122,121, 181,181,
  53. //送你一朵小红花
  54. 140,140,140,140, 140,26,25,26,45,120, 25,143,123,143,122,121, 181,181,
  55. //送你一朵小红花
  56. 0
  57. };
  58. //生日歌
  59. code unsigned char srg[]={
  60. 140,140,125,125, 146,145,241, 187,125,125, 146,145,242, 281,125,125, 245,243,241, 147,146,124,124,
  61. 243,241,243, 282,125,125, 146,145,241, 187,125,125, 146,145,242, 281,125,125, 245,243,241, 147,146,124,124, 243,241,242, 241,241,241, 0};
  62. //频率表
  63. unsigned int code FreTab[21] = {
  64. 262,294,330,349,392,440,494,
  65. 523,587,659,698,784,880,988,
  66. 1046,1175,1318,1397,1568,1760,1976};
  67. void t0int() interrupt 1
  68. {
  69. speaker=!speaker;
  70. TH0=timer0h;
  71. TL0=timer0l;
  72. }
  73. // 节奏的快慢,这里是四分之一个节拍的时间
  74. void delay(unsigned char t)
  75. {
  76. unsigned long t2;
  77. t2=t*144;
  78. while(t2--)
  79. {
  80. unsigned char data i, j;
  81. i = 2;
  82. j = 239;
  83. do
  84. {
  85. while (--j);
  86. }
  87. while (--i);
  88. }
  89. TR0=0;// 停止发音 如果屏蔽掉,会出现连音的不正常现象
  90. }
  91. /**/
  92. void song()
  93. {
  94. unsigned char k=0;
  95. unsigned long i1=0,i2=0,i3=0; // 由于歌词长度问题,需要设置大一点的范围,否则还没唱完一遍又重新开始了
  96. if(key1==0)
  97. {
  98. time=1;
  99. while(time)
  100. {
  101. if(xhh[i1]%10==0) // 音调为0值时停顿处理
  102. {
  103. TR0=0; // 停止发音
  104. }
  105. else
  106. {
  107. k=xhh[i1]%10+7*(xhh[i1]/100)-1;
  108. timer0h=(65535-(int)(1000000/(2*FreTab[k])))/256;
  109. timer0l=(65535-(int)(1000000/(2*FreTab[k])))%256;
  110. TR0=1; // 启动T0输出方波去发音
  111. }
  112. time=xhh[i1]/10%10;// 这里这样做就只唱一遍,寻到最后的0值时就停止了
  113. i1=i1+1;
  114. delay(time);
  115. }
  116. time=1;i1=0;
  117. }
  118. if(key2==0)
  119. {
  120. time=1;
  121. while(time)
  122. {
  123. if(srg[i2]%10==0) // 音调为0值时停顿处理
  124. {
  125. TR0=0; // 停止发音
  126. }
  127. else
  128. {
  129. k=srg[i2]%10+7*(srg[i2]/100)-1;
  130. timer0h=(65535-(int)(1000000/(2*FreTab[k])))/256;
  131. timer0l=(65535-(int)(1000000/(2*FreTab[k])))%256;
  132. TR0=1; // 启动T0输出方波去发音
  133. }
  134. time=srg[i2]/10%10;
  135. i2=i2+1;
  136. delay(time);
  137. }
  138. time=1; i2=0;
  139. }
  140. }
  141. void main(void)
  142. {
  143. TMOD=1; // 设置定时器0为16位计数模式
  144. EA=1;ET0=1; // 开定时器0中断
  145. EX0=1;IT0=1;
  146. while(1)
  147. {
  148. song();
  149. }
  150. }
  151. void key3_interrupt() interrupt 0
  152. {
  153. if(key3==0)
  154. {
  155. time=0;
  156. }
  157. }

三、效果检验+误差分析+优化思路

1、时长

谱子的速度为一分钟104拍,该谱总共有344拍,总共3.3076923076······分钟,约198.46s

蜂鸣器实际播放一首歌的时间为223s

误差分析:多出的时间可能是因为程序执行需要时间,此外,节拍延时函数中1拍取得时间本身就是比实际大的数值,慢慢累积会造成较大误差。

2.一些待优化的地方

(1)节拍:由于这里是以四分之一拍为单位,那么四拍对应的数字就是16,大于9,无法用1个数表示。本文的处理方法是将四拍换成两个二拍,虽然两个二拍的时间长度与四拍差不多,但是两个二拍发音之间会有停顿现象(节拍延时函数的最后设置了TR0=0停止发音,防止连音不正常现象)。

或许可以用9(未用到)来代替四拍,然后再延时函数中判断一下,如果传入的为9,则令t=16。

(2)暂停:这里用外部中断0实现暂停,外部中断0的优先级比定时中断0的高,可能会影响定时,从而使频率有点偏差。此外,同上文所述,控制外部中断的按键只能使歌暂停,无法继续播放,要想再播歌仍需按选歌的按键,但也只是从头播放。

怎样让歌继续播放小白还需进一步研究。或许可以在外部中断函数中标记此刻暂停的位置,执行song函数时不再从0开始,而是从标志位开始(即改变i值)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/613343
推荐阅读
相关标签
  

闽ICP备14008679号