找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助,下面的程序不能表达出按独立按键1唱曲1,按独立按键2唱曲2的功能

[复制链接]
跳转到指定楼层
楼主
ID:87568 发表于 2015-8-3 19:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
          /*此程序是51单片机c语言编写的电子琴+音乐播放器,当用杜邦线将P1^0管脚接地时,单片机就会放出《世上只有妈妈好》,将P1^1        管脚接地时单片机就播放《祝你生日快乐》,
两者为高电平时进入电子钢琴模式,利用16个矩阵键盘发出相应的哆、瑞、米、发、索。此文档的乐谱是借鉴别人的,因为本人是音乐白痴!这是我第一次发表,我希望能帮到有需要的人啦........*/       
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit  beep=P3^4;                  //定义蜂鸣器
sbit key1=P3^2;                 
sbit key2=P3^3;
void delayms(uint x);
uchar timer0h,timer0l,time,flag,i,k;                   //flag==0时为电子钢琴模式,flag==1时为音乐播放器
uchar code  yuepu[]={ 6,2,3,5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1, 6,2,4,
                                      3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1, 6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2, 5,2,1,
                                      6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1, 2,2,1,  1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0 };                           //世上只有妈妈好乐谱
uchar code yuepu1[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
                                 5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
                                 5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
                                 4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};                                        //祝你生日快乐乐谱
uchar code  TH_0[]={
                                     0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
                                            0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,
                                     0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,                                                   // 28个音阶高八位频率表 装进定时器高八位
                                     0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
                                    } ;
uchar code  TL_0[]={
                                        0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
                                        0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,                                  // 28个音阶低八位频率表 装进定时器 低八位
                                        0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
                                        0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
                                        };
void delay(uchar t)
{
        uchar t1;
        unsigned long t2;
    for(t1=0;t1<t;t1++)                //延时半拍函数,控制音乐节奏
    {
      for(t2=0;t2<8000;t2++)
         {  ; }
    }

}

/*音乐处理函数*/                                 
void song()
{
    TH0=timer0h;
    TL0=timer0l;                                                   // 唱歌程序
    TR0=1;
    delay(time);                                                      //延时,让此音节播放的长短
        TR0=0;                                             //关定时器,为下个音节响做准备
}

void keyscan()                                                                   //检测十六个发出音乐按键函数
{
   if(!key1)
     {         unsigned flag=1;
            uchar i=0;  
                while(i<100)                                          //音乐数组长度 ,唱完从头再来
                   {  
                        if(key1)                                          
                        {        beep=1;                                           //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开
                                break;  
                        }         
                        k=yuepu[i]+7*yuepu[i+1]-1;
                 timer0h=TH_0[k];                          // 把对应的音乐频率放进定时器0
                 timer0l=TL_0[k];
                 time=yuepu[i+2];                           //音乐节拍
                 i+=3;                                                               
                 song();          
         }
          }          
   if(!key2)            //        music为低电平时,播放《祝你生日快乐》
    {  unsigned flag=1;  
           i=0;  
       while(i<75)                                                  //乐谱的长度
           {   
                           if(key2)
                        {
                                beep=1;
                                break;
                        }         
               k=yuepu1[i]+7*yuepu1[i+1]-1;
               timer0h=TH_0[k];
               timer0l=TL_0[k];
               time=yuepu1[i+2];
               i+=3;
               song();
            }
         }
}                         
             
void main()
{
        TMOD=1;
        EA=1;
        ET0=1;
        while(1)
   {
         keyscan();
   }
}

/*定时器中断*/                                                          
void time0() interrupt 1
{
        if(flag==0)
        {           
                 beep=!beep;                    //电子琴模式时进入此语句
                 TH0=timer0h;
                 TL0=timer0l;
         }                                                  
        else
        {         beep=!beep;
                 TH0=timer0h;                   //音乐播放器模式进入此语句
                 TL0=timer0l;
        }                                  
}



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

使用道具 举报

沙发
ID:87573 发表于 2015-8-3 20:13 | 只看该作者
以前老师讲了。没太听明白的。。我就是想下载资料
回复

使用道具 举报

板凳
ID:79544 发表于 2015-8-3 20:57 | 只看该作者
刚才下了程序试了一下,独立按键可以实现播放的功能,就是要长按。
  1. //    if(key2)
  2.                        // {
  3.                                 beep=1;
  4.                                 break;
  5.                        // }
复制代码
把这几句屏蔽掉。在加上松手检测就OK啦。
回复

使用道具 举报

地板
ID:87568 发表于 2015-8-4 21:09 | 只看该作者
腾飞的龙 发表于 2015-8-3 20:57
刚才下了程序试了一下,独立按键可以实现播放的功能,就是要长按。把这几句屏蔽掉。在加上松手检测就OK啦。

你好!我用的板子是铁牛单片机开发板,我用你所教的方法在板子是运行了一次,发现还是不能实现功能,按了按键1和2,发现并没有实现功能。请教大神如何解决!
回复

使用道具 举报

5#
ID:79544 发表于 2015-8-6 14:29 | 只看该作者
改成这样我是可以实现多了按键控制两首歌播放
  1. void keyscan()                                                                   //检测十六个发出音乐按键函数
  2. {
  3.    if(!key1)
  4.      {         unsigned flag=1;
  5.             uchar i=0;  
  6.                 while(i<100)                                          //音乐数组长度 ,唱完从头再来
  7.                    {  
  8.                      //  if(key1)                                          
  9.                       //  {        beep=1;                                           //使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开
  10.                         //        break;  
  11.                        // }         
  12.                         k=yuepu[i]+7*yuepu[i+1]-1;
  13.                  timer0h=TH_0[k];                          // 把对应的音乐频率放进定时器0
  14.                  timer0l=TL_0[k];
  15.                  time=yuepu[i+2];                           //音乐节拍
  16.                  i+=3;                                                               
  17.                  song();           
  18.          }
  19.       while(!key1);
  20.           }         
  21.    if(!key2)            //        music为低电平时,播放《祝你生日快乐》
  22.     {  unsigned flag=1;  
  23.            i=0;  
  24.        while(i<75)                                                  //乐谱的长度
  25.            {   
  26.                         //   if(key2)
  27.                         //{
  28.                            //     beep=1;
  29.                            //     break;
  30.                        // }         
  31.                k=yuepu1[i]+7*yuepu1[i+1]-1;
  32.                timer0h=TH_0[k];
  33.                timer0l=TL_0[k];
  34.                time=yuepu1[i+2];
  35.                i+=3;
  36.                song();
  37.             }
  38.       while(!key2);
  39.          }
  40. }                        
  41.               
复制代码
回复

使用道具 举报

6#
ID:87568 发表于 2015-8-6 19:17 | 只看该作者
腾飞的龙 发表于 2015-8-6 14:29
改成这样我是可以实现多了按键控制两首歌播放

感谢你的答案,这对我的帮助很大!
回复

使用道具 举报

7#
ID:87568 发表于 2015-8-6 19:31 | 只看该作者
helloccz 发表于 2015-8-6 19:17
感谢你的答案,这对我的帮助很大!

不过我想问一下,他的问题出在哪?请大神指教!
回复

使用道具 举报

8#
ID:87790 发表于 2015-8-6 22:22 | 只看该作者
好样的,学习了
回复

使用道具 举报

9#
ID:79544 发表于 2015-8-20 17:17 | 只看该作者
helloccz 发表于 2015-8-6 19:17
感谢你的答案,这对我的帮助很大!

就出在这几句上,屏蔽掉就OK.//   if(key2)
                        //{
                           //     beep=1;
                           //     break;
                       // }     
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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