找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大神帮新手修改下程序,使其能在按下一个键时能唱一首歌,并显示其歌曲名,再按...

[复制链接]
跳转到指定楼层
楼主
ID:113969 发表于 2016-4-13 15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>  
#define uchar unsigned char
#define uint  unsigned int  
sbit fm=P2^3;
sbit b1=P1^0;
sbit b2=P1^1;
sbit b3=P1^2;//蜂鸣器连续的IO口  
uchar count2;//歌曲标志   
uchar timeh,timel,i;
uchar count=0;
  //---------------------------简谱--------------------------------------- //编程规则:字节高位是简谱,低位是持续时间, //代表多少个十六分音符  //1-7代表中央C调,8-E代表高八度,0代表停顿 //最后的0是结束标志
uchar code qnzl[]={  //千年之恋  
0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08, //前奏  
0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62, //竹林的灯火 到过的沙漠
0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22, //七色的国度 不断飘逸风中
0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62, //有一种神秘 灰色的旋涡
0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02, //将我卷入了迷雾中
0x63,0xA1,0xA2,0x62,0x92,0x82,0x52, //看不清的双手
0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02, //一朵花传来谁经过的温柔
0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76, //穿越千年的伤痛
0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36, //只为求一个结果
0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53, //你留下的轮廓 指引我  
0x42,0x63,0x83,0x83,0x91,0x91, //黑夜中不寂寞
0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76, //穿越千年的哀愁
0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36, //是你在尽头等我
0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53, //最美丽的感动 会值得
0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff//结束标志 //用一生守候
};
uchar code jmszl[]={ //寂寞沙洲冷
0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22, //自你走后心憔悴
0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14, //白色油桐风中纷飞
0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28, //落花似人有情 这个季节
0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52, //河畔的风放肆拼命地吹
0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63, //不断拨弄离人的眼泪  
0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54, //那样浓烈的爱再也无法给
0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26, //伤感一夜一夜
0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51, //当记忆的线缠绕过往支离破碎
0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34, //是慌乱占据了心扉           
0x31,0x81,0x81,0x81,0x61,0x91,0x82, //有花儿伴着蝴蝶
0x51,0x51,0x51,0x51,0x31,0x61,0x53, //孤雁可以双飞  
0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26, //夜深人静独徘徊
0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52, //当幸福恋人寄来红色分享喜悦
0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56, //闭上双眼难过头也不敢回
0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34, //仍然捡尽寒枝不肯安歇微带着后悔
0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16, //寂寞沙洲我该思念谁
0xff};
uchar code sszy[]={//世上只有妈妈好
0x96,0x82,0x64,0x84,0xb4,0x92,0x82,0x94,0x04,0x64,0x82,0x92,                    0x84,0x62,0x52,0x42,0x22,0x72,0x62,0x54,0x04,0x56,0x62,         0x84,0x82,0x92,0x66,0x52,0x44,0x04,0x86,0x62,0x54,0x42,0x22,0x42,0x14,0x04,0xff
};
uchar code zimo[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


//----------------------------简谱音调对应的定时器初值--------------------------- //适合11.0592M的晶振
uchar code cuzhi[]=
{  
        0xff,0xff,//占位   
        0xFC,0x8E,//中央C调1-7   
        0xFC,0xED,   
        0xFD,0x43,   
        0xFD,0x6A,   
        0xFD,0xB3,  
          0xFD,0xF3,   
        0xFE,0x2D,
          0xFE,0x47, //高八度1-7      
          0xFE,0x76,   
          0xFE,0xA1,  
           0xFE,0xC7,   
    0xFE,0xD9,  
        0xFE,0xF9,  
        0xFF,0x16  
};

void delay1(uint z); //延时1MS
void delay(uint z); //延时165MS,即十六分音符
void song();  
main()
{         

        P0=zimo[0];//改值可变换歌曲(1-3)  
    EA=1;//开总中断
    TMOD=0x01;//定时器0工作在方式1
    TH0=0;
    TL0=0;
    ET0=1;
            
  while(1)  
  {
  switch(P1)
        {
                case 0xfe:count2=1;break;
                case 0xfd:count2=2;break;
                case 0xfb:count2=3;break;
        }
          P0=zimo[count2];
        song();
           delay1(1000);

  }
}
void timer0() interrupt 1  //用于产生各种音调
{  
       
        TH0=timeh;  
        TL0=timel;
        fm=~fm;       
}
void song()
{         
        uint temp;
    uchar jp;//jp是简谱  
        i=0;
        while(1)  
        {   
            if(count2==0)   
                {     
                        break;
                  }
  if(count2==1) //选曲     
  temp=qnzl[i];   
  if(count2==2)  
  temp=jmszl[i];
  if(count2==3)
  temp=sszy[i];  
  if(temp==0xff)   
  break;     
  jp=temp/16; //取数的高4位   
  if(jp!=0)
  {
          timeh=cuzhi[jp*2];   
          timel=cuzhi[jp*2+1];   
  }   
  else
  {
  TR0=0;
  fm=1;//关蜂鸣器
  }
  delay(temp%16); //取数的低4位   
  TR0=0;  //唱完一个音停10MS   
  fm=1;   
  delay1(10);   
  TR0=1;   
  i++;  
  }
  TR0=0;  
  fm=1;
  }
void delay(uint z) //延时165MS,即十六分音符
{
        uint x,y;
        for(x=z;x>0;x--)   
        for(y=19000;y>0;y--);
}

void delay1(uint z) //延时1MS
{
        uint x,y;
        for(x=z;x>0;x--)   
        for(y=112;y>0;y--);
}
求大神帮我修改下程序,使其能在按下一个键时能唱一首歌,并显示其歌曲名,再按下别的键正在唱的歌停下去唱别的歌

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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