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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1612|回復: 0
打印 上一主題 下一主題
收起左側

單片機電子琴功能實現問題 記憶,復讀這一步用數組實現不了

[復制鏈接]
跳轉到指定樓層
樓主
ID:775058 發表于 2020-6-10 15:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
隨機彈奏曲子時,可以實時記憶,并可復讀(重復播放)。這一步用數組實現不了請大神給看看
#include<reg51.h>
#define SMG P0
#define KEY P1                           //定義數碼管段碼輸出
sbit LED =P2^1 ;
sbit SPK =P2^0;
sbit K1= P3^2;     
sbit K2= P3^3;
sbit K3= P3^0;                                  //定義方波輸出口

unsigned int tone1,tone2,i;
/*****標準音符表*****/
//用于使定時器初值變化以產生相應頻率的定時
unsigned char code yinfu[]={0xfb,0xe9,      //Do
                            0xfc,0x5c,      //Re
                            0xfc,0xc1,      //Mi
                            0xfc,0xef,      //Fa
                            0xfd,0x45,      //So
                            0xfd,0x92,      //La
                            0xfd,0xd0,      //Si
                            0xfd,0xee,      //Do#
                            0x00,0x00     //音符之間的間隔,只要間隔時間小于65ms時,
                                                        //喇叭不會發出聲音,用作拍子之間的短暫停頓   
};


unsigned char code shengri_tone[]={   1,0,1,2,1,4,3,0,
                                      1,0,1,2,1,5,4,0,
                                      1,0,1,8,6,4,3,2,0,
                                      7,0,7,6,4,5,4,0       //0代表不發聲,即停頓;數字即為音調
                                   };


unsigned char code shengri_beat[]={   24,1,24,48,48,48,72,5,
                                      24,1,24,48,48,48,72,5,
                                      24,1,24,48,48,48,48,72,5,
                                      24,1,24,48,48,48,72,5
                                  };   //節拍,即tone表各音調的延時
unsigned char code button[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code dis[]={0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0xff};
unsigned char code yindiao[]={1,2,3,4,5,6,7,8};
unsigned char tanzou_tone[30];
unsigned char tanzou_beat[30];

/*****15ms延時子程序,用于節拍*****/
void delay(void)
{
       unsigned char n=15;
       while(n--)
       {
              unsigned char i;
              for(i=0;i<125;i++);
       }
}

/*****定時器0初始化*****/
void initTimer(void)
{
      TMOD=0x01;           //定時器0,工作方式1;定時器1,工作方式1
      TH0=tone1;
      TL0=tone2;
}

/*****定時器0中斷服務程序*****/
void timer0(void) interrupt 1
{
      TH0=tone1;
      TL0=tone2;
      SPK=~SPK;                           //取反,以產生方波
}

/*****演奏子程序1*****/
void play1(void)
{                 
       unsigned char m=0;
       unsigned char s;   
       unsigned char a=1;
       while(1)
       {
              EA=0;
              LED=0;
              a=shengri_tone[m];            //取音符
              SMG=dis[a-1];
              s=shengri_beat[m];           //取節拍
              tone1=yinfu[2*a-2];                           
              tone2=yinfu[2*a-1];                           
              EA=1;
              while(s--)
              {                           
                           
                     delay();
              }
                                         
             if((!K1)||(!K2))   //發現按鍵,立即退出播放
            {
              EA=0;
                  SPK=0;
                  SMG=0xff;
                  m=34;                                                                                                                      //改過已
              return;
            }
            else
              LED=1;
              m++;
              if(m>=33) return;      //數值是shengri相關表中的元素數量
           }   
               
}
void play2(void)
{                 
       unsigned char m=0;
       unsigned char s;   
       unsigned char a=1;
       while(1)
       {
              EA=0;
              LED=0;
              a=tanzou_tone[m];            //取音符
              SMG=dis[a-1];
              s=tanzou_beat[m];           //取節拍
              tone1=yinfu[2*a-2];                           
              tone2=yinfu[2*a-1];                           
              EA=1;
              while(s--)
              {                           
                           
                     delay();
              }
           if(P1!=0xff)   //發現按鍵,立即退出播放
            {
              EA=0;
                  SPK=0;
                  SMG=0xff;                                                                                                                     //改過已
              return;
            }
            else
                        {
              LED=1;
              m++;
              if(m>=29) return;      
            }
          }   
      
}

void Delay_xMs (unsigned int x)//延時函數
{
    unsigned int i,j;
    for(i=0;i<x;i++)
     {
       for(j=0;j<3;j++);
     }
}

void Button_Scan(void)
{
    i=0;
    P1=0xff;
    P3=0xff;
        if(KEY==button[0])
        {
          Delay_xMs(10);
           if(KEY==button[0])
           {
              tone1=0xfb;
                  tone2=0xe9;
                  SMG=dis[0];
                  EA=1;
           }
        }
        if(KEY==button[1])
        {
          Delay_xMs(10);
           if(KEY==button[1])
           {
              tone1=0xfc;
                  tone2=0x5c;
                  SMG=dis[1];
                   EA=1;
           }
        }
        if(KEY==button[2])
        {
           Delay_xMs(10);
           if(KEY==button[2])
           {
              tone1=0xfc;
                  tone2=0xc1;
                  SMG=dis[2];
                   EA=1;
           }
        }
        if(KEY==button[3])
        {
           Delay_xMs(10);
           if(KEY==button[3])
           {
              tone1=0xfc;
                  tone2=0xef;
                  SMG=dis[3];                 
                   EA=1;
           }
        }
        if(KEY==button[4])
        {
          Delay_xMs(10);
           if(KEY==button[4])
           {
             tone1=0xfd;
                 tone2=0x45;
                  SMG=dis[4];                  
                   EA=1;
           }
        }
        if(KEY==button[5])
        {
          Delay_xMs(10);
           if(KEY==button[5])
           {
              tone1=0xfd;
                  tone2=0x92;
                  SMG=dis[5];
                   EA=1;
           }
        }
        if(KEY==button[6])
        {
          Delay_xMs(10);
           if(KEY==button[6])
           {
              tone1=0xfd;
                  tone2=0xd0;
                  SMG=dis[6];
                   EA=1;
           }
        }
        if(KEY==button[7])
        {
          Delay_xMs(10);
           if(KEY==button[7])
           {
              tone1=0xfd;
                  tone2=0xee;
                  SMG=dis[7];
                   EA=1;
           }
         
        }
        if(KEY==0xff)
        {
           Delay_xMs(10);
           if(KEY==0xff)
           {
             EA=0;
                 SPK=0;
                 SMG=0xff;
           }
        }
         switch(P1)
         {
              case 0xfe:
                          while(KEY!=0xfe);
                          tanzou_tone[i++]=yindiao[0];
                      tanzou_beat[i++]=25;
                          break;
                          case 0xfd:
                           while(KEY!=0xfd);
                          tanzou_tone[i++]=yindiao[1];
                      tanzou_beat[i++]=25;
                          break;
                          case 0xfb:
                           while(KEY!=0xfb);
                          tanzou_tone[i++]=yindiao[2];
                      tanzou_beat[i++]=25;
                          break;
                          case 0xf7:
                           while(KEY!=0xf7);
                          tanzou_tone[i++]=yindiao[3];
                      tanzou_beat[i++]=25;
                          break;
                          case 0xef:
                           while(KEY!=0xef);
                          tanzou_tone[i++]=yindiao[4];
                      tanzou_beat[i++]=25;
                          break;
                          case 0xdf:
                           while(KEY!=0xdf);
                          tanzou_tone[i++]=yindiao[5];
                      tanzou_beat[i++]=25;
                          break;
                          case 0xbf:
                           while(KEY!=0xbf);
                          tanzou_tone[i++]=yindiao[6];
                      tanzou_beat[i++]=25;
                          break;
                          case 0x7f:
                           while(KEY!=0x7f);
                          tanzou_tone[i++]=yindiao[7];
                      tanzou_beat[i++]=25;
                          break;
         }
         switch(P3)
     {
              case 0xfb:play1();break;
                          case 0xfe:play2();break;
     }
}
void main(void)
{
       initTimer();
       SMG=dis[8];
       TR0=1;
       ET0=1;
       SPK=0;
       while(1)
       {
        Button_Scan();      
       }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久一区二区三区四区 | 国产一区二区自拍 | 国产激情三区 | 久久成人免费 | 超碰成人免费 | 超碰97人人人人人蜜桃 | 男人天堂网址 | 女同videos另类 | 欧美一区二区三区在线看 | 毛片99 | 一区二区三区免费在线观看 | 最新免费av网站 | 亚洲午夜网 | 一区二区三区国产好的精 | 国产精品1区2区 | 成人毛片视频免费 | 久久精品网 | 毛片一区二区 | 99视频在线看 | 成人精品一区二区三区中文字幕 | 中文字幕在线一区二区三区 | 一区二区在线免费观看视频 | 老司机久久 | 免费在线观看一区二区 | 97精品超碰一区二区三区 | 国产欧美一级二级三级在线视频 | 性一爱一乱一交一视频 | 亚洲日韩中文字幕一区 | 午夜在线| 欧美一级免费看 | 最新免费av网站 | 国产精选一区 | 日本三级电影在线看 | 一级免费看 | 日韩欧美国产不卡 | 日本精品视频在线观看 | 成人在线免费网站 | 国产精品久久久久久亚洲调教 | 日韩精品久久一区二区三区 | 色成人免费网站 | 免费在线观看一区二区 |