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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機電子琴程序原理圖PCB文件,供大家參考學習使用

[復制鏈接]
跳轉到指定樓層
樓主
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


制作出來的實物圖如下:


單片機源程序如下:
  1. /************************************************************************
  2. *硬件連接:二十二個微動開關,一個蜂鳴器,二十一個彈奏鍵,一個功能切換。        *
  3. *功    能:電子琴彈奏,按鍵切換播放。                                                                        *
  4. 彈奏模式切換,添加歌曲。                                                        *
  5. *添加LED燈模式。                                                                        *
  6. *LED燈狀態調試。                                                                        *
  7. ************************************************************************/

  8. #include<reg51.h>
  9. sbit QH=P2^7;           //P2^7口定義為切換功能
  10. sbit BUZZ=P1^7;           //P1^7口定義為蜂鳴器
  11. unsigned int H,L;  //定時器0緩沖變量
  12. unsigned char  k=0x00; //按鍵標志位

  13. void init(void)                 //初始化程序
  14. {
  15.         P0=P1=P2=P3=0xff; //初始化P0,P1,P2,P3口將他們的初值全為1
  16.         BUZZ=1;                      //初始化蜂鳴器鳴器
  17.         QH=1;                  //初始按鍵為1關閉狀態
  18.         ET0=1;                     //初始化開定時計數器0中斷
  19.         EA=1;            //初始化開總中斷
  20.         TMOD=0x01;                 //設計定時計數器timer 0工作方式為1

  21. }
  22. void delayms(unsigned int i)         //延時1ms程序 用來按鍵消抖
  23. {
  24.         unsigned int j;
  25.         while(i--)
  26.                         for(j=600;j>0;j--);
  27. }
  28. void delay(unsigned int i)                //按鍵延時程序  用來掃描按鍵 算音長值
  29. {
  30.         unsigned int j;
  31.         while(i--)
  32.         {
  33.                  for(j=600;j>0;j--);
  34.                          if(!QH)                                  //判斷在唱歌模式是否摁下模式轉換按鈕
  35.                         delayms(10);
  36.                         if(!QH)
  37.                         {
  38.                                 k=~k;                          //如果按下改變標志位的值。
  39.                                                 }
  40.                         while(!QH);
  41.         }
  42. }


  43. void tanzou(void)                   //彈奏模式
  44. {
  45.         unsigned int tone[]={262,294,330,349,392,440,494};  //低音
  46.         unsigned int tone1[]={523,587,659,698,784,880,988};        //中音
  47.         unsigned int tone2[]={1046,1175,1318,1397,1568,1760,1976};//高音
  48.         unsigned int a=0,b=0,c=0;  //定義a,b,c三個變量。
  49.            switch(~P1)                                  //高音7鍵判斷鍵值符合符合鍵值跳出判斷
  50.                 {        case 0x00:a=0;break;
  51.                     case 0x01:a=1;P0=~0x01;break; //按下按鈕對應的燈亮
  52.                           case 0x02:a=2;P0=~0x02;break; //因為不管是中高低音都有同樣的音,所以我們把相同的音放在一個燈上。
  53.                         case 0x04:a=3;P0=~0x04;break;
  54.                           case 0x08:a=4;P0=~0x08;break;
  55.                         case 0x10:a=5;P0=~0x10;break;
  56.                     case 0x20:a=6;P0=~0x20;break;
  57.                     case 0x40:a=7;P0=~0x40;break;
  58.                 }
  59.                 if(a!=0)                                    // 判斷鍵值
  60.                 {
  61.                         H=(65536-1000000/tone[a-1]/2)/256;                // 取值,取對應數組中的音值。
  62.                         L=(65536-1000000/tone[a-1]/2)%256;

  63.                         TH0=H;
  64.                         TL0=L;                                    //定時計數器0賦值
  65.                         TR0=1;                                            //開定時計數器0
  66.                         while(P1!=0xff);                    //判斷按鍵是否彈起
  67.                         TR0=0;                                    //關定時計數器0
  68.                         BUZZ=1;                                    //關蜂鳴器
  69.                 }
  70.                 else
  71.                 {
  72.                         TR0=0;                                    //沒有任何按鍵按下關定時計數器0
  73.                         BUZZ=1;                                    //關蜂鳴器
  74.                 }
  75.                 if(a!=1||a!=2||a!=3||a!=4||a!=5||a!=6||a!=7)         //如果沒有按鍵按下那么P0口為全1
  76.                 {
  77.                            P0=0xff;
  78.                 }
  79.                 switch(~P2)                                    //中音7鍵
  80.                 {        case 0x00:b=0;break;
  81.                     case 0x01:b=1;P0=~0x01;break;
  82.                           case 0x02:b=2;P0=~0x02;break;
  83.                         case 0x04:b=3;P0=~0x04;break;
  84.                           case 0x08:b=4;P0=~0x08;break;
  85.                         case 0x10:b=5;P0=~0x10;break;
  86.                     case 0x20:b=6;P0=~0x20;break;
  87.                     case 0x40:b=7;P0=~0x40;break;
  88.                         }
  89.                 if(b!=0)                                // 中音7鍵判斷鍵值符合符合鍵值跳出判斷
  90.                 {
  91.                         H=(65536-1000000/tone1[b-1]/2)/256;                // 取值,取對應數組中的音值。
  92.                         L=(65536-1000000/tone1[b-1]/2)%256;

  93.                         TH0=H;
  94.                         TL0=L;                                   //定時計數器0賦值
  95.                         TR0=1;                                           //開定時計數器0
  96.                         while(P2!=0xff);                   //判斷按鍵是否彈起 出入不等于全一那么持續響按下的音
  97.                         TR0=0;                                   //沒有任何鍵按下關定時計數器0
  98.                         BUZZ=1;                                    //關蜂鳴器
  99.                         }
  100.                 else
  101.                 {
  102.                         TR0=0;                                   //關定時計數器0
  103.                         BUZZ=1;                                    //關蜂鳴器
  104.                 }
  105.                 if(a!=1||a!=2||a!=3||a!=4||a!=5||a!=6||a!=7)
  106.                 {
  107.                            P0=0xff;
  108.                 }
  109.                 switch(~P3)                                  //低音7鍵判斷鍵值符合符合鍵值跳出判斷
  110.                 {
  111.                         case 0x00:c=0;break;
  112.                            case 0x01:c=1;P0=~0x01;break;
  113.                           case 0x02:c=2;P0=~0x02;break;
  114.                         case 0x04:c=3;P0=~0x04;break;
  115.                     case 0x08:c=4;P0=~0x08;break;
  116.                         case 0x10:c=5;P0=~0x10;break;
  117.                         case 0x20:c=6;P0=~0x20;break;
  118.                         case 0x40:c=7;P0=~0x40;break;
  119.                 }
  120.                 if(c!=0)
  121.                 {
  122.                         H=(65536-1000000/tone2[c-1]/2)/256;           // 取值,取對應數組中的音值
  123.                         L=(65536-1000000/tone2[c-1]/2)%256;
  124.                         TH0=H;
  125.                         TL0=L;
  126.                         TR0=1;
  127.                         while(P3!=0xff);                       //判斷按鍵是否彈起
  128.                         TR0=0;                                        //關定時計數器0
  129.                         BUZZ=1;                                       //關蜂鳴器
  130.                 }
  131.                 else
  132.                 {
  133.                         TR0=0;                                          //沒有任何按鍵按下關定時計數器0
  134.                         BUZZ=1;                                          //關蜂鳴器
  135.                 }
  136.                 if(a!=1||a!=2||a!=3||a!=4||a!=5||a!=6||a!=7)
  137.                 {
  138.                            P0=0xff;
  139.                 }
  140.           }
  141. void bofang(void)           //播放模式
  142. {
  143.         unsigned int i=0;         //定義i=0


  144.         //播放的音調
  145.         unsigned int code tone[]={        523,587,659,698,784,880,988, //中音7調
  146.                                                     1046,1175,1318,1397,1568,1760,1976, //高音7調
  147.                                                       262,294,330,349,392,440,494,99 //低音7調
  148.                                                   };
  149.         //1.茉莉花
  150.         unsigned int code yd[]={3,3,5,6,8,8,6,5,5,6,5,3,3,5,6,8,8,6,5,5,6,5,5,5,5,3,5,6,6,5,
  151.                                                  3,2,3,5,3,2,1,1,2,1,3,2,1,3,2,3,5,6,8,5,2,3,5,2,3,1,20,19,
  152.                                                  20,1,2,3,1,2,1,20,19,0,99};
  153.         float code yc[]={        1,0.5,0.5,0.5,0.5,0.5,0.5,1,0.5,0.5,2,1,0.5,0.5,0.5,0.5,0.5,0.5,1,0.5,0.5,2,
  154.                                          1,1,1,0.5,0.5,1,1,2,1,0.5,0.5,1,0.5,0.5,1,0.5,0.5,2,0.5,0.5,0.5,0.5,1.5,0.5,1,0.5,0.5,2,
  155.                                          1,0.5,0.5,0.5,0.5,0.5,0.5,2,1,1,1.5,0.5,0.5,0.5,0.5,0.5,3,1};


  156.         P0=0XFF;
  157.         while(yd[i]!=99)

  158.         {
  159.                  H=(65536-1000000/tone[yd[i]-1]/2)/256;           // 取值,取對應數組中的音值
  160.                  L=(65536-1000000/tone[yd[i]-1]/2)%256;
  161.                  TH0=H;
  162.                  TL0=L;
  163.                  TR0=1;
  164.                  delay(400*yc[i]);
  165.                  if(k==0x00)break;                           //如果標志位等于0x00那么跳出播放模式
  166.                  TR0=0;                                                  //關定時計數器0
  167.                  BUZZ=1;                                          //關蜂鳴器
  168.                  i++;                                                                  //i的值每次加1
  169.                  if(i==99)  break;                                        //當i等于99的時候跳出循環
  170.         }


  171. }

  172. void main(void)                                        //主函數
  173. {
  174.         init();                         //調用初始化程序
  175.         while(1)
  176.         {
  177.                 if(!QH)
  178.                         {
  179.                         delayms(10);
  180.                         if(!QH)
  181.                                 {                                      //判斷QH是否按下
  182.                                         k=~k;                //兩種模式切換
  183.                                 }
  184.                                 while(!QH);
  185.                                 delayms(10);
  186.                          }
  187.                 switch(k)         //判斷按鍵
  188.                 {
  189.                         case 0x00:tanzou();break; //調用子函數
  190.                         case 0xff:bofang();break;
  191.                 }


  192.     }
  193. }

  194. void timer0(void) interrupt 1        //定時計數器0
  195. {
  196.         TR0=0;                            //關定時計數器0
  197.         TH0=H;                                                  //接收賦值
  198.         TL0=L;                                                  //接收賦值
  199.         BUZZ=~BUZZ;                                         //蜂鳴器發聲
  200.         TR0=1;                             //開定時計數器0
  201. }

復制代碼

原理圖Altium Designer PCB文件和代碼下載: 電子琴.7z (11.93 MB, 下載次數: 29)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成年人的视频免费观看 | 国产精品久久 | 91不卡| 一级做a爰片性色毛片16美国 | 国产成人高清在线观看 | 欧美大片一区二区 | 国产成人99久久亚洲综合精品 | 91视频.com | 最近最新中文字幕 | 91亚洲精选 | 亚洲国产精品久久久 | 一级在线视频 | 亚洲免费网 | 国产第一页在线播放 | 不用播放器看的av | 亚洲在线观看视频 | 成人小视频在线观看 | 日韩视频免费看 | 一区二区三区四区av | 黄网站免费在线看 | 国产精品欧美一区二区三区 | 人人九九精 | 国产精品黄色 | 日本精品视频 | 欧美日韩不卡合集视频 | 91精品国产综合久久香蕉麻豆 | 91精品国产一区二区三区 | 日日操视频 | 久久久久国产精品午夜一区 | 国产丝袜一区二区三区免费视频 | 国产精品五月天 | 久久久久国产一级毛片 | 成人精品国产一区二区4080 | 日本精品久久久久 | 日本免费一区二区三区 | 欧洲视频一区二区 | 国产精品午夜电影 | 国产男女猛烈无遮掩视频免费网站 | 99精品欧美一区二区三区 | 91精品国产91久久久久福利 | 日韩在线视频免费观看 |