找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5775|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)電子琴 帶4*4矩陣鍵盤(pán)和8*8點(diǎn)陣仿真與源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
電子琴仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源碼:
  1. /*
  2. 名稱(chēng):簡(jiǎn)易電子琴設(shè)計(jì)
  3. 說(shuō)明:本程序運(yùn)行時(shí),按下矩陣鍵盤(pán)中的按鍵,數(shù)碼管會(huì)顯示當(dāng)前的按鍵值,蜂鳴器會(huì)播放對(duì)應(yīng)的音符
  4. */
  5. #include <reg52.h>
  6. #define uchar unsigned char
  7. #define uint  unsigned int
  8. #define KeyIO  P1   //矩陣鍵盤(pán)的控制IO
  9. sbit    BEEP = P3^4;  //蜂鳴器對(duì)應(yīng)的控制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. //各音符對(duì)應(yīng)的延時(shí)
  18. uint code Table_Tone[] = {
  19. 63628,63835,64021,64103,
  20. 64260,64400,64524,64580};
  21. uchar KeyNo;    //按鍵序號(hào)
  22. /**  延時(shí)子函數(shù)  **/
  23. void DelayMS(uchar time)
  24.   {
  25. uchar i;
  26. while(time--)
  27.    {
  28.   for(i=0; i<120; i++);
  29.    }
  30.   }
  31. /**  矩陣鍵盤(pán)的掃描子函數(shù)  **/
  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 個(gè)為 0,3個(gè)仍為 1
  56. // Temp = KeyIO ^ 0x0f;   //異或操作會(huì)把 3 個(gè) 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 個(gè)為 0,3個(gè)仍為 1
  71. // Temp = (KeyIO >> 4) ^ 0x0f;  //將高四位移至低四位,并將其中唯一的 0 變?yōu)?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. /**  定時(shí)器 0 中斷服務(wù)程序,不同頻率的聲音由該中斷產(chǎn)生  **/
  93. void Play_Tone() interrupt 1
  94.   {
  95. TH0  = Table_Tone[KeyNo] / 256;
  96. TL0  = Table_Tone[KeyNo] % 256;
  97. BEEP = ~BEEP;
  98.   }
  99. /**  主函數(shù)  **/
  100. void main(void)
  101.   {
  102. TMOD  = 0x01;
  103. IE    = 0x82;
  104. while(1)
  105.    {
  106.   KeyIO = 0xf0;     //發(fā)送掃描碼
  107.   if (KeyIO != 0xf0)    //如果有按鍵按下
  108.     {
  109.    Key_Scan();     //矩陣鍵盤(pán)的掃描
  110.    led_shi();
  111.    TR0 = 1;     //啟動(dòng)定時(shí)器,并發(fā)出對(duì)應(yīng)的聲音
  112.     }
  113.   else
  114.     {
  115.    TR0 = 0;     //停止播放聲音
  116.     }
  117.   DelayMS(2);
  118.    }
  119.   }
復(fù)制代碼

110.zip

132.07 KB, 下載次數(shù): 102, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:650766 發(fā)表于 2019-12-2 13:12 | 只看該作者
哥,怎么我弄出來(lái)按那個(gè)都是滴滴滴呀,點(diǎn)陣也不變
回復(fù)

使用道具 舉報(bào)

板凳
ID:650766 發(fā)表于 2019-12-2 13:18 | 只看該作者
哥,聲音不變呀,點(diǎn)陣也不變
回復(fù)

使用道具 舉報(bào)

地板
ID:1084700 發(fā)表于 2023-6-17 22:49 | 只看該作者
哥,右上角那個(gè)顯示器怎么才能搜出來(lái)啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表