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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 簡易電子琴的設計

          簡易電子琴的設計

          作者: 時間:2012-07-05 來源:網(wǎng)絡 收藏
          本次設計中單片機晶振為12MHZ,那么定時器的計數(shù)周期為1MHZ,假如選擇工作方式1,那T值便為T= 216--5﹡105/相應的頻率 ,那么根據(jù)不同的頻率計算出應該賦給定時器的計數(shù)值,列出不同音符與單片機計數(shù)T0相關的計數(shù)值如下表所示:

          音符
          頻率(HZ)
          簡譜碼(T值)
          中 1 DO
          523
          64580
          中 2 RE
          587
          64684
          中 3 M
          659
          64777
          中 4 FA
          698
          64820
          中 5 SO
          784
          64898
          中 6 LA
          880
          64968
          中 7 SI
          988
          65030

          采用查表程序進行查表時,可以為這個音符建立一個表格,有助于單片機通過查表的方式來獲得相應的數(shù)據(jù):
          TABLE DW 64580,64684,64777,64820,64898,64968,65030
          源程序:
          方案一:產(chǎn)生按鍵音符
          ORG 0000H
          LJMP MAIN
          ORG 000BH
          LJMP BREAK
          MAIN: MOV TMOD,#01H ;設置定時器0的工作方式
          SETB EA
          SETB ET0 ; 設置定時器0中斷
          SETB TR0 ; 啟動定時器0
          WAIT1: LCALL KEY ; 調(diào)用KEY子程序,判斷有鍵按下否?第幾個鍵?
          CLR EA ;屏蔽中斷
          CJNE R3,#00H,WAIT1 ;如果R3=0,表示有鍵按下
          MOV A,22H ;將22H里存放的按鍵號送給A
          RL A ; 因為查表里都是字,所以得乘2查得數(shù)據(jù)
          MOV DPTR,#TABLE ;指向表頭
          MOVC A,@A+DPTR ; 查表
          MOV TH0,A ;將數(shù)據(jù)高位送TH0
          MOV 21H,A ; 將高位備份
          MOV A,22H ;將22H里存放的按鍵號送給A
          RL A ;因為查表里都是字,所以得乘2查得數(shù)據(jù)
          INC A ;取低位數(shù)據(jù)
          MOVC A,@A+DPTR
          MOV TL0,A
          MOV 20H,A
          WAIT2: LCALL KEY
          SETB EA
          CJNE R3,#00H,WAIT1
          JMP WAIT2
          KEY: MOV R3,#00H ; KEY子程序,判斷有鍵按下否?第幾個鍵?
          MOV R1,#0FFH
          MOV R0,#00H
          MOV A,R1
          MOV P2,A
          MOV A,P2
          CLR C
          CPL C ;利用標志位CY來判斷是哪個鍵按下
          MOV R2,#08H
          WAIT3: RLC A ;移位判斷
          JNC STORE
          INC R0
          DJNZ R2,WAIT3
          STORE: MOV 22H,R0 ; 將按鍵號存22H,R3=0有鍵按下
          MOV R3,#00H
          RET
          BREAK: PUSH ACC ; 中斷產(chǎn)生方波,從P1.0口輸出
          PUSH PSW
          MOV TL0,20H
          MOV TH0,21H
          CPL P1.0
          POP PSW
          POP ACC
          RETI
          TABLE: DW 65030,64968,64898,64820,64777,64684,64580 ; 7,6,5,4,3,2,1
          END
          方案二:產(chǎn)生按鍵音符
          ORG 0000H
          SJMP START
          ORG 000BH
          AJMP INT_0
          ORG 0030H
          START: MOV P1,#00H
          SETB EA
          SETB ET0 ;計數(shù)器0
          MOV TMOD,#02H
          MOV TH1,#09CH
          MOV TL1,#09CH ;定時器初植
          CLR TR0 ;定時器不允許
          SCAN: ;鍵盤掃描
          MOV A,P2 ;判斷鍵盤按下,跳到SCAN_1,若未按,繼續(xù)掃描
          CJNE A,#0FFH,SCAN_1
          NOP
          SJMP SCAN
          SCAN_1:ACALL DELAY ;是不是真的要按下?如果是,則跳轉(zhuǎn)SU_KEY查詢是哪個按下?
          MOV A,P2
          CJNE A,#0FFH,SU_KEY
          NOP
          SJMP SCAN
          SU_KEY:JNB P2.1,MU_1 ;判斷是哪個鍵按下?
          JNB P2.2,MU_2
          JNB P2.3,MU_3
          JNB P2.4,MU_4
          JNB P2.5,MU_5
          JNB P2.6,MU_6
          JNB P2.7,MU_7
          SJMP SCAN
          ;R1信號周期
          MU_1: MOV R1,#19 ;如果第一個按鍵按下,則R1=19,同時程序轉(zhuǎn)NEXT
          SJMP NEXT
          MU_2: MOV R1,#17
          SJMP NEXT
          MU_3: MOV R1,#15
          SJMP NEXT
          MU_4: MOV R1,#14
          SJMP NEXT
          MU_5: MOV R1,#13
          SJMP NEXT
          MU_6: MOV R1,#11
          SJMP NEXT
          MU_7: MOV R1,#10
          SJMP NEXT
          NEXT: MOV A,R1
          MOV R0,A
          SETB TR0 ;啟動定時器0
          NEXT_1:MOV A,P2 ; 沒鍵按下繼續(xù)執(zhí)行,有鍵按下,返回讀引腳
          CJNE A,#0FFH,NEXT_1
          ACALL DELAY
          MOV A,P2 ;真的沒鍵按下?
          CJNE A,#0FFH,NEXT_1
          CLR TR0 ;不響
          AJMP SCAN ;掃描鍵盤去

          關鍵詞: 電子琴 AT89C51 LM324

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁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); })();