社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 875|回复: 11

[求助] 关于51单片机蜂鸣音乐播放的,大佬们来看看是什么问题

[复制链接]

10

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-5-1 21:33:58 | 显示全部楼层 |阅读模式
#include<reg52.h>   
#define uchar unsigned char
#define uint unsigned int
sbit sound=P3^0;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
char i,j;         
int C;   
#define L1  262             
#define L2  294   
#define L3  330   
#define L4  349   
#define L5  392   
#define L6  440   
#define L7  494

#define Z1    523     
#define Z2    587     
#define Z3           659     
#define Z4    698     
#define Z5    784     
#define Z6    880     
#define Z7    987         

#define H1  1046   
#define H2  1174   
#define H3  1318   
#define H4  1396   
#define H5  1567   
#define H6  1760   
#define H7  1975   
unsigned  int code f[]={               Z6,Z7,/**/H1,Z7,H1,H3,/**/Z7,Z3,Z3,   /**/Z6,Z5,Z6,H1,/**/Z5,Z3,Z3,   /**/Z4,Z3,Z4,H1,
                                       Z3,H1,H1,H1,/**/Z7,Z4,Z4,Z7,/**/Z7,Z6,Z7,   /**/H1,Z7,H1,H3,/**/Z7,Z3,Z3,   /**/Z6,Z5,Z6,H1,
                                Z5,      Z3,/**/Z4,H1,Z7,H1,/**/H2,H2,H2,H1,/**/H1,Z6,Z7,Z5,/**/Z6,H1,H2,   /**/H3,H2,H3,H5,
                                                               H2,Z5,Z5,   /**/H1,Z7,H1,H3,/**/H3,         /**/Z6,H1,Z7,H2,/**/H1,Z5,Z5,   /**/H4,H3,H2,H1,
                                                              H3,         /**/Z3,H3,      /**/H6,H5,H5,   /**/H3,H2,H1,H1,/**/H2,H1,H2,H5,/**/H3,H3,
                                                              H6,H5,      /**/H3,H2,H1,H1,/**/H2,H1,H2,Z7,/**/Z6,Z6,Z7,   /**/Z6,      
                                                                                      0xff};                        
unsigned char code JP[ ]={      4,4,  /**/12,4,8,8,   /**/20,4,4,     /**/12,4,8,8,   /**/20,4,4,     /**/12,4,4,12,
                                                                                20,4,4,4,   /**/12,4,8,8,   /**/20,4,4,     /**/12,4,8,8,   /**/20,4,4,     /**/12,4,8,8,
                                                                                32,      4, /**/8,4,6,8,    /**/4,4,4,16,   /**/8,4,6,8,    /**/24,4,4,     /**/12,4,8,8,
                                                                                24,4,4,     /**/4,4,8,8,    /**/32,                        /**/4,8,8,6,    /**/12,4,16,    /**/8,8,8,8,
                                                                                30,         /**/20,8,       /**/16,8,8,     /**/4,4,16,8,   /**/8,4,4,8,    /**/20,8,
                                                                                16,16,      /**/4,20,8,     /**/8,4,4,8,    /**/20,4,4,     /**/32,
                                                                          };
unsigned  int code f1[]={Z1,Z2,Z3,Z1 ,/**/ Z1,Z2,Z3,Z1, /**/ Z3,Z4,Z5, /**/ Z3,Z4,Z5/**/ ,Z5,Z6,Z5,Z4,Z3,Z1/**/,Z5,Z6,Z5,Z4,Z3,Z1, /**/ Z1,Z5,Z1, /**/ Z1,Z5,Z1 ,  0xff};                                
unsigned char code JP1[ ]={8,8,8,8 /**/ ,8,8,8,8/**/ ,8,8,12,/**/8,8,12,/**/ 4,4,4,4,8,8,/**/4,4,4,4,8,8,/**/8,8,12,/**/8,8,12        };
unsigned  int code f2[]={         Z3,Z1,Z3,Z3,Z1, /**/  Z3,Z3,Z5,Z6,Z5,  /**/  Z6,Z6,Z6,Z5,Z4,Z4,Z4, /**/  Z2,Z3,Z2,Z1,Z2,
                                  Z3,Z1,Z3,Z1, /**/ Z3,Z3,Z5,Z6,Z6 /**/,H1,Z5,Z5,Z6,Z3,Z2,Z1,Z2,Z3,Z5,/**/H1,Z5,Z5,Z6,Z3,Z2,Z1,Z2,Z3,Z1,0xff};
unsigned char code JP2[ ]={              8,8,4,4,8,  /**/  4,4,4,4,8,  /**/  4,4,4,4,4,4,8, /**/ 4,4,4,4,8,
                                  8,4,8,4, /**/ 4,4,4,4,4, /**/ 8,4,4,8,4,4,4,4,4,8,/**/ 8,4,4,8,4,4,4,4,4,16};  
unsigned  int code f3[]={  Z6,Z5,Z3,Z5,/**/H1,Z6,Z5,Z6,/**/Z3,Z5,Z6,Z5,Z3,/**/Z1,L6,Z5,Z3,Z2,/**/Z2,Z3,Z5,Z5,Z6,/**/Z3,Z2,Z1,/**/Z5,Z3,Z2,Z1,L6,Z1,/**/Z5,0xff};
unsigned char code JP3[ ]={8,4,8,8,/**/8,4,4,16,/**/8,4,4,8,8,/**/4,4,4,4,16,/**/8,4,8,4,4,/**/8,4,16,/**/8,4,4,4,4,4,/**/8};       
void init();
void keybrard();
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void main()
{
           init();  
     keybrard();
}
void Time0() interrupt 1
  {
    sound=!sound;      
    TH0=(8192-C)/32;   
    TL0=(8192-C)%32;        
  }
void init()
        {
        EA=1;
        ET0=1;
        TMOD=0X00;
        i=0;  
        }
void keybrard()
        {
                                 if(K1==0)
                                 {
                                         delay(5);
                                         if(K1==0)
                                         {
              while(f[i]!=0xff)         
                           {
              C=460830/f[i];          
              TH0=(8192-C)/32;   
              TL0=(8192-C)%32;  
              TR0=1;            
                                 for(j=0;j<JP[i];j++)  
                  delay(50);         
                                  TR0=0;                      
                              i++;               
                                  }  
                                 sound=1;                                 
                                }               
                        }                                         
                                 if(K2==0)
                                 {
                                         delay(5);
                                        if(K2==0)
                                        {
              while(f1[i]!=0xff)         
                           {
              C=460830/f1[i];          
              TH0=(8192-C)/32;   
              TL0=(8192-C)%32;  
              TR0=1;            
                                 for(j=0;j<JP1[i];j++)  
                  delay(50);         
                                   TR0=0;                      
                              i++;               
                                  }
                                 sound=1;                                 
                                }                       
                        }               
                                 if(K3==0)
                                 {
                                         delay(5);
                                        if(K3==0)
                                        {
              while(f2[i]!=0xff)         
                           {
              C=460830/f2[i];          
              TH0=(8192-C)/32;   
              TL0=(8192-C)%32;  
              TR0=1;            
                                 for(j=0;j<JP2[i];j++)  
                  delay(50);         
                                   TR0=0;                      
                              i++;               
                                  }  
                                 sound=1;
                                }                       
                        }                       
                                 if(K4==0)
                                 {
                                         delay(5);
                                         if(K4==0)
                                         {
              while(f3[i]!=0xff)         
                           {
              C=460830/f3[i];          
              TH0=(8192-C)/32;   
              TL0=(8192-C)%32;  
              TR0=1;            
                                 for(j=0;j<JP3[i];j++)  
                  delay(50);         
                                  TR0=0;                      
                              i++;               
                                  }  
                                 sound=1;                                 
                                }               
                        }                                         
                                 
                }       
这是代码,为什么我按K1,放第一首歌,这时候按K2它不会中断第一首歌播放第二首呀??要怎么改呢               

此帖出自51单片机论坛

电路图

电路图


回复

使用道具 举报

10

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2018-5-1 21:46:45 | 显示全部楼层
大佬们呢


回复

使用道具 举报

3102

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-5-1 23:48:32 | 显示全部楼层
那肯定是播放过程没有按键检测呗


回复

使用道具 举报

286

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-5-2 08:50:58 | 显示全部楼层
按键分析处理函数若不是以中断方式处理,则下面的程序无法循环进行按键分析,需为 keybrard();加一个循环处理。
void main()
{
           init();  
     keybrard();
}


回复

使用道具 举报

6774

TA的帖子

176

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 2018-5-2 11:08:07 | 显示全部楼层
void main()
{
            init();  
      keybrard();
}

没有大循环 只执行一次吧。。这个有问题


回复

使用道具 举报

3432

TA的帖子

11

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2018-5-3 09:21:17 | 显示全部楼层
void main()
{
           init();  
     keybrard();
}
变成
void main()
{
           init();  
while(1)
{
     keybrard();
}
}
你还可以在循环,里,执行以下切换动作,看看能否达到预期效果。检查切换本身的功能。


回复

使用道具 举报

10

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2018-5-3 21:00:48 | 显示全部楼层
ienglgge 发表于 2018-5-3 09:21
void main()
{
           init();  
     keybrard();
}
变成
void main()
{
           init(); ...

大哥 试了 还是不行呀

点评

你执行一下循环播放两首歌的动作。看看是否正常。确定正常 。把按键判断部分加上。  详情 回复 发表于 2018-5-7 17:55


回复

使用道具 举报

10

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2018-5-3 22:04:38 | 显示全部楼层
jinglixixi 发表于 2018-5-2 08:50
按键分析处理函数若不是以中断方式处理,则下面的程序无法循环进行按键分析,需为 keybrard();加一个循环处 ...

大哥 具体怎么处理呢

点评

看了前面情况,你先看看开机后按K2、K3等是否播放对应的内容,如果正确说明键控处理部分是正确的。此时要解决的问题就是在播放过程中是不进行按键判别,只有播放后才会进行按键检测处理,所以就必须把按键判别处理改  详情 回复 发表于 2018-5-4 08:02


回复

使用道具 举报

286

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-5-4 08:02:01 | 显示全部楼层
入门者lin 发表于 2018-5-3 22:04
大哥 具体怎么处理呢

看了前面情况,你先看看开机后按K2、K3等是否播放对应的内容,如果正确说明键控处理部分是正确的。此时要解决的问题就是在播放过程中是不进行按键判别,只有播放后才会进行按键检测处理,所以就必须把按键判别处理改为中断处理型,既有按键操作就进行中断响应处理。鉴于外部中断只有2个,所以需要将按键设置在两个外部中断引脚。


回复

使用道具 举报

3432

TA的帖子

11

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2018-5-7 17:55:26 | 显示全部楼层
入门者lin 发表于 2018-5-3 21:00
大哥 试了 还是不行呀

你执行一下循环播放两首歌的动作。看看是否正常。确定正常 。把按键判断部分加上。


回复

使用道具 举报

40

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-5-17 14:09:30 | 显示全部楼层
一旦检测到某个按键按下就会在当前这个按键里的while中循环,知道播完一首才会退出整个while循环退出你按键判断的if,才会继续向下执行,判断其它按键,所以你这个程序一旦播放音乐时候是不会执行到检测其它按键按下的,所以要改就要把检测按键按下程序和播放程序分开,在定时中断中检测按键是否按下,有按下操作置一个标志位,主函数中检测到哪个标志位就播放音乐同时还要检测标志位的变化,播放音乐的过程中就需要在播放音乐的while循环上判断标志位有变化就要退出当前循环,根据标志位在选择播放。
总之,改动挺大。


回复

使用道具 举报

860

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2018-5-17 15:12:16 | 显示全部楼层
按键检测改成中断方式,在中断程序中设按下标志。

在音乐播放的代码中在播放频率载入前检测上句中所说的按键状态,根据按键状态载入不同曲子的音乐频率。

改动也不是太大。


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-5-27 13:33 , Processed in 0.326648 second(s), 18 queries , Gzip On, Redis On.

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