久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 【求助】51單片機電子琴,1-7按鍵播放音符,8按鍵自動播放音樂 [打印本頁]

作者: 無所謂shine    時間: 2017-6-22 09:33
標題: 【求助】51單片機電子琴,1-7按鍵播放音符,8按鍵自動播放音樂
學校實訓,要求51實現電子琴,要求如題。
數碼管為共陰數碼管,但多了595芯片
程序借鑒了一部分網上內容,目前可以實現1-7的發音和數碼管顯示,但按8按鍵卻蜂鳴器長鳴,不知道什么地方出錯
希望各位大神幫忙看下

#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; //定時器預裝值的高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,
                                };

                          //世上只有媽媽好數據表
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;//去音符振蕩頻率所需數據
            High=FREQH[k];
            Low=FREQL[k];
            Time=MUSIC[i+2];          //節拍時長
            i=i+3;
                    PlaySong();
                //        delayTips(Time); //延時所需要的節拍  
                 if(P0==0xef)
                 {
                   while(P0==0xef);
                   break;
                 }
            }
  // PlaySong();
      TR0=0;
}

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

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

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

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

/*
//void KeyProc(uchar dat);

void Song()
{
   uchar i;
   uchar k;
   i=0;  
       while(i<100)
            {         
            k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振蕩頻率所需數據
            High=FREQH[k];
            Low=FREQL[k];
            Time=MUSIC[i+2];          //節拍時長
            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;
   }
}
//數據送入74HC595的并口輸出寄存器
void LEDRCK()
{
  RCK = 0;
  RCK = 1;
}
//延時50*T時間函數
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;
}






作者: 無所謂shine    時間: 2017-6-22 13:43
自己頂下
作者: 溶月淡風    時間: 2017-12-17 21:53
調試有錯
作者: 小明1939604039    時間: 2017-12-17 22:08
你按鍵沒有消抖
作者: 郝炯    時間: 2017-12-17 22:59
消抖動




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美日韩在线高清 | 成人福利电影 | 精品欧美一区免费观看α√ | 久久成人国产精品 | 精精久久 | 国产成人久久av免费高清密臂 | 成人 在线 | 国产成人网 | 夏同学福利网 | 欧美一级www片免费观看 | 亚洲成人免费 | 中文字幕在线中文 | 国产亚洲精品久久情网 | 亚洲视频一区 | 国产乱人伦精品一区二区 | a国产一区二区免费入口 | 久久之精品 | 91影视 | 国产大片一区 | 久久久这里都是精品 | 精品视频免费 | 亚洲第一成人av | 国产精品久久久久久久久久久新郎 | 成人在线观看免费 | 成人在线精品 | 五月天天色 | 最新免费av网站 | 亚洲国产激情 | 青青草华人在线视频 | 在线视频亚洲 | av香蕉 | 免费观看一区二区三区毛片 | 欧美一区免费 | 91亚洲国产成人久久精品网站 | 日韩av电影院 | 成人区精品 | 在线观看免费黄色片 | 成人精品久久久 | 国产精品一二三区在线观看 | 欧美精品日韩 | 欧美一区二区三区四区在线 |