找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1144|回复: 0
打印 上一主题 下一主题
收起左侧

单片机电子琴加强版代码

[复制链接]
跳转到指定楼层
楼主
ID:869397 发表于 2020-12-28 13:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <stc15.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit KEY1=P3^2;
  5. sbit KEY2=P3^3;
  6. sbit KEY3=P3^6;
  7. sbit KEY4=P3^7;
  8. sbit KEY5=P1^3;
  9. sbit KEY6=P1^2;
  10. sbit KEY7=P1^0;
  11. sbit KEY8=P1^1;
  12. sbit beep=P1^5;
  13. uint z;
  14. uint code tone[8]={0xFCAC,0xFD09,0xFD34,0xFD82,0xFDC8,0xFE06,0xFE22,0xFC44};//对应每个单调的计数初值
  15.         uchar k,i;
  16. void song1();
  17. uchar timer0h,timer0l,time;

  18.                          //世上只有妈妈好  数据表
  19. code uchar sszymmh[]={6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,
  20.                       6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,
  21.                       6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,
  22.                       5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,
  23.                       2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0
  24.                                       };
  25.                          // 音阶频率表 高八位
  26. code uchar FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
  27.                     0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
  28.                     0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
  29.                     0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;
  30.                          // 音阶频率表 低八位
  31. code uchar FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
  32.                     0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
  33.                     0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
  34.                     0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};
  35. void delay(uint t);
  36. void anjian()
  37. {
  38.         KEY1=1;KEY2=1;KEY3=1;KEY4=1;KEY5=1;KEY6=1;KEY7=1;KEY8=1;
  39.         if(KEY1==0)
  40.         {

  41.                 timer0h=FREQH[14];
  42.                 timer0l=FREQL[14];
  43.         }
  44.         if(KEY2==0)
  45.         {

  46.                 timer0h=FREQH[15];
  47.                 timer0l=FREQL[15];
  48.         }
  49.         if(KEY3==0)
  50.         {

  51.                 timer0h=FREQH[16];
  52.                 timer0l=FREQL[16];
  53.         }
  54.         if(KEY4==0)
  55.         {

  56.                 timer0h=FREQH[17];
  57.                 timer0l=FREQL[17];
  58.         }
  59.         if(KEY5==0)
  60.         {

  61.                 timer0h=FREQH[18];
  62.                 timer0l=FREQL[18];
  63.         }
  64.         if(KEY6==0)
  65.         {

  66.                 timer0h=FREQH[19];
  67.                 timer0l=FREQL[19];
  68.         }
  69.         if(KEY7==0)
  70.         {

  71.                 timer0h=FREQH[20];
  72.                 timer0l=FREQL[20];
  73.         }
  74.         if(KEY8==0)
  75.         {

  76.                 timer0h=FREQH[21];
  77.                 timer0l=FREQL[21];
  78.         }
  79.         if(KEY1==0&&KEY8==0)
  80.         {
  81.                 i=0;
  82.                 song1();
  83.         }
  84. }
  85. void zdkg()
  86. {
  87.         if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1&&KEY5==1&&KEY6==1&&KEY7==1&&KEY8==1)
  88.         {        
  89.                 TR0=0;//如果没有按键按下,就关闭定时器中断
  90.                 beep=1;//同时也关闭蜂鸣器
  91.         }
  92.         else
  93.         {
  94.                 TR0=1;
  95.         }
  96. }

  97. void song()                                 //  音乐处理函数
  98. {
  99.         TH0=timer0h;
  100.         TL0=timer0l;
  101.         TR0=1;
  102.         delay(time);                       
  103. }

  104. void song1()
  105. {
  106.         while(i<100)                                  //音乐数组长度 ,唱完从头再来  
  107.                 {              
  108.                         k=sszymmh[i]+7*sszymmh[i+1]-1;
  109.                         timer0h=FREQH[k];
  110.                         timer0l=FREQL[k];
  111.                         time=sszymmh[i+2];
  112.                         i=i+3;
  113.                         song();
  114.                 }
  115. }

  116. void main()
  117. {
  118.         P1M0=0;P1M1=0;
  119.         P3M0=0;P3M1=0;
  120.         KEY1=1;KEY2=1;KEY3=1;KEY4=1;KEY5=1;KEY6=1;KEY7=1;KEY8=1;
  121.         EA=1;//开总中断
  122.         ET0=1;//定时器T0中断允许
  123.         TMOD=0x01;//使用定时器T0的模式1
  124.         TH0=(65536-500)/256;//定时器T0的高8位重新赋初值
  125.         TL0=(65536-500)%256;//定时器T0的低8位重新赋初值
  126.         while(1)
  127.         {
  128.           anjian();
  129.           zdkg();         
  130.         }
  131. }

  132. void t0int() interrupt 1                //定时器中断函数
  133. {
  134.         TR0=0;
  135.         beep=!beep;
  136.         TH0=timer0h;
  137.         TL0=timer0l;
  138.         TR0=1;
  139. }
  140. void delay(uchar t)                  // 延时函数
  141. {
  142.         uchar t1;
  143.         unsigned long t2;
  144.         for(t1=0;t1<t;t1++)
  145.         {
  146.                 for(t2=0;t2<8000;t2++);
  147.         }
  148.         TR0=0;
  149. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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