找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于c51单片机的电子琴设计

[复制链接]
跳转到指定楼层
楼主
ID:727583 发表于 2020-4-12 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>
  2. unsigned char tone;
  3. unsigned char op;

  4. sbit led=P1^7;
  5. sbit spk=P3^6;
  6. sbit key1=P3^5;       //两只老虎演奏按键
  7. sbit key2=P3^4;       //1~i演奏按键
  8. unsigned char code shuma[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

  9. //用于使定时器初值变化以产生相应频率的定时
  10. unsigned char code yinfu_H[]=
  11. {0xfb,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0x00};         
  12. unsigned char code yinfu_L[]=
  13. {0xe9,0x5c,0xc1,0xef,0x45,0x92,0xd0,0xee,0x00};



  14. void delay(unsigned int N)
  15. {
  16.        unsigned int j=N;
  17.        while(j--)
  18.        {
  19.         unsigned char i;
  20.         for(i=0;i<250;i++);
  21.        }
  22. }
  23. unsigned  char code laohu[]=

  24. {1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,3,1,1,3

  25. ,1,1};//两只老虎乐谱
  26. unsigned  char code  laohuys[]=

  27. {220,220,220,220,220,220,220,220,220,220,235,220,220,210,150

  28. ,150,
  29.                               

  30. 170,170,200,200,150,150,170,170,200,200,244,240,250,244,220,

  31. 250};
  32. //定时器初始化
  33. void initTimer(void)
  34. {
  35. TMOD=0x01;
  36. TH0=yinfu_H[tone];
  37. TL0=yinfu_L[tone];
  38. }

  39. //定时器T0中断服务程序
  40. void timer0(void) interrupt 1
  41. {
  42. TH0=yinfu_H[tone];
  43. TL0=yinfu_L[tone];
  44. spk=~spk;        //
  45. }

  46. void laohu_yz()//两只老虎 演奏程序
  47. {
  48. unsigned char i;
  49. for(i=0;i<32;i++)
  50. {
  51.   led=1;
  52.   tone=laohu[i]-1;
  53.   delay(laohuys[i]/1.2);
  54.   led=0;    //每个音符闪烁一次
  55.   delay(laohuys[i]/1.5);
  56. }
  57. }
  58. void yuep_yz()//1~i音符演奏程序
  59. {
  60. unsigned char i;
  61. for(i=0;i<16;i++)
  62. {
  63.   led=1;
  64.   if(i<8)
  65.   {
  66.    tone=i;
  67.   }
  68.   else
  69.   {
  70.    tone=15-i;
  71.   }
  72.   delay(220);
  73.   led=0;
  74.   delay(180);
  75. }
  76. }


  77. void jianpan()
  78. {
  79.   op=P3;
  80. switch(op)
  81. {
  82.   case 0xfe:led=0;tone=0;P0=shuma[1];TR0=1;break;
  83.   case 0xfd:led=0;tone=1;P0=shuma[2];TR0=1;break;
  84.   case 0xfb:led=0;tone=2;P0=shuma[3];TR0=1;break;
  85.   case 0xf7:led=0;tone=3;P0=shuma[4];TR0=1;break;
  86.   case 0xef:led=0;tone=4;P0=shuma[5];TR0=1;break;
  87.   case 0xdf:led=0;tone=5;P0=shuma[6];TR0=1;break;
  88.   case 0xbf:led=0;tone=6;P0=shuma[7];TR0=1;break;
  89.   case 0x7f:led=0;tone=7;P0=shuma[8];TR0=1;break;
  90.   default:break;     
  91. }
  92. delay(4);
  93. TR0=0;
  94. led=1;
  95. P0=0xff;
  96. }

  97. //主程序
  98. void main(void)
  99. {
  100. initTimer();
  101. ET0=1;
  102. EA=1;

  103. spk=0;
  104. while(1)
  105. {

  106.   if(key1==0)//判断K1键是否按下
  107.   {
  108.    delay(10);
  109.    if(key1==0)
  110.    {
  111.    TR0=1;
  112.     laohu_yz();
  113.    spk=0;
  114.    }
  115.   }
  116. else if(key2==0)//判断K2键是否按下
  117. {
  118.   delay(10);
  119.   if(key2==0)
  120.   {
  121.   TR0=1;
  122.   yuep_yz();
  123.   spk=0;
  124.   }
  125. }

  126. jianpan();//键盘检测
  127. }
  128. }
复制代码


电子琴.zip

43.01 KB, 下载次数: 6, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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