找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3956|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)的電子琴設(shè)計(jì)(按鍵加預(yù)存歌曲)附PCB源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


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


單片機(jī)源程序如下:
  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位計(jì)數(shù)器最大計(jì)數(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;          //蜂鳴器聲音不怎么樣,我們使用揚(yáng)聲器,接P2.3口
  17. sbit S1 = P3^3;
  18. uint C;              //定時(shí)器初始值定義
  19. bit flag=0;          //功能切換標(biāo)志位
  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 ,延時(shí)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ù) 定時(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) //定時(shí)器0初始化
  44. {
  45.     TMOD = 0x01;        //定時(shí)器T0用工作方式1(16位計(jì)數(shù)器)
  46.     EA = 1;         //開總中斷
  47.     ET0 = 1;        //開定時(shí)器T0中斷
  48.     TR0 = 0;    //T0停止運(yùn)行狀態(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é)束標(biāo)志
  62.     //以下為每個(gè)音符節(jié)拍,4個(gè)延時(shí)單位為1拍
  63.     //'4'對(duì)應(yīng)4個(gè)延時(shí)單位,'2'對(duì)應(yīng)2個(gè)延時(shí)單位,'1'對(duì)應(yīng)1個(gè)
  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;        //開定時(shí)器T0中斷
  75.     TMOD = 0x01;        //定時(shí)器T0用工作方式1(16位計(jì)數(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;                           //啟動(dòng)定時(shí)器

  85.             for(j=0; j<JP[i]; j++) //控制節(jié)拍
  86.                 delay();                   //延時(shí)1個(gè)延時(shí)單位
  87.             TR0 = 0;                           //關(guān)閉定時(shí)器
  88.             i++;                                   //播放下一個(gè)音符
  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];   //定時(shí)器0的初值
  136.     if( C == 0XFF )
  137.     {
  138.         STH0 = (MAX - C) / 256; // 高8位
  139.         STL0 = (MAX - C) % 256; // 低8位
  140.         TR0 = 1;
  141. ……………………

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

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


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:316613 發(fā)表于 2020-11-5 17:34 | 只看該作者
實(shí)測(cè)好像不大行,波形和頻率顯示都正常 但是蜂鳴器沒有聲音

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

51hei.png
回復(fù)

使用道具 舉報(bào)

板凳
ID:583559 發(fā)表于 2020-11-22 12:14 | 只看該作者
用不了!
回復(fù)

使用道具 舉報(bào)

地板
ID:444375 發(fā)表于 2021-3-22 12:10 | 只看該作者
QEQWE123 發(fā)表于 2020-11-5 17:34
實(shí)測(cè)好像不大行,波形和頻率顯示都正常 但是蜂鳴器沒有聲音

看看電腦的仿真配置,有可能是電腦聲音沒開。我遇到過這個(gè)問題
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表