找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4632|回复: 2
收起左侧

单片机电子琴程序 通过输出不同频率的方波产生不同音色

[复制链接]
ID:84299 发表于 2015-11-11 20:13 | 显示全部楼层 |阅读模式
关键是频谱,通过输出不同频率的方波产生不同音色。
  1.   #include <AT89X51.H>
  2. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
  3.                             0x66,0x6d,0x7d,0x07,
  4.                             0x7f,0x6f,0x77,0x7c,
  5.                             0x39,0x5e,0x79,0x71};
  6. unsigned char temp;
  7. unsigned char key;
  8. unsigned char i,j;
  9. unsigned char STH0;
  10. unsigned char STL0;
  11. unsigned int code tab[]={64021,64103,64260,64400,
  12.                           64524,64580,64684,64777,
  13.                           64820,64898,64968,65030,
  14.                           65058,65110,65157,65178};

  15. void main(void)
  16. {
  17.   TMOD=0x01;
  18.   ET0=1;
  19.   EA=1;

  20.   while(1)
  21.     {
  22.       P3=0xff;
  23.       P3_4=0;
  24.       temp=P3;
  25.       temp=temp & 0x0f;
  26.       if (temp!=0x0f)
  27.         {
  28.           for(i=50;i>0;i--)
  29.           for(j=200;j>0;j--);
  30.           temp=P3;
  31.           temp=temp & 0x0f;
  32.           if (temp!=0x0f)
  33.             {
  34.               temp=P3;
  35.               temp=temp & 0x0f;              
  36.               switch(temp)
  37.                 {
  38.                   case 0x0e:
  39.                     key=0;
  40.                     break;
  41.                   case 0x0d:
  42.                     key=1;
  43.                     break;
  44.                   case 0x0b:
  45.                     key=2;
  46.                     break;
  47.                   case 0x07:
  48.                     key=3;
  49.                     break;
  50.                 }
  51.               temp=P3;
  52.               P1_0=~P1_0;
  53.               P0=table[key];
  54.               STH0=tab[key]/256;
  55.               STL0=tab[key]%256;
  56.               TR0=1;
  57.               temp=temp & 0x0f;              
  58.               while(temp!=0x0f)
  59.                 {
  60.                   temp=P3;
  61.                   temp=temp & 0x0f;              
  62.                 }
  63.               TR0=0;
  64.             }
  65.         }

  66.       P3=0xff;
  67.       P3_5=0;
  68.       temp=P3;
  69.       temp=temp & 0x0f;
  70.       if (temp!=0x0f)
  71.         {
  72.           for(i=50;i>0;i--)
  73.           for(j=200;j>0;j--);
  74.           temp=P3;
  75.           temp=temp & 0x0f;
  76.           if (temp!=0x0f)
  77.             {
  78.               temp=P3;
  79.               temp=temp & 0x0f;              
  80.               switch(temp)
  81.                 {
  82.                   case 0x0e:
  83.                     key=4;
  84.                     break;
  85.                   case 0x0d:
  86.                     key=5;
  87.                     break;
  88.                   case 0x0b:
  89.                     key=6;
  90.                     break;
  91.                   case 0x07:
  92.                     key=7;
  93.                     break;
  94.                 }
  95.               temp=P3;
  96.               P1_0=~P1_0;
  97.               P0=table[key];
  98.               STH0=tab[key]/256;
  99.               STL0=tab[key]%256;
  100.               TR0=1;
  101.               temp=temp & 0x0f;              
  102.               while(temp!=0x0f)
  103.                 {
  104.                   temp=P3;
  105.                   temp=temp & 0x0f;              
  106.                 }
  107.               TR0=0;
  108.             }
  109.         }

  110.       P3=0xff;
  111.       P3_6=0;
  112.       temp=P3;
  113.       temp=temp & 0x0f;
  114.       if (temp!=0x0f)
  115.         {
  116.           for(i=50;i>0;i--)
  117.           for(j=200;j>0;j--);
  118.           temp=P3;
  119.           temp=temp & 0x0f;
  120.           if (temp!=0x0f)
  121.             {
  122.               temp=P3;
  123.               temp=temp & 0x0f;              
  124.               switch(temp)
  125.                 {
  126.                   case 0x0e:
  127.                     key=8;
  128.                     break;
  129.                   case 0x0d:
  130.                     key=9;
  131.                     break;
  132.                   case 0x0b:
  133.                     key=10;
  134.                     break;
  135.                   case 0x07:
  136.                     key=11;
  137.                     break;
  138.                 }
  139.               temp=P3;
  140.               P1_0=~P1_0;
  141.               P0=table[key];
  142.               STH0=tab[key]/256;
  143.               STL0=tab[key]%256;
  144.               TR0=1;
  145.               temp=temp & 0x0f;              
  146.               while(temp!=0x0f)
  147.                 {
  148.                   temp=P3;
  149.                   temp=temp & 0x0f;              
  150.                 }
  151.               TR0=0;
  152.             }
  153.         }

  154.       P3=0xff;
  155.       P3_7=0;
  156.       temp=P3;
  157.       temp=temp & 0x0f;
  158.       if (temp!=0x0f)
  159.         {
  160.           for(i=50;i>0;i--)
  161.           for(j=200;j>0;j--);
  162.           temp=P3;
  163.           temp=temp & 0x0f;
  164.           if (temp!=0x0f)
  165.             {
  166.               temp=P3;
  167.               temp=temp & 0x0f;              
  168.               switch(temp)
  169.                 {
  170.                   case 0x0e:
  171.                     key=12;
  172.                     break;
  173.                   case 0x0d:
  174.                     key=13;
  175.                     break;
  176.                   case 0x0b:
  177.                     key=14;
  178.                     break;
  179.                   case 0x07:
  180.                     key=15;
  181.                     break;
  182.                 }
  183.               temp=P3;
  184.               P1_0=~P1_0;
  185.               P0=table[key];
  186.               STH0=tab[key]/256;
  187.               STL0=tab[key]%256;
  188.               TR0=1;
  189.               temp=temp & 0x0f;              
  190.               while(temp!=0x0f)
  191.                 {
  192.                   temp=P3;
  193.                   temp=temp & 0x0f;              
  194.                 }
  195.               TR0=0;
  196.             }
  197.         }      
  198.     }
  199. }

  200. void t0(void) interrupt 1 using 0
  201. {
  202.   TH0=STH0;
  203.   TL0=STL0;
  204.   P1_0=~P1_0;
  205. }
复制代码


电子琴.rar

24.26 KB, 下载次数: 26, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

ID:99130 发表于 2016-3-29 17:28 | 显示全部楼层
电子琴失败了,重新做一个
回复

使用道具 举报

ID:183450 发表于 2017-8-17 16:07 来自手机 | 显示全部楼层
应该是不同音调吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表