找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1601|回复: 0
打印 上一主题 下一主题
收起左侧

基于51单片机音乐播放器程序 代码注释很详细

[复制链接]
跳转到指定楼层
楼主
ID:1016796 发表于 2023-1-28 20:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于51单片机的音乐播放器设计源程序
  1. /*
  2.         记住:三个数字一组,代表一个音符。
  3. 第一个数字是1234567之一,代表音符哆来咪发...;
  4. 第二个数字是0123之一,代表低音、中音、高音、超高音;
  5. 第三个数字是半拍的个数,代表时间长度。


  6. */


  7. #include "reg52.h"                           //头文件调用
  8. sbit speaker = P2^5;                        //定义蜂鸣器

  9. unsigned char timer0h, timer0l; //音调高低
  10. unsigned char time;             //一个音符的时间
  11. //--------------------------------------
  12. //单片机晶振采用11.0592MHz
  13. // 频率-半周期数据表 高八位 本软件共保存了四个八度的28个频率数据
  14. code unsigned char FREQH[] = {
  15. 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,            //低音1234567
  16. 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, //1,2,3,4,5,6,7,i
  17. 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,                         //高音 234567
  18. 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF};                 //超高音 1234567

  19. // 频率-半周期数据表 低八位
  20. code unsigned char FREQL[] = {
  21. 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,                 //低音1234567
  22. 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
  23. 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,                         //高音 234567
  24. 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};                 //超高音 1234567
  25. //--------------------------------------
  26. //世上只有妈妈好数据表 要想演奏不同的乐曲, 只需要修改这个数据表
  27. code unsigned char sszymmh[] = {
  28. 6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1,
  29. //一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。
  30. //6, 2, 3 分别代表:6, 中音, 3个半拍;
  31. //5, 2, 1 分别代表:5, 中音, 1个半拍;
  32. //3, 2, 2 分别代表:3, 中音, 2个半拍;
  33. //5, 2, 2 分别代表:5, 中音, 2个半拍;
  34. //1, 3, 2 分别代表:1, 高音, 2个半拍;
  35. //
  36. 6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1,
  37. 6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2,
  38. 5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1,
  39. 2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0};



  40. //《烟花易冷》
  41. unsigned char code song1[]={
  42.      5,2,1, 3,2,1, 2,2,2, 2,2,4, 3,2,1, 1,2,1, 2,2,1, 3,2,4,
  43.          5,2,1, 3,2,1, 2,2,2, 2,2,2, 5,1,1, 3,2,1, 4,2,1, 3,2,4,
  44.          3,2,1, 3,2,1, 7,2,1, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1,
  45.          2,2,1, 3,2,1, 6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1,
  46.          1,2,1, 7,1,1, 5,1,1, 6,1,6, 5,2,1, 3,2,1, 2,2,2, 2,2,1,
  47.          2,2,1, 3,2,1, 1,2,1, 2,2,1, 3,2,4, 5,2,1, 3,2,1, 2,2,2,
  48.          2,2,1, 2,2,1, 5,1,1, 3,2,1, 4,2,1, 3,2,4, 3,2,1, 3,2,1,
  49.          7,2,3, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1, 2,2,1, 3,2,1,
  50.          6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1, 1,2,1, 7,1,2,
  51.          5,1,2, 6,1,6, 0,0,0 };


  52. //--------------------------------------

  53. void t0int() interrupt 1         //T0中断程序,控制发音的音调
  54. {
  55.         TR0 = 0;                                  //先关闭T0
  56.         speaker = !speaker;          //输出方波, 发音
  57.         TH0 = timer0h;                          //下次的中断时间, 这个时间, 控制音调高低
  58.         TL0 = timer0l;
  59.         TR0 = 1;                                  //启动T0
  60. }
  61. //--------------------------------------
  62. void delay(unsigned char t) //延时程序,控制发音的时间长度
  63. {
  64.         unsigned char t1;
  65.         unsigned long t2;
  66.         for(t1 = 0; t1 < t; t1++) //双重循环, 共延时t个半拍
  67.         for(t2 = 0; t2 < 8000; t2++); //延时期间, 可进入T0中断去发音
  68.         TR0 = 0;                                                 //关闭T0, 停止发音
  69. }
  70. //--------------------------------------
  71. void song() //演奏一个音符
  72.         {
  73.         TH0 = timer0h; //控制音调
  74.         TL0 = timer0l;
  75.         TR0 = 1; //启动T0, 由T0输出方波去发音
  76.         delay(time); //控制时间长度
  77.         }
  78. //--------------------------------------
  79. void main(void)
  80. {
  81.         unsigned char k, i;
  82.         TMOD = 1; //置T0定时工作方式1
  83.         ET0 = 1; //开T0中断
  84.         EA = 1; //开CPU中断
  85.         while(1)
  86.         {
  87.                 i = 0;
  88.                 time = 1;
  89.                 while(time)
  90.                 {
  91.                         k = song1[i] + 7 * song1[i + 1] - 1;
  92.                         //第i个是音符, 第i+1个是第几个八度
  93.                         timer0h = FREQH[k]; //从数据表中读出频率数值
  94.                         timer0l = FREQL[k]; //实际上, 是定时的时间长度
  95.                         time = song1[i + 2]; //读出时间长度数值
  96.                         i += 3;
  97.                         song(); //发出一个音符
  98.                 }
  99.         }
  100. }
复制代码
以上代码的Keil工程下载(附件内只有代码不含其他文件,您也可以自行复制以上代码建立工程,这样就不必下载了):
音乐播放器设计(新).rar (42.74 KB, 下载次数: 25)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶2 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表