<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機設(shè)計的電子琴

          單片機設(shè)計的電子琴

          作者: 時間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
          功能說明:

          電子琴小巧、聲音悅耳、便于攜帶、成本低、美觀大方,能演奏絕大部分音樂。本作品采用的16鍵設(shè)計方法,也可以擴展成21鍵的。另外還能在這個基礎(chǔ)上附加一些功能。

          本文引用地址:http://www.ex-cimer.com/article/201611/317331.htm

          1.由4×4組成的16個按鈕矩陣,設(shè)計成16個音。

          2.硬件原理圖:

          程序附錄:

          實物圖:

          原理圖:

          源代碼:

          ;************* 單片機--電子琴 *******************;
          ;*MCU: AT89C52 ;
          ;*MCU-crystal: 12M ;
          ;*Version: 01 ;
          ;*Last Updata: 2007-6-9 ;
          ;*Author: zhaojun ;
          ;*Description: ;
          ;P2口是電子琴按鍵輸入 ;
          ;P1.0為音頻輸出 ;
          ;***************WAVE-E6000/T*********************;
          ;******************************;
          ; 電子琴 ;
          ;******************************;
          ORG 0000H ;主程序起始地址
          JMP START ;跳至主程序
          ORG 000BH ;TIMER0中斷起始地址
          JMP TIM0 ;跳至TIMER0中斷起始地址
          START: MOV TMOD,#00000001B ;設(shè)TIMER0在MODE1
          MOV IE,#10000010B ;中斷使能
          SETB TR0 ;啟動TIMER0

          L1: CALL KEY ;調(diào)用KEY,判斷是否有鍵按下?
          CLR EA ;中斷屏蔽
          JB F0,L1 ;沒按則F0=1,有按則F0=0
          MOV A,22H ;有按則將取碼指針暫存地址載入A
          RL A ;乘2
          MOV DPTR,#TABLE ;
          MOVC A,@A+DPTR ;至TABLE取碼,取T的值
          MOV TH0,A ;取到的高位字節(jié)存入TH0
          MOV A,21H ;取到的高位字節(jié)存入(21H)
          MOV A,22H ;再載入取碼指針值
          RL A ;乘2
          INC A ;加1
          MOVC A,@A+DPTR ;至TABLE1取相對的低位字節(jié)計數(shù)值
          MOV TL0,A ;取到的低位字節(jié)存入TLO
          MOV 20H,A ;取到的低位字節(jié)存入(20H)
          L2: CALL KEY ;調(diào)用KEY判斷有按否?
          SETB EA ;中斷使能
          JB F0,L1 ;有按否?
          JMP L2 ;有則跳至L2

          KEY: SETB F0 ;設(shè)F0=1
          MOV R3,#0F7H ;掃描初值(P23=0)
          MOV R1,00H ;取碼指針初值
          L3: MOV A,R3 ;載入掃描指針
          MOV P2,A ;輸出至P2,開始掃描(P23~P20)一行為0
          MOV A,P2 ;讀入P2
          CLR C
          CPL C ;令C=1
          MOV R5,#04H ;檢測P27~P24
          L4: RLC A ;左移一位(P27~P24)
          JNC KEYIN ;檢測行C=0,表示被按
          INC R1 ;沒按則取碼值指針加1
          DJNZ R5,L4 ;4列檢測完畢了?
          MOV A,R3 ;載入掃描指針
          CLR C
          CPL C ;C=1
          RRC A ;掃描下一行,即下一行為0
          MOV R3,A ;存回R3掃描指針寄存器
          JC L3 ;C=0表示掃描完畢
          RET
          KEYIN: MOV 22H,R1 ;取碼指針存入22H地址
          CLR F0 ;令F0=0
          RET

          TIM0: PUSH ACC ;將A的值暫存于堆棧
          PUSH PSW ;將PSW的值暫存于堆棧
          MOV TL0,20H ;重設(shè)計數(shù)值
          MOV TH0,21H
          CPL P1.0 ;將P1.0位反相
          POP PSW ;至堆棧取回PSW的值
          POP ACC ;至堆棧取回A的值
          RETI ;返回主程序

          TABLE: DW 64021,64103,64260,64400
          DW 64524,64580,64684,64777
          DW 64820,64898,64968,65030
          DW 65058,65110,65157,65178
          END



          關(guān)鍵詞: 單片機電子

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();