找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2251|回复: 2
收起左侧

单片机按键音乐随机播放程序

[复制链接]
ID:292103 发表于 2018-8-20 12:31 | 显示全部楼层 |阅读模式
按键音乐随机播放
myphoto.jpg 副本 (1) myphoto.jpg 副本 (2) myphoto.jpg 副本 (3) myphoto.jpg

单片机源程序如下:
  1. #include  <reg52.h>

  2. sbit  buzzer = P2^5;   // 声明输出端
  3. unsigned char  keys,i;   // 声明按钮及播放谱变量
  4. unsigned char  tone_H, tone_L; // 声明计时量变量
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. uchar timeh,timel;//用于存放定时器的高8
  8. void  beat_125(unsigned char); // 声明节拍函数
  9. void play6(void);
  10. sbit key=P3^4;
  11. uchar code zbjbxf[]=
  12.    {  
  13.    0x64,0xA3,0xC1,0xA2,0x62,0x84,0x61,0x81,0x61,0xA4,
  14.    0xA1,0x91,0xA1,0x81,0x64,0xA3,0xC1,0xD2,0xD2,0xD2,
  15.    0xA2,0xC4,0xA1,0xC1,0xA1,0xC1,0xD2,0xD2,0xD2,0xA2,
  16.    0x25,0xC2,0x62,0xC2,0x62,0xA2,0xA2,0x84,0x94,0x94,
  17.    0x92,0x81,0x91, 0xA2,0xC2,0xD4,0xE4,0xA4,0xE4,0xA2,
  18.    0xE2,0xA2,0xE2,0xA2, 0xA2,0x84,0x94,0x94,0x92,0x81,
  19.    0x91,0xA2,0xC2,0xD8
  20.    };

  21. uchar code chuzhi[]=
  22.    {
  23.    0xff,0xff,0xFC,0x8E,0xFC, 0xED,0xFD,0x43,0xFD,0x6A,
  24.    0xFD,0xB3,0xFD,0xF3,0xFE,0x2D,0xFE, 0x47,0xFE,0x76,
  25.    0xFE,0xA1,0xFE,0xC7,0xFE,0xD9,0xFE,0xF9,0xFF,0x16
  26.    };

  27. void delay(uint z)
  28. {        uint y;
  29.     for(z;z>0;z--)
  30.         for(y=19000;y>0;y--);
  31. }

  32. void delay1(uint z)
  33. {        uint y;
  34.     for(z;z>0;z--)
  35.         for(y=112;y>0;y--);
  36. }


  37. unsigned char code song1[]={ 1, 1, 2, 1,  4, 3,  1, 1, 2, 1,  5, 4,
  38.         1, 1, 8, 6,  4, 3, 2,  11, 11, 6, 4,  5, 4,  15 };
  39. unsigned char code beat1[]={ 4, 4, 8, 8,  8, 16,  4, 4, 8, 8,  8, 16,
  40.         4, 4, 8, 8,  8, 8, 8,  4, 4, 8, 8,  8, 16 };
  41. unsigned char code song2[]={ 1, 1, 1,  3, 2, 1,  3, 3, 3,  5, 4, 3,  5, 4, 3,  2,
  42.         2, 1, 0,  1, 2, 3,  4, 3, 2,  3, 4, 5,  5, 4, 3, 2,  1, 15};
  43. unsigned char code beat2[]={ 4, 4, 4,  6, 2, 4,  4, 4, 4,  6, 2, 4,  4, 4, 4,  12 ,
  44.           8, 2, 2,  4, 4, 4,  8, 2, 2,  4, 4, 4,  2, 2, 4, 4,  12 };
  45. unsigned char code song3[]={ 8, 7, 6, 5, 5,  6, 8, 5,  6, 5, 3, 2, 5,  3, 12,
  46.           8, 7, 6, 5, 5,  6, 8, 5,  6, 5, 3, 2, 5,  1, 12,
  47.           2, 3, 2, 5,   6, 5, 6, 8,   9, 8, 7, 6, 9,  5, 12,
  48.           6, 8, 5, 6,  3, 5, 6, 5, 3,  2, 3, 5, 3, 2,  1, 0,  15 };
  49. unsigned char code beat3[]={ 8, 4, 4, 8, 8,  8, 8, 16,  8, 4, 4, 8, 8,  24, 8,
  50.         8, 4, 4, 8, 8,  8, 8, 16,  8, 4, 4, 8, 8,  24, 8,
  51.         8, 4, 4, 16,  8, 4, 4, 16,  8, 4, 4, 8, 8,  24, 8,
  52.         8, 8, 8, 8,  8, 4, 4, 8, 8,  8, 4, 4, 8, 8,  32 };
  53. unsigned char code song4[]={ 2, 2, 3, 5,  6, 5, 6, 7,  9, 7, 7, 6, 5,  6,
  54.         7, 9, 9, 7, 9,  5, 6, 6,  2, 7, 7, 6, 5,  5,
  55.         6, 6, 7, 6, 5,  3, 2, 3, 5,  3, 5, 6, 7,  9,
  56.         9, 9, 10, 9, 7,  7, 6, 5, 3,  2, 7, 7, 6, 5,  5,  15};
  57. unsigned char code beat4[]={ 12, 4, 8, 8,  8, 4, 4, 16,  12, 4, 4, 4, 8,  32,
  58.         12, 4, 8, 4, 4,  12, 4, 16,  12, 4, 8, 4, 4,  32,
  59.         12, 4, 8, 4, 4,  8, 4, 4, 16,  12, 8, 8, 8,  32,
  60.         12, 4, 8, 4, 4,  8, 4, 4, 16,  12, 4, 8, 4, 4,  32  };

  61. unsigned char code song5[]={    6,2,3,      5,2,1,      3,2,2,    5,2,2,    1,3,2,   6,2,1,    5,2,1,
  62.                                 6,2,4,      3,2,2,      5,2,1,    6,2,1,         5,2,2,          3,2,2,    1,2,1,
  63.                                 6,1,1,      5,2,1,      3,2,1,           2,2,4,         2,2,3,          3,2,1,    5,2,2,
  64.                                 5,2,1,      6,2,1,      3,2,2,           2,2,2,    1,2,4,          5,2,3,    3,2,1,
  65.                                 2,2,1,      1,2,1,      6,1,1,           1,2,1,         5,1,6,          0,0,0  };

  66. unsigned int code tone[]={ 1012, 956, 852, 759, 716, 638, 568, 506, 478, 426, 379,531, 10 };//音阶定义
  67. void play1(void);     // 声明play1函数
  68. void play2(void);     // 声明play2函数
  69. void play3(void);     // 声明play3函数
  70. void play4(void);
  71. void play5(void);    // 声明play5函数
  72. void beat_125(unsigned char); // 声明节拍函数

  73. //================================================

  74. //==第一首歌=================================


  75. void play1(void)
  76. { i=0;
  77. while(song1[i]!=15)   // while循环开始
  78. { tone_H=(65536-tone[song1[i]])/256;// 读取音阶计数量之高八位元
  79.   tone_L=(65536-tone[song1[i]])%256;// 读取音阶计数量之低八位元
  80.   TH0=tone_H;    // 填入音阶计数量之高八位元
  81.   TL0=tone_L;    // 填入音阶计数量之低八位元
  82.   TR0=1;     // 启动TImer 0
  83.   beat_125(beat1[i]);  // 指定节拍
  84.   i++;     // 下一个音
  85.   TR0=0;     // 关闭TImer 0
  86. }       // 结束播放
  87. }     
  88. //==第二首歌=================================
  89. void play2(void)
  90. { i=0;
  91. while(song2[i]!=15)   // while循环开始
  92. { tone_H=(65536-tone[song2[i]])/256;// 读取音阶计数量之高八位元
  93.   tone_L=(65536-tone[song2[i]])%256;// 读取音阶计数量之低八位元
  94.   TH0=tone_H;    // 填入音阶计数量之高八位元
  95.   TL0=tone_L;    // 填入音阶计数量之低八位元
  96.   TR0=1;     // 启动TImer 0
  97.   beat_125(beat2[i]);  // 指定节拍
  98.   i++;     // 下一个音
  99.   TR0=0;     // 关闭Timer 0
  100. }   
  101. }        // 结束播放
  102. //==第三首歌=================================
  103. void play3(void)
  104. { i=0;
  105. while(song3[i]!=15)   // while循环开始
  106. { tone_H=(65536-tone[song3[i]])/256;// 读取音阶计数量之高八位元
  107.   tone_L=(65536-tone[song3[i]])%256;// 读取音阶计数量之低八位元
  108.   TH0=tone_H;    // 填入音阶计数量之高八位元
  109.   TL0=tone_L;    // 填入音阶计数量之低八位元
  110.   TR0=1;     // 启动Timer 0
  111.   beat_125(beat3[i]);  // 指定节拍
  112.   i++;     // 下一个音
  113.   TR0=0;     // 关闭Timer 0
  114. }   
  115. }        // 结束播放
  116. //==第四首歌=================================
  117. void play4(void)
  118. { i=0;
  119. while(song4[i]!=15)   // while循环开始
  120. { tone_H=(65536-tone[song4[i]])/256;// 读取音阶计数量之高八位元
  121.   tone_L=(65536-tone[song4[i]])%256;// 读取音阶计数量之低八位元
  122.   TH0=tone_H;    // 填入音阶计数量之高八位元
  123.   TL0=tone_L;    // 填入音阶计数量之低八位元
  124.   TR0=1;     // 启动Timer 0
  125.   beat_125(beat4[i]);  // 指定节拍
  126.   i++;     // 下一个音
  127.   TR0=0;     // 关闭Timer 0
  128. }   
  129. }        // 结束播放

  130. void play5(void)
  131. { i=0;
  132. while(song5[i]!=15)   // while循环开始
  133. { tone_H=(65536-tone[song5[i]])/256;// 读取音阶计数量之高八位元
  134.   tone_L=(65536-tone[song5[i]])%256;// 读取音阶计数量之低八位元
  135. TH0=tone_H;    // 填入音阶计数量之高八位元
  136. TL0=tone_L;    // 填入音阶计数量之低八位元
  137.   TR0=1;     // 启动Timer 0
  138.   beat_125(beat4[i]);  // 指定节拍
  139. i++;     // 下一个音
  140. TR0=0;     // 关闭Timer 0
  141. }   
  142. }
  143. void play6()
  144. {
  145. uint temp; //存放简谱数组中的每一个音符的临时变量
  146.   uchar jp; //jp 用于取出temp
  147.   uchar i=0;
  148.    while(1)
  149.    {
  150.            temp=zbjbxf[i];
  151.     if(temp==0xff) break;
  152.     jp=temp/16;
  153.             if(jp!=0)
  154.          {
  155.            tone_H=chuzhi[jp*2];
  156.            tone_L=chuzhi[jp*2+1];
  157.            TR0=1;//开定时器
  158.          }
  159.          else {TR0=0;buzzer=1;}
  160.         delay(temp%16);TR0=0;buzzer=1; delay1(5); TR0=1;i++;//关定时器
  161.    }
  162.     TR0=0;//关定时器
  163.     buzzer=1; //关蜂鸣器
  164. }

  165. //====Timer 0中断子程序==================
  166. void tone_timer(void) interrupt 1 // Timer 0中断子程序开始
  167. { TH0=tone_H;     // 填入计时量之高八位元
  168. TL0=tone_L;     // 填入计时量之低八位元  
  169. buzzer=~buzzer;    // 蜂 器反相输出
  170. }        // 结束中断子程序
  171. //====节拍函数==================
  172. void beat_125(unsigned char x) // 节拍函数开始
  173. { unsigned char i,j,k;  // 声明变量
  174. for (i=0;i<x;i++)   // i循环
  175.   for (j=0;j<125;j++)  // j循环
  176.    for (k=0;k<120;k++);// k循环  
  177. }        // 结束节拍函数

  178. void delay3(unsigned int x)
  179. {
  180.         unsigned int i;
  181.         while(x--)
  182.         {
  183.                 for(i=0;i<113;i++);

  184.         }
  185. }
  186. void suiji()
  187. {

  188. uint num;
  189. num=rand();
  190. if(key==0)
  191.   {delay(1);if(key==0)
  192.   {         switch (num%10){
  193.      case 0x01 : delay3(800);play1();break; // 按下S1,播放第一首歌
  194.      case 0x02 : delay3(800);play2(); break; // 按下S2,播放第二首歌
  195.      case 0x03 : delay3(800);play3(); break; // 按下S3,播放第三首歌
  196.      case 0x04 : delay3(800);play4(); break; // 按下S4,播放第四首歌
  197.          case 0x05: delay3(800);play5(); break; //
  198.          case 0x06: delay3(800);play6();break;
  199.          case 0x07: delay3(800);play1();break;
  200.          case 0x08: delay3(800);play3();break;
  201.          case 0x09: delay3(800);play2();break;
  202.          case 0x00: delay3(800);play6();break;
  203.           }
  204.   }
  205. }

  206. }
  207. main()
  208. {
  209. TMOD=0x01;         // 设定MODE1   

  210. //buzzer=1;     // 蜂 器初始值
  211. IE=0x82;      // 启用TImer 0
  212. while (1)     // while循环
  213. { suiji();
  214. // P3=0xff;    // 将Port2规划为输入埠
  215.   //keys=~P2;    // 读取按钮
  216. // switch (keys)   // 判读
  217. // { case 0x01: play1(); break; // 按下S1,播放第一首歌
  218.    // case 0x02: play2(); break; // 按下S2,播放第二首歌
  219.    // case 0x04: play3(); break; // 按下S3,播放第三首歌
  220.    // case 0x08: play4(); break; // 按下S4,播放第四首歌
  221. //        case 0x12: play5(); break; //
  222. //        case 0x10: play6(); break;
  223.        
  224. // }  buzzer=1;   // 蜂 器不动作
  225.   
  226. }       // while循环结束
  227. }        // 主程序结束  
复制代码

所有资料51hei提供下载:
随机播放.doc (50.5 KB, 下载次数: 12)

评分

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

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-8-21 03:25 | 显示全部楼层
代码不完整?
回复

使用道具 举报

ID:292103 发表于 2018-8-21 06:27 来自手机 | 显示全部楼层
本帖最后由 bulia 于 2018-8-21 10:58 编辑
admin 发表于 2018-8-21 03:25
代码不完整?

您好!PLAY5有问题噢!去掉了!

随机播放.c.doc

44.5 KB, 下载次数: 3, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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