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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6228|回復(fù): 7
收起左側(cè)

基于51單片機8音鍵電子琴DIY制作(完整PCB程序設(shè)計項目開源)

  [復(fù)制鏈接]
ID:628657 發(fā)表于 2019-10-23 13:57 | 顯示全部樓層 |閱讀模式
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png 0.png 0.png

單片機源程序如下:
  1. /**************************************************************
  2. 程序名稱:模擬電子琴
  3. **************************************************************/
  4. #include<reg52.h>                                     //定義頭文件
  5. #define uchar unsigned char                        //宏定義
  6. #define led P0                                        //定義LED等位P0口
  7. #define sw_port P1                                //中間變量。。。使按鍵和led對應(yīng)
  8. sbit buzzer=P2^7;                                //揚聲器管腳
  9. sbit key1=P3^2;                                        //播放音樂與彈奏歌曲轉(zhuǎn)換
  10. sbit key3=P3^4;                                        //掉電存儲按鍵
  11. sbit key4=P3^5;                 //播放掉電存儲的歌曲                                         
  12. sbit keybofang=P3^3;                        //播放剛才彈奏的歌曲
  13. sbit key7=P3^0;                                        //音調(diào)鍵。。。 和  歌曲鍵
  14. sbit key8=P3^1;                                        //音調(diào)鍵。。。 和  歌曲鍵
  15. sbit key6=P1^7;
  16. sbit key5=P1^6;                                   
  17. sbit sda=P1^1;                                              //24c02數(shù)據(jù)線  
  18. sbit scl=P1^0;                                        //24c02時鐘線
  19. uchar keyd,i,keys,b;                                  //定義變量
  20. uchar tone_H;                                        //定義變量
  21. uchar tone_L;                                        //定義變量
  22. void beat_125(unsigned char);                        //聲明函數(shù)
  23. uchar code beat1[]={16,8,8,8,8,4,4,16,8,4,4,8,4,4,4,        //歌曲1節(jié)拍
  24. 4,4,4,16,16,8,8,4,4,12,8,16,16,8,4,4,4,4,16};
  25. uchar code song1[]={6,5,3,5,7,6,5,6,3,5,6,5,3,                //歌曲1簡譜
  26. 2,1,6,5,3,2,2,3,5,5,6,3,2,1,5,3,2,1,6,1,1,15};

  27. uchar code beat2[]={7,7,7, 7,8,9, 1,2,3, 6,2,4, 4,4,4, 12,         //歌曲二節(jié)拍
  28. 8,2,2, 4,4,4, 8,2,2, 4,4,4, 2,2,4,4, 12,};
  29. uchar code song2[]={1,2,8, 8,5,1, 3,3,3, 5,4,3,                //歌曲二簡譜
  30. 5,4,3, 2, 2,1,0, 1,2,3, 4,3,2, 3,4,5, 5,4,3, 2,1,15};

  31. uchar code beat4[]={4,4,4, 6,2,4, 4,4,4, 6,2,4, 4,4,4, 12,
  32. 8,2,2, 4,4,4, 8,2,2, 4,4,4, 2,2,4,4, 12,};
  33. uchar code song4[]={1,1,1, 3,2,1, 3,3,3, 5,4,3,
  34. 5,4,3, 2, 2,1,0, 1,2,3, 4,3,2, 3,4,5, 5,4,3, 2,1, 15};

  35. uchar code tone[]={115,102,91,86,77,68,61,57};                //歌曲音調(diào)
  36. unsigned int code tone1[]={1012,956,852,759,716,638,568,506,478,426,379,531,10}; //歌曲音調(diào)
  37. uchar song3[43];                                              //定義空數(shù)組
  38. void play(uchar*,uchar*);                                  //演奏歌曲函數(shù)
  39. void delay8um(uchar);                                          //第一8um延時函數(shù)
  40. void sound(uchar);                                        //彈奏發(fā)聲函數(shù)
  41. /*******************************************
  42. 函數(shù)功能:節(jié)拍的延時的基本單位,用于24c08簡單延時
  43. ******************************************/                                         
  44. void delay()                                                //簡單延時函數(shù)
  45. {;;}
  46. /*******************************************
  47. 函數(shù)功能:節(jié)拍的延時的基本單位,延時1ms
  48. ******************************************/
  49. void delay1ms(uchar x)                                          //1um延時函數(shù)
  50. {
  51.         uchar j;
  52.         while(x--)
  53.                 for(j=120;j>0;j--);
  54. }
  55. /**************************************************************
  56. 函數(shù)功能:24c02驅(qū)動程序      用IIC總線進行傳輸
  57. **************************************************************/
  58. void init_c02()                                                //24c02初始化
  59. {
  60.         sda=1;
  61.         delay();
  62.         scl=1;
  63.         delay();
  64. }
  65. void start_c02()                                             //24c02的啟動信號
  66. {
  67.         scl=1;
  68.         delay();         
  69.         sda=1;         
  70.         delay();
  71.         sda=0;
  72.         delay();

  73. }
  74. void stop_c02()                                                   //24c02停止信號
  75. {
  76.         sda=0;
  77.         delay();
  78.         scl=1;
  79.         delay();
  80.         sda=1;
  81.         delay();
  82. }
  83. void response_c02()                                        //24c02的應(yīng)答信號
  84. {
  85.         uchar i;
  86.         scl=1;
  87.         delay();
  88.         while((sda==1)&&(i<250))i++;
  89.         scl=0;
  90.         delay();
  91. }
  92. void write_c02byte(uchar date)                                    //對24c02寫一個字節(jié)
  93. {
  94.         uchar i,temp;
  95.         temp=date;
  96.         for(i=0;i<8;i++)
  97.         {        
  98.                 temp=temp<<1;
  99.                 scl=0;
  100.                 delay();
  101.                 sda=CY;
  102.                 delay();
  103.                 scl=1;
  104.                 delay();
  105.         }
  106.         scl=0;
  107.         delay();
  108.         sda=1;
  109.         delay();
  110. }
  111. uchar read_c02byte()                                        //對24c02讀一個字節(jié)
  112. {
  113.          uchar i,k;
  114.          scl=0;
  115.          delay();
  116.          sda=1;
  117.          delay();
  118.          for(i=0;i<8;i++)
  119.          {
  120.                  scl=1;
  121.                 delay();
  122.                 k=(k<<1)|sda;
  123.                 scl=0;
  124.                 delay();
  125.         }
  126.         return k;
  127. }
  128. void write_addc02(uchar address,uchar date)                //對24c02寫一個數(shù)據(jù)        
  129. {
  130.         start_c02();
  131.          write_c02byte(0xa0);
  132.         response_c02();
  133.         write_c02byte(address);
  134.         response_c02();
  135.         write_c02byte(date);
  136.         response_c02();
  137.         stop_c02();
  138. }
  139. uchar read_addc02(uchar address)                        //從24c02讀一個數(shù)據(jù)
  140. {
  141.         uchar date;
  142.         start_c02();
  143.         write_c02byte(0xa0);
  144.         response_c02();
  145.         write_c02byte(address);
  146.         response_c02();
  147.         start_c02();        
  148.         write_c02byte(0xa1);
  149.         response_c02();
  150.         date=read_c02byte();
  151. //        response_c02;
  152.         stop_c02();
  153.         return date;
  154. }
  155. /**************************************************************
  156. 函數(shù)功能:主函數(shù)。。。。。。。。。。。。
  157. **************************************************************/  
  158. void main()                                                //主函數(shù)
  159. {        
  160.         uchar yd,temp,jj,tt;                                //定義變量
  161.         uchar t1,i;                                        //定義變量
  162.         t1=0;                                                //初始化 t1
  163.         yd=0;                            //初始化t2
  164.         buzzer=1;                                         //初始化蜂鳴器
  165.         EA=1;                                                //打開定時總中斷
  166.         TMOD=0x01;                                        //設(shè)置定時器模式  定時器0工作在方式1        
  167.         ET0=1;                                                //打開定時器0中斷
  168.         while(1)                                        //主循環(huán)
  169.         {
  170.                 led=0x3c;
  171.                 sw_port=0xff;
  172.                 keys=~sw_port;                                //將led與按鍵結(jié)合起來
  173.                 switch(keys)                                //進入鍵盤選擇
  174.                 {
  175.                         case 0x04:sound(0);temp=1;yd=0;break;         //如果鍵盤1被按下發(fā)音do,同時設(shè)置標志temp,將數(shù)字計入yd
  176.                         case 0x08:sound(1);temp=1;yd=1;break;         //如果鍵盤2被按下發(fā)音ruai,同時設(shè)置標志temp,將數(shù)字計入yd
  177.                         case 0x10:sound(2);temp=1;yd=2;break;         //如果鍵盤3被按下發(fā)音mi,同時設(shè)置標志temp,將數(shù)字計入yd
  178.                     case 0x20:sound(3);temp=1;yd=3;break;         //如果鍵盤4被按下發(fā)音fa,同時設(shè)置標志temp,將數(shù)字計入yd

  179.                 }
  180.                 if(key5==0)                                //如果鍵盤5被按下發(fā)音la,同時設(shè)置標志temp,將數(shù)字計入yd
  181.                 {
  182.                                 while(!key5)                // 松手檢測
  183.                                  sound(4);
  184.                                 temp=1;yd=4;        
  185.                 }
  186.                 if(key6==0)                                //如果鍵盤6被按下發(fā)音xi,同時設(shè)置標志temp,將數(shù)字計入yd
  187.                 {
  188.                                 while(!key6)                // 松手檢測
  189.                                  sound(5);
  190.                                 temp=1;yd=5;        
  191.                 }
  192.                 if(key7==0)                                //如果鍵盤7被按下發(fā)音xi,同時設(shè)置標志temp,將數(shù)字計入yd
  193.                 {
  194.                                 while(!key7)                // 松手檢測
  195.                                  sound(6);
  196.                                 temp=1;yd=6;        
  197.                 }
  198.                 if(key8==0)                                //如果鍵盤8被按下發(fā)音高音do,同時設(shè)置標志temp,將數(shù)字計入yd
  199.                 {
  200.                                 while(!key8)                 //松手檢測
  201.                                  sound(7);                //播放高音do。。
  202.                                 temp=1;yd=7;
  203.                 }
  204.                 if(temp==1)                                //標志位,如果標志位為1,則說明有按鍵被按下
  205.                 {
  206.                         
  207.                         temp=0;                                //將標識位歸零
  208.                         song3[t1++]=yd;                //將數(shù)據(jù)存入song3[]數(shù)組
  209.                 }

  210.                 if(key3==0)                                //將數(shù)據(jù)存入24c02 ,掉電存儲按鍵
  211.                 {
  212.                         delay1ms(10);
  213.                         if(key3==0)                        //檢測是否key3被按下
  214.                         {        
  215.                                 P0=0;                        //如果被按下,將led打開
  216.                                 while(!key3);                 //松手檢測
  217.                                 song3[t1++]=30;        
  218.                                 init_c02();                //初始化24c02
  219.                                         for(i=0;i<40;)        //進入循環(huán)
  220.                                         {
  221.                                                  write_addc02(i,song3[i++]);        //將數(shù)據(jù)依次寫入24c02
  222.                                                  delay1ms(10);                        //延時
  223.                                         }
  224.                                      P0=1;                                                //led關(guān)閉
  225.                         }
  226.                 }
  227.                 if(key4==0)                                //讀取24c02中的數(shù)據(jù),掉電播放
  228.                 {
  229.                         delay1ms(10);
  230.                         if(key4==0)
  231.                         {                                //檢測是否有鍵被按下
  232.                                 
  233.                                 while(!key4);                //松手檢測
  234.                                 init_c02();                 //初始化
  235.                                 P0=0;                        //將led打開                                       
  236.                                 tt=1;                        //將tt初值設(shè)為0
  237.                                 while(read_addc02(tt)!=30)                        //進入while循環(huán)
  238.                                 {
  239.                                         jj=read_addc02(tt++);
  240.                                         tone_H=(65536-tone1[jj])/256;                //設(shè)定初值
  241.                                         tone_L=(65536-tone1[jj])%256;                //設(shè)定初值                                 
  242.                                      TH0=tone_H;                                //賦值TH0高八位
  243.                                          TL0=tone_L;                                //賦值TL0低八位
  244.                                          TR0=1;                                            //打開定時器
  245.                                          beat_125(3);                                 //延時
  246.                                          TR0=0;
  247.                                          beat_125(4);                                //關(guān)閉定時器
  248.                                 }
  249.                                 P0=1;                                                //關(guān)閉led
  250.             }
  251.                 }

  252.                 if(keybofang==0)
  253.                 {
  254.                         while(!keybofang);                                        //檢測回放鍵是否被按下
  255.                         song3[t1++]=30;
  256.                    //        t1=0;
  257.                         while(song3[i]!=30)                                        //進入while循環(huán)。
  258.                         {
  259.                                   tone_H=(65536-tone1[song3[i]])/256;
  260.                                  tone_L=(65536-tone1[song3[i]])%256;
  261.                                  TH0=tone_H;
  262.                                  TL0=tone_L;
  263.                                  TR0=1;                                                //開啟定時器
  264.                              beat_125(3);                                                                                                   
  265.                                  TR0=0;                                                //關(guān)閉定時器
  266.                                  i++;
  267.                                  beat_125(4);                                        //將i值加一                                                        
  268.                     }                                                                                                  
  269.                 }
  270.                 if(key1==0)
  271.                 {
  272.                         delay1ms(10);
  273.                         if(key1==0)                                                //檢測key1是否被按下
  274.                         {        
  275.                                 while(!key1);
  276.                                 P0=0;                                                //關(guān)閉led
  277.                                 while(key1)                                        //進入循環(huán)
  278.                                 {               
  279.                                    if(key7==0)                                           //檢測key7是否被按下
  280.                                         {
  281.                                                 delay1ms(10);
  282.                                                 if(key7==0)
  283.                                                 {
  284.                                                         P0=0xaa;                //設(shè)置led燈亮個數(shù)
  285.                                                         while(!key7);                //等待釋放
  286.                                                         play(song1,beat1);        //演奏歌曲1
  287.                                                         P0=0xff;                //關(guān)閉led
  288.                                                 }
  289.                                         }
  290.                                         if(key8==0)                                //檢測是否key8鍵被按下
  291.                                         {
  292.                                                 delay1ms(10);
  293.                                                 if(key8==0)
  294.                                                 {
  295.                                                         P0=0xaa;                //設(shè)置led燈亮
  296.                                                         while(!key8);                //松手檢測
  297.                                                         play(song2,beat2);        //播放歌曲2
  298.                                                         P0=0xff;                //關(guān)閉led
  299.                                                 }                        
  300.                                         }
  301.                                         if(key6==0)                                //檢測是否key6鍵被按下
  302.                                         {
  303.                                                 delay1ms(10);
  304.                                                 if(key6==0)
  305.                                                 {
  306.                                                         P0=0xaa;                //設(shè)置led燈亮
  307.                                                         while(!key6);                //松手檢測
  308.                                                         play(song4,beat4);        //播放歌曲4
  309.                                                         P0=0xff;                //關(guān)閉led
  310.                                                 }                        
  311.                                         }  
  312.                                 }
  313.                                         while(!key1);                                //檢測key1是否被按下
  314.                                         P0=1;                                        //如果被按下。退出該函數(shù)。。并關(guān)閉led
  315.                                 
  316.                         }
  317.                 }
  318.         
  319.         }
  320. }
  321. /**************************************************************
  322. 函數(shù)功能:從數(shù)組中播放歌曲
  323. **************************************************************/
  324. void play(uchar*song,uchar*beat)                        //播放歌曲函數(shù)
  325. {
  326.          i=0;                                                //設(shè)置初始值
  327.          while(song[i]!=15)                                //  進入循環(huán)函數(shù)
  328.          {
  329.                   tone_H=(65536-tone1[song[i]])/256;        //定義初值
  330.                  tone_L=(65536-tone1[song[i]])%256;        //定義初值
  331.                  TH0=tone_H;                                //賦值
  332.                  TL0=tone_L;                                 //賦值
  333.                  TR0=1;                                        //打開定時器0
  334.                  beat_125(beat[i]);                        //讀取節(jié)拍函數(shù)
  335.                  i++;                                        //自加
  336.                  TR0=0;                                        //關(guān)閉led
  337.          }
  338. }
  339. /**************************************************************
  340. 函數(shù)功能:定時器T0的中斷服務(wù)子程序,使P2.7引腳輸出音頻方波
  341. **************************************************************/
  342. void tone_timer() interrupt 1                                 //中斷子程序
  343. {
  344.          TH0=tone_H;
  345.          TL0=tone_L;
  346.          buzzer=~buzzer;                                //揚聲器開關(guān)控制
  347. }
  348. /**************************************************************
  349. 函數(shù)功能:產(chǎn)生節(jié)拍的函數(shù)
  350. **************************************************************/
  351. void beat_125(uchar x)                                        //節(jié)拍。。
  352. {
  353.         uchar i,j,k;                                        //125ms延時函數(shù)。。
  354.         for(i=0;i<x;i++)
  355.                 for(j=0;j<125;j++)
  356.                         for(k=0;k<120;k++);
  357. }
  358. /**************************************************************
  359. 函數(shù)功能:8um簡易延時
  360. **************************************************************/
  361. void delay8um(uchar x)                                        //8ms延時函數(shù)
  362. {
  363.         uchar i,j;
  364.         for(i=0;i<x;i++)
  365.                 for(j=0;j<1;j++);
  366. }
  367. /**************************************************************
  368. 函數(shù)功能:產(chǎn)生音調(diào)
  369. **************************************************************/
  370. void sound(uchar x)                                        //音調(diào)函數(shù)
  371. {
  372.         uchar i;
  373.         led=sw_port;                                        //定義led
  374.         for(i=0;i<60;i++)
  375.         {
  376.                 buzzer=0;delay8um(tone[x]);                //開關(guān)頻率。。從而產(chǎn)生節(jié)拍
  377.                 buzzer=1;delay8um(tone[x]);
  378.         }
  379.         led=0xff;
  380. }
復(fù)制代碼

所有資料51hei提供下載:
基于51單片機8音鍵電子琴DIY制作(完整設(shè)計項目開源).rar (49.4 KB, 下載次數(shù): 126)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:628657 發(fā)表于 2019-10-23 13:57 | 顯示全部樓層
不懂可以問我
回復(fù)

使用道具 舉報

ID:666819 發(fā)表于 2019-12-17 23:30 | 顯示全部樓層
我運行沒有問題,謝謝樓主咯。
回復(fù)

使用道具 舉報

ID:769164 發(fā)表于 2020-6-4 11:26 | 顯示全部樓層
有Pro仿真嗎
回復(fù)

使用道具 舉報

ID:769164 發(fā)表于 2020-6-4 12:58 | 顯示全部樓層

有仿真文件嗎
回復(fù)

使用道具 舉報

ID:790142 發(fā)表于 2020-6-28 11:14 | 顯示全部樓層

我咋下載 打不開啊
回復(fù)

使用道具 舉報

ID:790142 發(fā)表于 2020-6-29 19:42 | 顯示全部樓層

仿真怎么沒有聲音
回復(fù)

使用道具 舉報

ID:828071 發(fā)表于 2021-12-14 21:51 | 顯示全部樓層
按鍵對應(yīng)的為什么不是從第一個燈開始亮呀?怎么才能從第一個燈開始呀?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 色av一区二区三区 | 国产一区二区在线播放 | 久久久久国产成人精品亚洲午夜 | 精品一区在线看 | 成人免费一区二区三区牛牛 | 欧美日韩精品在线一区 | 国产精品乱码一区二区三区 | 国产精品久久久久久久久久 | 日韩欧美在线观看视频网站 | 免费久 | 久久国产精品一区二区三区 | 自拍偷拍第一页 | 色婷婷精品久久二区二区蜜臂av | 久久久久久美女 | 欧美韩一区二区三区 | 欧美日高清视频 | 一区二区三区在线看 | 国产精品一区二区在线播放 | 国产日韩欧美一区二区 | 国产乡下妇女做爰 | 国产成人免费一区二区60岁 | 久久99久久99 | www.干| 日韩电影一区二区三区 | 中文字幕97 | 国产色片在线 | 二区在线观看 | 国产精品美女www | 国产欧美一区二区三区在线看 | 91亚洲国产亚洲国产 | 国产精品日韩高清伦字幕搜索 | 亚洲日本乱码在线观看 | 在线观看日韩精品视频 | 国产精品久久久久久妇女6080 | 日韩欧美中文字幕在线观看 | 99久久精品免费看国产小宝寻花 | 日本精品在线播放 | 一级中国毛片 | www.精品一区 | 成人精品一区二区三区 | 国产精品国产成人国产三级 |