[应用方案] 51单片机做的简易电子琴

[复制链接]
1238|10
 楼主| gaoyang9992006 发表于 2020-2-27 09:01 | 显示全部楼层 |阅读模式
  1. #include <reg51.h>

  2. sbit K1=P1^4;
  3. sbit K2=P1^5;
  4. sbit K3=P1^6;
  5. sbit K4=P1^7;
  6. sbit K5=P3^2;
  7. sbit K6=P3^3;
  8. sbit K7=P3^4;
  9. sbit Bee=P3^7;                        //蜂鸣器所在
  10. //定义七个基本音节
  11. unsigned int Music_7[]={262,294,330,349,392,440,494};
  12. //定义高音的七个音节,因为按键不够暂时不用,可以在Proteus仿真中使用
  13. //unsigned int Music_7_H[]={523,587,659,698,784,880,988};
  14. unsigned char th,tl;
  15. void InitTimer0(void)
  16. {
  17.     TMOD = 0x01;
  18.     TH0 = 0x0F8;
  19.     TL0 = 0x18;
  20.     EA  = 1;
  21.     ET0 = 1;
  22.                 Bee  =1;        //关闭蜂鸣器,因为这蜂鸣器跟喇叭不同,只要上电就他娘的响
  23.                 TR0 = 0;        //关闭定时器,防止一开机就嗷嗷的响
  24. }

  25.         void set_music(unsigned char i)
  26.         {
  27.                 th=(65536-(1000000/Music_7[i]))/256;
  28.                 tl=(65536-(1000000/Music_7[i]))%256;
  29.                 TH0=th;
  30.                 TL0=tl;               
  31.         }

  32. void delay1s(void)   //误差 0us
  33. {
  34.     unsigned char b,c;
  35.     for(c=180;c>0;c--)
  36.         for(b=250;b>0;b--)
  37.            ;

  38. }
  39.        
  40. void main(void)
  41. {
  42.   InitTimer0();

  43.         while(1)
  44.         {
  45.                 if(K1==0)
  46.                         {
  47.                         set_music(0);
  48.                 while(K1==0);
  49.                                 {
  50.                                         TR0=1;                        //启动定时器开始演奏音乐
  51.                                         delay1s();        //每次触发大概1秒,后续可修改为松手停止响。这里可以换成松手检测就可以了
  52.                                         TR0=0;                        //关闭定时器,停止音律响
  53.                                         Bee=1;                        //关闭蜂鸣器,防止一直嗷嗷响,如果用的是喇叭就可以忽略这个。
  54.                                 }
  55.                         }

  56.                 if(K2==0)
  57.                         {
  58.                         set_music(1);
  59.                 while(K2==0);
  60.                                 {
  61.                                         TR0=1;
  62.                                         delay1s();
  63.                                         TR0=0;
  64.                                                 Bee=1;
  65.                                 }
  66.                         }       

  67.                 if(K3==0)
  68.                         {
  69.                         set_music(2);
  70.                 while(K3==0);
  71.                                 {
  72.                                         TR0=1;
  73.                                         delay1s();
  74.                                         TR0=0;
  75.                                                 Bee=1;
  76.                                 }
  77.                         }

  78.                 if(K4==0)
  79.                         {
  80.                         set_music(3);
  81.                 while(K4==0);
  82.                                 {
  83.                                         TR0=1;
  84.                                         delay1s();
  85.                                         TR0=0;
  86.                                                 Bee=1;
  87.                                 }
  88.                         }

  89.                 if(K5==0)
  90.                         {
  91.                         set_music(4);
  92.                 while(K5==0);
  93.                                 {
  94.                                         TR0=1;
  95.                                         delay1s();
  96.                                         TR0=0;
  97.                                                 Bee=1;
  98.                                 }
  99.                         }

  100.                 if(K6==0)
  101.                         {
  102.                         set_music(5);
  103.                 while(K6==0);
  104.                                 {
  105.                                         TR0=1;
  106.                                         delay1s();
  107.                                         TR0=0;
  108.                                                 Bee=1;
  109.                                 }
  110.                         }

  111.                 if(K7==0)
  112.                         {
  113.                         set_music(6);
  114.                 while(K7==0);
  115.                                 {
  116.                                         TR0=1;
  117.                                         delay1s();
  118.                                         TR0=0;
  119.                                                 Bee=1;
  120.                                 }
  121.                         }
  122.                        
  123.         }
  124. }

  125. void Timer0Interrupt(void) interrupt 1
  126. {
  127.     TH0 = th;
  128.     TL0 = tl;
  129.     Bee = ~Bee;

  130. }


 楼主| gaoyang9992006 发表于 2020-2-27 09:03 | 显示全部楼层
后续完善,再来分享,主要是讲明白这个原理,昨天跑了一个别人的例子,难听死了,程序也很难懂,我这个应该非常容易理解的。
就是启动定时器,发出指定频率的方波。产生对应音节的音律。
wahahaheihei 发表于 2020-2-27 21:23 | 显示全部楼层
学习一下。
heisexingqisi 发表于 2020-2-27 21:29 | 显示全部楼层
给力,学习学习
598330983 发表于 2020-2-27 21:31 | 显示全部楼层
音质是不是很烂。
antusheng 发表于 2020-3-12 10:39 | 显示全部楼层
叮叮叮。。。。
zhuotuzi 发表于 2020-3-12 19:14 | 显示全部楼层
应该统一。
643757107 发表于 2020-3-14 20:06 | 显示全部楼层
代码规范,处理的不错。
643757107 发表于 2020-3-14 20:06 | 显示全部楼层
这个方法非常棒。
天灵灵地灵灵 发表于 2020-3-15 17:07 | 显示全部楼层
学习的好参考资料。
zhuomuniao110 发表于 2020-3-16 15:12 | 显示全部楼层
用003怎么实现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

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