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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3948|回復: 3
收起左側

基于51單片機的電子琴設計(按鍵加預存歌曲)附PCB源程序

[復制鏈接]
ID:444375 發表于 2020-11-5 15:50 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png

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

單片機源程序如下:
  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位計數器最大計數次數
  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. /******************************頻率發生函數 定時器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位計數器)
  46.     EA = 1;         //開總中斷
  47.     ET0 = 1;        //開定時器T0中斷
  48.     TR0 = 0;    //T0停止運行狀態
  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為音符結束標志
  62.     //以下為每個音符節拍,4個延時單位為1拍
  63.     //'4'對應4個延時單位,'2'對應2個延時單位,'1'對應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位計數器)
  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++) //控制節拍
  86.                 delay();                   //延時1個延時單位
  87.             TR0 = 0;                           //關閉定時器
  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黑下載附件…………
復制代碼

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


評分

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

查看全部評分

回復

使用道具 舉報

ID:316613 發表于 2020-11-5 17:34 | 顯示全部樓層
實測好像不大行,波形和頻率顯示都正常 但是蜂鳴器沒有聲音
51hei.png
回復

使用道具 舉報

ID:583559 發表于 2020-11-22 12:14 | 顯示全部樓層
用不了!
回復

使用道具 舉報

ID:444375 發表于 2021-3-22 12:10 | 顯示全部樓層
QEQWE123 發表于 2020-11-5 17:34
實測好像不大行,波形和頻率顯示都正常 但是蜂鳴器沒有聲音

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 紧缚调教一区二区三区视频 | 日韩三级在线观看 | 综合久久99 | 免费看欧美一级片 | 日韩在线xx | 日韩av第一页 | 欧洲一级视频 | 97超碰成人| av天天干 | 久久久www成人免费无遮挡大片 | 婷婷久久网| 欧美激情精品久久久久久 | 成人免费视频 | 国产一区二区三区久久久久久久久 | 成人精品国产一区二区4080 | 女人av| 亚洲欧美中文日韩在线v日本 | 中文字幕二区 | 亚洲国产精品久久久久婷婷老年 | 2018国产大陆天天弄 | 综合久久av | 看一级毛片 | 黑人精品欧美一区二区蜜桃 | 成人免费视频网站在线观看 | 91精品在线看 | 久久久女女女女999久久 | 一区二区视频 | 亚洲区一区二 | 99综合| 亚洲欧洲精品成人久久奇米网 | 亚洲日本欧美 | 久久成人一区二区三区 | 国产99久久精品一区二区300 | 亚洲欧美日韩精品久久亚洲区 | 精品无码三级在线观看视频 | 国产欧美精品区一区二区三区 | 日韩精品免费视频 | 久久三级av| 成人a视频在线观看 | 色.com | 亚洲欧美日韩成人在线 |