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

2019-03-24 17:01发布

#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它不会中断第一首歌播放第二首呀??要怎么改呢               

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
入门者lin
1楼-- · 2019-03-25 23:45
jinglixixi 发表于 2018-5-2 08:50
按键分析处理函数若不是以中断方式处理,则下面的程序无法循环进行按键分析,需为 keybrard();加一个循环处 ...

大哥 具体怎么处理呢
jinglixixi
2楼-- · 2019-03-26 03:46
入门者lin 发表于 2018-5-3 22:04
大哥 具体怎么处理呢

看了前面情况,你先看看开机后按K2、K3等是否播放对应的内容,如果正确说明键控处理部分是正确的。此时要解决的问题就是在播放过程中是不进行按键判别,只有播放后才会进行按键检测处理,所以就必须把按键判别处理改为中断处理型,既有按键操作就进行中断响应处理。鉴于外部中断只有2个,所以需要将按键设置在两个外部中断引脚。
ienglgge
3楼-- · 2019-03-26 04:47
 精彩回答 2  元偷偷看……
renshuang
4楼-- · 2019-03-26 10:03
一旦检测到某个按键按下就会在当前这个按键里的while中循环,知道播完一首才会退出整个while循环退出你按键判断的if,才会继续向下执行,判断其它按键,所以你这个程序一旦播放音乐时候是不会执行到检测其它按键按下的,所以要改就要把检测按键按下程序和播放程序分开,在定时中断中检测按键是否按下,有按下操作置一个标志位,主函数中检测到哪个标志位就播放音乐同时还要检测标志位的变化,播放音乐的过程中就需要在播放音乐的while循环上判断标志位有变化就要退出当前循环,根据标志位在选择播放。
总之,改动挺大。
yang_alex
5楼-- · 2019-03-26 12:58
按键检测改成中断方式,在中断程序中设按下标志。

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

改动也不是太大。

一周热门 更多>