找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电子琴 带4*4矩阵键盘和8*8点阵仿真与源程序

[复制链接]
跳转到指定楼层
楼主
电子琴仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源码:
  1. /*
  2. 名称:简易电子琴设计
  3. 说明:本程序运行时,按下矩阵键盘中的按键,数码管会显示当前的按键值,蜂鸣器会播放对应的音符
  4. */
  5. #include <reg52.h>
  6. #define uchar unsigned char
  7. #define uint  unsigned int
  8. #define KeyIO  P1   //矩阵键盘的控制IO
  9. sbit    BEEP = P3^4;  //蜂鸣器对应的控制IO
  10. sbit L1=P1^0;
  11. sbit L2=P1^1  ;
  12. sbit L3=P1^2   ;
  13. sbit L4=P1^3 ;
  14. uchar code string[] = {0x01,0x03,
  15. 0x07,0x0f,0x1f,0x3f,0x7f,0xff};
  16. uchar code dis[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  17. //各音符对应的延时
  18. uint code Table_Tone[] = {
  19. 63628,63835,64021,64103,
  20. 64260,64400,64524,64580};
  21. uchar KeyNo;    //按键序号
  22. /**  延时子函数  **/
  23. void DelayMS(uchar time)
  24.   {
  25. uchar i;
  26. while(time--)
  27.    {
  28.   for(i=0; i<120; i++);
  29.    }
  30.   }
  31. /**  矩阵键盘的扫描子函数  **/
  32. void Key_Scan(void)
  33.   {
  34.   uchar temp,i;
  35.   uchar Num;
  36.   P1=0xfe;
  37.   for(i=0;i<=3;i++)
  38.   {
  39.    if(L1==0)Num=dis[i*4+0];
  40. if(L2==0)Num=dis[i*4+1];
  41. if(L3==0)Num=dis[i*4+2];
  42. if(L4==0)Num=dis[i*4+3];
  43. DelayMS(5);
  44. temp=P1;
  45. temp=temp|0x0f;
  46. temp=temp<<1;
  47. temp=temp|0x0f;
  48. P1=temp;
  49.   }
  50. // uchar Temp, Num;
  51. //
  52. // P1 = 0x0f;      //高四位置 0 ,放入四列
  53. //
  54. // DelayMS(2);
  55. //         //按键按下后 00001111 将变成 0000XXXX,X 中 1 个为 0,3个仍为 1
  56. // Temp = KeyIO ^ 0x0f;   //异或操作会把 3 个 1 变成 0,唯一的 0 变成 1
  57. //
  58. // switch(Temp)
  59. //   {
  60. //  case 1 : Num = 0; break;
  61. //  case 2 : Num = 1; break;
  62. //  case 4 : Num = 2; break;
  63. //  case 8 : Num = 3; break;
  64. //  default : return;
  65. //   }
  66.   //
  67. // KeyIO = 0xf0;     //低四位置 0 ,放入四列
  68. //
  69. // DelayMS(2);
  70. //         //按键按下后 11110000 将变成 XXXX0000,X 中 1 个为 0,3个仍为 1
  71. // Temp = (KeyIO >> 4) ^ 0x0f;  //将高四位移至低四位,并将其中唯一的 0 变为 1,其余为 0
  72. //
  73. // switch (Temp)
  74. //   {
  75. //  case 1 : Num +=  0; break;
  76. //  case 2 : Num +=  4; break;
  77. //  case 4 : Num +=  8; break;
  78. //  case 8 : Num += 12; break;
  79. //  default : return;
  80. //   }
  81. // KeyNo = Num;
  82.   }
  83. void led_shi()
  84. {
  85. uchar n;
  86. for(n=0;n<40;n++)
  87. {
  88.   P0=string[KeyNo];
  89.   P2=0x00;
  90. }
  91. }
  92. /**  定时器 0 中断服务程序,不同频率的声音由该中断产生  **/
  93. void Play_Tone() interrupt 1
  94.   {
  95. TH0  = Table_Tone[KeyNo] / 256;
  96. TL0  = Table_Tone[KeyNo] % 256;
  97. BEEP = ~BEEP;
  98.   }
  99. /**  主函数  **/
  100. void main(void)
  101.   {
  102. TMOD  = 0x01;
  103. IE    = 0x82;
  104. while(1)
  105.    {
  106.   KeyIO = 0xf0;     //发送扫描码
  107.   if (KeyIO != 0xf0)    //如果有按键按下
  108.     {
  109.    Key_Scan();     //矩阵键盘的扫描
  110.    led_shi();
  111.    TR0 = 1;     //启动定时器,并发出对应的声音
  112.     }
  113.   else
  114.     {
  115.    TR0 = 0;     //停止播放声音
  116.     }
  117.   DelayMS(2);
  118.    }
  119.   }
复制代码

110.zip

132.07 KB, 下载次数: 102, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:650766 发表于 2019-12-2 13:12 | 只看该作者
哥,怎么我弄出来按那个都是滴滴滴呀,点阵也不变
回复

使用道具 举报

板凳
ID:650766 发表于 2019-12-2 13:18 | 只看该作者
哥,声音不变呀,点阵也不变
回复

使用道具 举报

地板
ID:1084700 发表于 2023-6-17 22:49 | 只看该作者
哥,右上角那个显示器怎么才能搜出来啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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