標題: 基于51單片機的電子琴設(shè)計(按鍵加預(yù)存歌曲)附PCB源程序 [打印本頁]

作者: WXSZZF    時間: 2020-11-5 15:50
標題: 基于51單片機的電子琴設(shè)計(按鍵加預(yù)存歌曲)附PCB源程序
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機源程序如下:
  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define HALFF 460800      //11.9652MHZ晶振的半頻率
  5. #define MAX 65536   //16位計數(shù)器最大計數(shù)次數(shù)
  6. #define LED P3              //小燈 P0
  7. #define input P1        //鍵盤  P1

  8. #define soo 784//中音'5'
  9. #define dao 523        //宏定義高音‘1’頻率為1047Hz
  10. #define re 587
  11. #define mi 659
  12. #define fa 698
  13. #define so 784
  14. #define la 880
  15. #define xi 988

  16. sbit SPEAK = P2^3;          //蜂鳴器聲音不怎么樣,我們使用揚聲器,接P2.3口
  17. sbit S1 = P3^3;
  18. uint C;              //定時器初始值定義
  19. bit flag=0;          //功能切換標志位
  20. uchar STH0;
  21. uchar STL0;
  22. uchar code lab[] = {dao,re,mi,fa,so,la,xi,soo,0XFF};
  23. void delay()
  24. {
  25.     uint i,j;
  26.     for(i=0; i<1000; i++)
  27.         for(j=0; j<120; j++);        //1ms
  28. }
  29. void DelayMs(uint n)   //誤差 0us ,延時n毫秒
  30. {
  31.     uint a,b,c;
  32.     for(c=n; c>0; c--)
  33.         for(b=199; b>0; b--)
  34.             for(a=1; a>0; a--);
  35. }

  36. /******************************頻率發(fā)生函數(shù) 定時器T0*******************/
  37. void t0() interrupt 1 using 1
  38. {
  39.     TH0 =STH0;
  40.     TL0 =STL0;
  41.     SPEAK = ~SPEAK;
  42. }
  43. void INT0_init(void) //定時器0初始化
  44. {
  45.     TMOD = 0x01;        //定時器T0用工作方式1(16位計數(shù)器)
  46.     EA = 1;         //開總中斷
  47.     ET0 = 1;        //開定時器T0中斷
  48.     TR0 = 0;    //T0停止運行狀態(tài)
  49. }

  50. void play_song()  //《兩只老虎》編曲
  51. {
  52.     uchar i,j;
  53.     uint code song[] = {dao,re,mi,dao,
  54.                         dao,re,mi,dao,
  55.                         mi,fa,so,
  56.                         mi,fa,so,
  57.                         so,la,so,fa,mi,dao,
  58.                         so,la,so,fa,mi,dao,
  59.                         re,soo,dao,
  60.                         re,soo,dao,
  61.                         0xff};        //以0xff為音符結(jié)束標志
  62.     //以下為每個音符節(jié)拍,4個延時單位為1拍
  63.     //'4'對應(yīng)4個延時單位,'2'對應(yīng)2個延時單位,'1'對應(yīng)1個
  64.     uchar code JP[] = {4,4,4,4,
  65.                        4,4,4,4,
  66.                        4,4,8,
  67.                        4,4,8,
  68.                        3,1,3,1,4,4,
  69.                        3,1,3,1,4,4,
  70.                        4,4,8,
  71.                        4,4,8
  72.                       };
  73.     EA = 1;         //開總中斷
  74.     ET0 = 1;        //開定時器T0中斷
  75.     TMOD = 0x01;        //定時器T0用工作方式1(16位計數(shù)器)
  76.     while(!flag)
  77.     {
  78.         i = 0;
  79.         while(song[i] != 0xff)
  80.         {
  81.             C = HALFF/song[i];
  82.             STH0 = (MAX - C) / 256; // 高8位
  83.             STL0 = (MAX - C) % 256; // 低8位
  84.             TR0 = 1;                           //啟動定時器

  85.             for(j=0; j<JP[i]; j++) //控制節(jié)拍
  86.                 delay();                   //延時1個延時單位
  87.             TR0 = 0;                           //關(guān)閉定時器
  88.             i++;                                   //播放下一個音符
  89.         }
  90.     }
  91. }

  92. void key_play()
  93. {
  94.     uchar temp;
  95.     uchar num;
  96.     input = 0xff;
  97.     if(input!=0xff)               //按鍵輸入P1口
  98.     {
  99.         DelayMs(5);
  100.         if(input!=0xff)
  101.         {
  102.             temp = input;
  103.         }
  104.     }
  105.     switch(temp)
  106.     {
  107.     case 0xfe:
  108.         num=0;
  109.         break;
  110.     case 0xfd:
  111.         num=1;
  112.         break;
  113.     case 0xfb:
  114.         num=2;
  115.         break;
  116.     case 0xf7:
  117.         num=3;
  118.         break;
  119.     case 0xef:
  120.         num=4;
  121.         break;
  122.     case 0xdf:
  123.         num=5;
  124.         break;
  125.     case 0xbf:
  126.         num=6;
  127.         break;
  128.     case 0x7f:
  129.         num=7;
  130.         break;
  131.     default:
  132.         num=8;
  133.         break;
  134.     }
  135.     C = lab[num];   //定時器0的初值
  136.     if( C == 0XFF )
  137.     {
  138.         STH0 = (MAX - C) / 256; // 高8位
  139.         STL0 = (MAX - C) % 256; // 低8位
  140.         TR0 = 1;
  141. ……………………

  142. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
設(shè)計一 電子琴.rar (1014.66 KB, 下載次數(shù): 56)



作者: QEQWE123    時間: 2020-11-5 17:34
實測好像不大行,波形和頻率顯示都正常 但是蜂鳴器沒有聲音

51hei.png (34.98 KB, 下載次數(shù): 48)

51hei.png

作者: Better——wxl    時間: 2020-11-22 12:14
用不了!
作者: WXSZZF    時間: 2021-3-22 12:10
QEQWE123 發(fā)表于 2020-11-5 17:34
實測好像不大行,波形和頻率顯示都正常 但是蜂鳴器沒有聲音

看看電腦的仿真配置,有可能是電腦聲音沒開。我遇到過這個問題





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