找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7844|回复: 9
收起左侧

单片机按键切换下一首歌

[复制链接]
ID:332269 发表于 2018-10-13 19:01 | 显示全部楼层 |阅读模式
  1. #include "at89x51.h"
  2. #define uchar unsigned char
  3. #define uint unsinged int

  4. sbit speaker=P1^5;//蜂鸣器。按键默认的是P3.2脚(外部中断0)
  5. uchar t0h,t0l,time,flag;
  6. //--------------------------------------
  7. //单片机晶振采用12MHz
  8. // 频率-半周期数据表 高八位  本软件共保存了四个八度的28个频率数据
  9. uchar code FREQH[]={0x01,                                                                         //0的时候没有音符
  10.                                         0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,                //低音1234567
  11.                                         0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,i
  12.                                         0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,                  //高音 234567
  13.                                         0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF};         //超高音 1234567
  14. //-----------------------------------------
  15. // 频率-半周期数据表 低八位
  16. uchar code FREQL[]={0x01,                                                                         //0的时候没有音符
  17.                                         0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,                //低音1234567
  18.                                         0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,i
  19.                                         0xEE,0x44,0x6B,0xB4,0xF4,0x2D,                   //高音 234567
  20.                                         0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16};        //超高音 1234567
  21. //--------------------------------------
  22. //一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以1/4拍为单位)。
  23. //6,2,6 分别代表:6,中音,6个1/4拍;
  24. //5,2,2 分别代表:5,中音,2个1/4拍;
  25. //3,2,4 分别代表:3,中音,4个1/4拍;
  26. //5,2,4 分别代表:5,中音,4个1/4拍;
  27. //1,3,4 分别代表:1,高音,4个1/4拍;
  28. //低音为1,中音为2,高音为3,超高音为4;
  29. //////////////////////////////////////////////////////////
  30. /********************世上只有妈妈好*********************/
  31. uchar code sszymmh[]={
  32.                                                 6,2,6,5,2,2,3,2,4,5,2,4,
  33.                                                 1,3,4,6,2,2,5,2,2,6,2,8,
  34.                                                 3,2,4,5,2,2,6,2,2,5,2,4,
  35.                                                 3,2,4,1,2,2,6,1,2,5,2,2,
  36.                                                 3,2,2,2,2,8,2,2,6,3,2,2,
  37.                                                 5,2,4,5,2,2,6,2,2,3,2,4,
  38.                                                 2,2,4,1,2,8,5,2,6,3,2,2,
  39.                                                 2,2,2,1,2,2,6,1,2,1,2,2,
  40.                                                 5,1,16,0,0,0};
  41. /**********************两只耗子**********************/
  42. uchar code TwoMouse[]={
  43.                                                 3,2,2,6,2,2,7,2,2,5,2,2,
  44.                                                 3,2,2,6,2,2,7,2,2,5,2,2,
  45.                                                 7,2,2,1,3,2,2,3,4,
  46.                                                 7,2,2,1,3,2,2,3,4,
  47.                                                 2,3,1,3,3,1,2,3,1,1,3,1,7,2,2,5,2,2,
  48.                                                 2,3,1,3,3,1,2,3,1,1,3,1,7,2,2,5,2,2,
  49.                                                 6,2,2,2,2,2,5,2,4,6,2,2,2,2,2,5,2,4,
  50.                                                 0,0,0};
  51. /***********************两只蝴蝶**********************/
  52. uchar code TwoButterfly[]={
  53.                                                 3,2,2,2,2,2,3,2,6,3,2,2,3,2,2,2,2,2,
  54.                                                 1,2,6,6,1,2,1,2,2,2,2,4,2,2,2,3,2,2,
  55.                                                 2,2,2,1,2,2,6,1,2,1,2,2,5,1,12,3,2,2,
  56.                                                 2,2,2,3,2,8,3,2,2,2,2,2,3,2,2,3,2,2,
  57.                                                 1,2,12,6,1,2,1,2,2,2,2,4,2,2,2,3,2,2,
  58.                                                 2,2,2,1,2,2,6,1,2,1,2,2,2,2,12,3,2,2,
  59.                                                 2,2,2,3,2,8,3,2,2,2,2,2,3,2,2,2,2,2,
  60.                                                 1,2,12,6,1,2,1,2,2,2,2,4,2,2,2,3,2,2,
  61.                                                 2,2,2,1,2,2,6,1,2,1,2,2,5,2,12,3,2,2,
  62.                                                 5,2,2,5,2,8,5,2,2,5,2,2,6,2,2,5,2,2,
  63.                                                 3,2,12,2,2,2,3,2,2,2,2,4,2,2,2,3,2,2,
  64.                                                 2,2,2,1,2,2,6,1,2,6,1,1,1,2,1,1,2,1,
  65.                                                 1,2,1,1,2,12,0,0,4,5,2,2,5,2,2,6,2,2,
  66.                                                 1,3,2,7,2,2,7,2,2,6,2,2,3,2,2,2,2,2,
  67.                                                 2,2,2,3,2,2,3,2,8,3,2,2,3,2,2,
  68.                                                 5,2,2,6,2,4,6,2,6,6,1,2,3,2,2,2,2,2,
  69.                                                 2,2,12,3,2,2,5,2,2,5,2,2,3,2,2,5,2,4,
  70.                                                 1,3,4,7,2,2,6,2,2,7,2,2,3,2,4,
  71.                                                 6,2,2,6,2,2,7,2,2,6,2,2,5,2,2,
  72.                                                 3,2,2,2,2,4,3,2,2,2,2,2,3,2,2,5,2,6,
  73.                                                 5,2,2,5,2,2,6,2,2,6,2,2,5,2,2,
  74.                                                 3,2,2,2,2,4,5,1,2,5,1,2,6,1,2,1,2,12,
  75.                                                 0,0,0};
  76. /*****************happy birthday***********************/
  77. uchar code Birthday[]={
  78.                                                 5,1,2,5,1,2,6,1,4,5,1,4,1,2,4,7,1,8,
  79.                                                 5,1,2,5,1,2,6,1,4,5,1,4,2,2,4,1,2,8,
  80.                                                 5,1,2,5,1,2,5,2,4,3,2,4,1,2,4,7,1,4,
  81.                                                 6,1,4,4,2,2,4,2,2,3,2,4,1,2,4,2,2,4,
  82.                                                 1,2,4,0,0,0};
  83. //-----------------------------------------------------
  84. void delay(uchar t)  //延时程序,控制发音的时间长度120ms(1/4拍)
  85. {
  86.         uchar a,b,c;
  87.         while(t--)  //四重循环,共延时t个1/4拍
  88.         {   
  89.                 for(c=193;c>0;c--)
  90.                         for(b=114;b>0;b--)
  91.                                 for(a=1;a>0;a--);
  92.         }
  93. //延时期间,可进入T0中断去发音
  94.         TR0=0;      //关闭T0,停止发音
  95. }
  96. //--------------------------------------
  97. void singachar()      //演奏一个音符
  98. {
  99.         TR0=0;
  100.         TH0=t0h;    //控制音调
  101.         TL0=t0l;
  102.         TR0=1;      //启动T0,由T0输出方波去发音
  103.         delay(time);     //控制时间长度即 节拍
  104. }
  105. //--------------------------------------
  106. //**************演奏一首歌***********************************//
  107. void song()
  108. {
  109.         uchar k,i,*str;
  110.         i=0;
  111.         time=1;
  112.         while(time)
  113.         {
  114.                 switch(flag)
  115.                 {
  116.                         case 1:str=sszymmh;break;
  117.                         case 2:str=TwoButterfly;break;
  118.                         case 3:str=Birthday;break;
  119.                         case 4:str=TwoMouse;break;
  120.                 }
  121.                 k=str[i]+7*(str[i+1]);//第i个是音符,第i+1个是第几个八度
  122.                 t0h=FREQH[k];//从数据表中读出频率数值
  123.                 t0l=FREQL[k];//实际上,是定时的时间长度
  124.                 time=str[i+2];//读出时间长度数值节拍时间
  125.                 i+=3;
  126.                 singachar();
  127.         }
  128. }
  129. //-----------------------------------------------------
  130. void t0int() interrupt 1   //T0中断程序,控制发音的音调
  131. {
  132.         TR0=0;      //先关闭T0
  133.         speaker=~speaker;   //输出方波,发音
  134.         TH0=t0h;    //下次的中断时间,这个时间,控制音调高低
  135.         TL0=t0l;
  136.         TR0=1;      //启动T0
  137. }
  138. //-----------------------------------------------------
  139. void int0() interrupt 0   //T0中断程序,控制发音的音调
  140. {
  141.         delay(1);
  142.         if(INT0==0)
  143.         {
  144.                 flag++;      //先关闭T0
  145.                
  146.                 if(flag>=5)
  147.                         flag=0;
  148.         }
  149.         while(INT0==0);
  150. }
  151. //--------------------------------------
  152. void main(void)
  153. {
  154.         TMOD=0x01;     //置T0定时工作方式1
  155.         IT0=1;
  156.         EX0=1;                 //外部中断0
  157.         ET0=1;      //开T0中断
  158.         EA=1;      //开CPU中断
  159.         while(1)
  160.         {
  161.                 song();
  162.                 delay(2);
  163. /*                song(sszymmh);
  164.                 delay(20);
  165.                 song(TwoButterfly);
  166.                 delay(20);
  167.                 song(Birthday);
  168.                 delay(20);*/
  169.         }
  170. //发出一个音符
  171. }
复制代码

评分

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

查看全部评分

回复

使用道具 举报

ID:399179 发表于 2018-10-13 19:31 来自手机 | 显示全部楼层
努力学习!一定要看懂程序!楼主真厉害
回复

使用道具 举报

ID:177599 发表于 2018-10-14 19:50 | 显示全部楼层
说好的按键切换歌曲 按键呢
回复

使用道具 举报

ID:332269 发表于 2018-10-16 20:57 | 显示全部楼层
P32呀,INT0默认的
回复

使用道具 举报

ID:357520 发表于 2018-10-16 21:19 | 显示全部楼层
有个电路图就更好了
回复

使用道具 举报

ID:332269 发表于 2018-10-26 09:36 | 显示全部楼层
jll586 发表于 2018-10-16 21:19
有个电路图就更好了

就一个按键和一个蜂鸣器呀
回复

使用道具 举报

ID:478505 发表于 2019-3-25 16:31 | 显示全部楼层
楼主幸苦了!
回复

使用道具 举报

ID:498164 发表于 2019-3-25 19:51 | 显示全部楼层
看着很厉害 还要查乐谱  需要花时间
回复

使用道具 举报

ID:784187 发表于 2020-6-22 14:44 | 显示全部楼层
chaopping 发表于 2018-10-14 19:50
说好的按键切换歌曲 按键呢

采用外部中断的方式切换歌曲,外部中断就是按键
回复

使用道具 举报

ID:867178 发表于 2020-12-24 16:25 | 显示全部楼层
怎么用手机蓝牙实现音乐播放啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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