欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 【求助】51單片機(jī)電子琴,1-7按鍵播放音符,8按鍵自動(dòng)播放音樂(lè) [打印本頁(yè)]

作者: 無(wú)所謂shine    時(shí)間: 2017-6-22 09:33
標(biāo)題: 【求助】51單片機(jī)電子琴,1-7按鍵播放音符,8按鍵自動(dòng)播放音樂(lè)
學(xué)校實(shí)訓(xùn),要求51實(shí)現(xiàn)電子琴,要求如題。
數(shù)碼管為共陰數(shù)碼管,但多了595芯片
程序借鑒了一部分網(wǎng)上內(nèi)容,目前可以實(shí)現(xiàn)1-7的發(fā)音和數(shù)碼管顯示,但按8按鍵卻蜂鳴器長(zhǎng)鳴,不知道什么地方出錯(cuò)
希望各位大神幫忙看下

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int


sbit BeepIO =P1^7;
sbit DI1 =P1^0;
sbit DI2 =P1^1;
sbit DI3 =P1^2;
sbit DI4 =P1^3;
sbit DIO =P1^4;
sbit RCK =P1^5;
sbit SCLK =P1^6;

uint tune[]={0xfc44,0xfcac,0xfd09,0xfd34,0xfd82,0xfdc8,0xfe07};
uchar code num[]={
                   0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
                                   0x00,0xff
                                  };
//void KeyProc(uchar dat);

uchar SoundTH;
uchar SoundTL;
unsigned char Time;
unsigned char High,Low; //定時(shí)器預(yù)裝值的高8位和低8位



                         // 音階頻率表 高八位
unsigned char code FREQH[]={
                         0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
                         0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
                         0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
                         0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
                               } ;
                         // 音階頻率表 低八位
unsigned char code FREQL[]={
                         0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
                         0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
                         0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
                         0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
                                };

                          //世上只有媽媽好數(shù)據(jù)表
unsigned char code MUSIC[]={ 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
                                      };
void KeyProc(uchar dat);
void delayTips(unsigned char t);
void PlaySong();

void Song()
{
   uchar i;
   uchar k;
   i=0;  
        while(i<100)
            {         
            k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振蕩頻率所需數(shù)據(jù)
            High=FREQH[k];
            Low=FREQL[k];
            Time=MUSIC[i+2];          //節(jié)拍時(shí)長(zhǎng)
            i=i+3;
                    PlaySong();
                //        delayTips(Time); //延時(shí)所需要的節(jié)拍  
                 if(P0==0xef)
                 {
                   while(P0==0xef);
                   break;
                 }
            }
  // PlaySong();
      TR0=0;
}

//延時(shí)函數(shù)大約約2*z+5us
void delay2xus(unsigned char z)
{
   while(z--);
}

// 延時(shí)函數(shù)大約約1ms
void delayms(unsigned char x)
{
   while(x--)
   {
     delay2xus(245);
     delay2xus(245);
   }
}

//節(jié)拍延時(shí)函數(shù)
void delayTips(unsigned char t)
{
    unsigned char i;
          for(i=0;i<t;i++)
    {
            delayms(250);
    }
    TR0=0;
}

//播放音樂(lè)的函數(shù)
void PlaySong()
{
   TH0=High;//賦值定時(shí)器時(shí)間,決定頻率
   TL0=Low;
   TR0=1;      //打開(kāi)定時(shí)器
   delayTips(Time); //延時(shí)所需要的節(jié)拍                     
}

/*
//void KeyProc(uchar dat);

void Song()
{
   uchar i;
   uchar k;
   i=0;  
       while(i<100)
            {         
            k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振蕩頻率所需數(shù)據(jù)
            High=FREQH[k];
            Low=FREQL[k];
            Time=MUSIC[i+2];          //節(jié)拍時(shí)長(zhǎng)
            i=i+3;
            }
   PlaySong();
}
*/



void LEDIO(uchar x)   
{
   uchar i;
   for(i=0;i<8;i++)
   {
     if(x&0x80)
           DIO = 1;
         else
           DIO = 0;

     SCLK = 0;
         SCLK = 1;
         x <<= 1;
   }
}
//數(shù)據(jù)送入74HC595的并口輸出寄存器
void LEDRCK()
{
  RCK = 0;
  RCK = 1;
}
//延時(shí)50*T時(shí)間函數(shù)
void delay_50ms(uint t)
{
   uint j;
   for(;t>0;t--)
   for(j=6254;j>0;j--)
           ;
}
/*void LEDdisplay()
{
  uchar i;
  for(i=0;i<18;)
  {
    LEDIO(num[i]);
        LEDRCK();
        delay_50ms(20);
        i++;
        if(i==18)
        i=0;
  }
}
*/
void main()
{  
   uchar dat;
   TMOD = 0X01;
   ET0 = 1;
   TR0 = 0;
   EA = 1;

   DI1 =1;
   DI2 =1;
   DI3 =1;
   DI4 =1;

   while(1)
   { dat=~P0;
     KeyProc(dat);
   }
}



void KeyProc(uchar dat)
{
    uchar i;
    if(dat==0x00)
        {
           TR0=0;BeepIO=1;
           return;
        }
    switch(dat)
    {
          case 0x01: i=0;
                     break;
          case 0x02: i=1;
                     break;
          case 0x04: i=2;
                     break;
          case 0x08: i=3;
                     break;
          case 0x10: i=4;
                     break;
          case 0x20: i=5;  
                                    break;
          case 0x40: i=6;
                     break;
          case 0x80: i=7;
                 break;
          default:break;
         }
     if(i<7)
         {
         LEDIO(num[i+1]);
         LEDRCK();

         SoundTH =tune[i]/256;
         SoundTL =tune[i]%256;
         TR0=1;}
         else
         {Song();
       
         }
}





void BeepTimer()interrupt 1
{
  BeepIO=!BeepIO;
  TH0= SoundTH;
  TL0= SoundTL;
}






作者: 無(wú)所謂shine    時(shí)間: 2017-6-22 13:43
自己頂下
作者: 溶月淡風(fēng)    時(shí)間: 2017-12-17 21:53
調(diào)試有錯(cuò)
作者: 小明1939604039    時(shí)間: 2017-12-17 22:08
你按鍵沒(méi)有消抖
作者: 郝炯    時(shí)間: 2017-12-17 22:59
消抖動(dòng)




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1