[范例教程] 51单片机电子琴

[复制链接]
1048|0
 楼主| rosemoore 发表于 2023-11-20 13:00 | 显示全部楼层 |阅读模式


  1. 各部分软件分析
  2. 延时子函数
  3. //延时子函数
  4. void delay(uint z)
  5. {
  6.     uint x,y;
  7.     for(x=z; x>0; x--)
  8.         for(y=340; y>0; y--);
  9. }
  10. 初始化子函数
  11. //初始化子函数
  12. void init()
  13. {
  14.     beep=0;
  15.     D1=1;
  16.     D2=0;
  17.     EA=1;//开总中断
  18.     TCON=0x01;//外部中断0设置为边沿触发
  19.     EX0=1;//开外部中断0
  20.     ET0=1;
  21.     ET1=1;
  22.     TMOD=0x11;//定时器0,1工作在定时状态,均为方式1
  23. }
  24. 数码管显示子函数
  25. //数码管显示子函数
  26. void display1()
  27. {
  28.     in(table1[aa]); //再传段码
  29.     out();
  30.     W1=0;;
  31.     delay(1); //延迟时间2ms以内
  32.     W1=1;
  33.     in(table1[cc+1]); //再传段码
  34.     out();
  35.     W2=0;
  36.     delay(1); //延迟时间2ms以内
  37.     W2=1;
  38. }
  39. 高低音选择子函数
  40. //高低音选择子函数
  41. void yinjie()
  42. {
  43.     if(k10==0)
  44.     {
  45.         delay(5);
  46.         if(k10==0)
  47.         {
  48.             aa=10;
  49.             bb=0;//返回10为seg[10]显示C
  50.         }
  51.     }
  52.     if(k9==0)
  53.     {
  54.         delay(5);
  55.         if(k9==0)
  56.         {
  57.             aa=11;
  58.             bb=1;//返回11为seg[11]显示L
  59.         }
  60.     }
  61.     if(k11==0)
  62.     {
  63.         delay(5);
  64.         if(k11==0)
  65.         {
  66.             aa=12;
  67.             bb=2;//返回12为seg[12]显示H
  68.         }
  69.     }
  70.     if(aa==0)
  71.     {
  72.         aa=13;
  73.     }
  74. }
  75. 播放音乐子函数
  76. //播放音乐子函数
  77. void display_music()
  78. {
  79.     TH0=table2[table4[i]-1];
  80.     TL0=table3[table4[i]-1];
  81.     while(flag==0)
  82.     {
  83.         if(i<32)
  84.         {
  85.             TR0=1;
  86.             delay(57*table5[i]);
  87.             i++;
  88.         }
  89.         if(i==32)
  90.         {
  91.             i=0;
  92.         }
  93.     }
  94. }
  95. 演奏模式子函数
  96. //演奏模式子函数
  97. void display_play()
  98. {
  99.     TR0=0;
  100.     TR1=0;
  101.     yinjie();
  102.     WE2=1;//关数码管2
  103.     WE1=0;//开数码管1
  104.     P0=table1[aa];
  105.     if(aa!=13&&flag==1)
  106.     {
  107.         if(k1==0)
  108.         {
  109.             TH1=table2[7*bb+cc];
  110.             TL1=table3[7*bb+cc];
  111.             TR1=1;
  112.             while(k1==0)
  113.             {
  114.                 cc=0;
  115.                 display1();
  116.             }
  117.         }
  118.         if(k2==0)
  119.         {
  120.             TH1=table2[7*bb+cc];
  121.             TL1=table3[7*bb+cc];
  122.             TR1=1;
  123.             while(k2==0)
  124.             {
  125.                 cc=1;
  126.                 display1();
  127.             }
  128.         }
  129.         if(k3==0)
  130.         {
  131.             TH1=table2[7*bb+cc];
  132.             TL1=table3[7*bb+cc];
  133.             TR1=1;
  134.             while(k3==0)
  135.             {
  136.                 cc=2;
  137.                 display1();
  138.             }
  139.         }
  140.         if(k4==0)
  141.         {
  142.             TH1=table2[7*bb+cc];
  143.             TL1=table3[7*bb+cc];
  144.             TR1=1;
  145.             while(k4==0)
  146.             {
  147.                 cc=3;
  148.                 display1();
  149.             }
  150.         }
  151.         if(k5==0)
  152.         {
  153.             TH1=table2[7*bb+cc];
  154.             TL1=table3[7*bb+cc];
  155.             TR1=1;
  156.             while(k5==0)
  157.             {
  158.                 cc=4;
  159.                 display1();
  160.             }
  161.         }
  162.         if(k6==0)
  163.         {
  164.             TH1=table2[7*bb+cc];
  165.             TL1=table3[7*bb+cc];
  166.             TR1=1;
  167.             while(k6==0)
  168.             {
  169.                 cc=5;
  170.                 display1();
  171.             }
  172.         }
  173.         if(k7==0)
  174.         {
  175.             TH1=table2[7*bb+cc];
  176.             TL1=table3[7*bb+cc];
  177.             TR1=1;
  178.             while(k7==0)
  179.             {
  180.                 cc=6;
  181.                 display1();
  182.             }
  183.         }
  184.     }
  185. }
  186. 外部0中断子函数
  187. //外部0中断子函数
  188. void wb0() interrupt 0
  189. {
  190.     if(k8==0)
  191.     {
  192.         delay(5);
  193.         while(k8==0);
  194.         flag=~flag;
  195.         D1=~D1;
  196.         D2=~D2;
  197.     }
  198. }
  199. 定时器0中断子函数
  200. //定时器0中断子函数
  201. void t0() interrupt 1
  202. {
  203.     TR0=0;
  204.     TH0=table2[table4[i]-1];
  205.     TL0=table3[table4[i]-1];
  206.     beep=~beep;
  207.     TR0=1;
  208. }
  209. 3.2.9 定时器1中断子函数
  210. //定时器1中断子函数
  211. void t1() interrupt 3
  212. {
  213.     TR1=0;
  214.     TH1=table2[7*bb+cc];
  215.     TL1=table3[7*bb+cc];
  216.     beep=~beep;
  217.     TR1=1;
  218. }
  219. 3.2.10 主函数
  220. //主函数
  221. void main()
  222. {
  223.     init();
  224.     while(1)
  225.     {
  226.         if(flag==0)
  227.             display_music();
  228.         else
  229.             display_play();
  230.     }
  231. }


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

本版积分规则

64

主题

1612

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部