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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 51單片機(jī)控制蜂鳴器播放5首歌曲匯編程序

          51單片機(jī)控制蜂鳴器播放5首歌曲匯編程序

          作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
          ;機(jī)器人代碼:(外部中斷用來接紅外傳感器的)
          ORG 0000H
          JMP INIT
          ORG 0003H
          JMP INT_0
          ORG 000BH
          JMP INT_T
          ORG 0023H
          JMP INT_S
          ;-------------------------------------
          FLAG_F EQU 01H ;功能選擇,0為播放,1為演奏
          FLAG_L EQU 02H ;指示燈選擇,0指示燈亮或1亮
          FLAG_P EQU 03H ;是否播放標(biāo)志,0停止,1播放
          FLAG_CH EQU 04H ;演奏時是否換音符,1有效
          FLAG_LAST EQU 05H ;播放時是否到最后64分音符
          FLAG_PRESS EQU 06H ;是否有演奏按鍵
          FLAG_GO EQU 07H ;是否行走標(biāo)志位(1為行走,0為停止)
          STAT_0 EQU 08H ;4位行走狀態(tài),對應(yīng)P1.0--P1.3
          STAT_1 EQU 09H
          STAT_2 EQU 0AH
          STAT_3 EQU 0BH
          FLAG_MUTE EQU 0CH
          PERIOD_H EQU 30H ;音長(定時器高位)
          PERIOD_L EQU 31H ;音長(定時器低位)
          COUNTER EQU 32H ;定時器計數(shù)(設(shè)定定時周期的倍數(shù))
          CU_COUNTER EQU 41H ;當(dāng)前定時器計數(shù)
          TONE EQU 33H ;音高
          SPEED EQU 34H ;樂曲速度
          D_1 EQU 35H
          D_2 EQU 36H
          P_1 EQU 37H
          P_2 EQU 38H
          NUM EQU 39H ;樂曲的位置(第幾首)
          POSITION EQU 40H ;樂曲中音符的位置
          TAB_H EQU 42H ;當(dāng)前樂曲的音長表首地址高八位
          TAB_L EQU 43H ;當(dāng)前樂曲的音長表首地址低八位
          TAB_TONE_H EQU 44H ;當(dāng)前樂曲的音高表首地址高八位
          TAB_TONE_L EQU 45H ;當(dāng)前樂曲的音高表首地址低八位
          THIS_NUM EQU 46H ;存儲當(dāng)前按鍵號
          PRE_NUM EQU 47H ;存儲上次按鍵號
          COUNTER_1 EQU 48H ;判斷是否為最后64分音符用,其值等于COUNTER-1
          D_L1 EQU 49H
          D_L2 EQU 4AH
          D_L3 EQU 4BH
          P_L1 EQU 4CH
          P_L2 EQU 4DH
          TAB_1 EQU 4EH ;查表時的高低字節(jié)序號存儲
          TAB_2 EQU 4FH
          CMD EQU 50H
          ;行走命令存儲 (1:功能選擇、2:加速、3:減速、4:原速、5:停止/前進(jìn)、
          ;(6:左轉(zhuǎn)、7:右轉(zhuǎn)、8:朝前) )
          COUNTER_LOOP EQU 51H ;定時器循環(huán)計數(shù)
          ; STATUS EQU 52H ;行走狀態(tài)寄存
          PERIOD_TEMP EQU 53H
          ;*****************主程序*************************
          ORG 0030H
          INIT: ; CALL LONG
          CLR P3.7
          ; SETB P3.7
          MOV SP, #54H
          CLR FLAG_F ;初始化
          CLR FLAG_L
          CLR FLAG_P
          CLR FLAG_LAST
          SETB FLAG_CH
          CLR FLAG_PRESS
          SETB FLAG_GO
          CLR FLAG_MUTE
          SETB STAT_0
          SETB STAT_1
          SETB STAT_2
          SETB STAT_3
          MOV CMD, #00H
          MOV PERIOD_H, #00H
          MOV PERIOD_L, #00H
          MOV TONE, #00H
          MOV SPEED, #00H
          MOV COUNTER, #00H
          MOV NUM, #00H
          MOV POSITION, #00H
          ;MOV STATUS, #0FFH
          MOV D_1, #80
          MOV D_2, #79
          MOV P_L1, #01H
          MOV P_L2, #0FFH
          MOV TMOD, #21H ;定時器0為16位計數(shù)器定時 ,1為8位自動裝載
          MOV TH0, #0FFH
          MOV TL0, #0FFH
          MOV TH1, #0CCH
          MOV TL1, #0CCH
          MOV SCON, #0D0H
          SETB IT0 ;設(shè)定外部中斷0為負(fù)跳變觸發(fā)
          SETB PX0 ;外部中斷為高優(yōu)先級
          SETB PS
          SETB EA
          SETB ET0
          SETB EX0 ;開外部中斷
          SETB ES
          SETB TR1
          ;CALL DELAY
          ;-------------------------------------------
          LOOP: JB FLAG_F, PLAY ;演奏功能跳轉(zhuǎn)
          OUT: JNB FLAG_P, LOOP ;播放部分
          MOV A, TONE
          JZ MUTE
          JB FLAG_MUTE, MUTE_1
          SETB P3.7
          MUTE_1: CJNE A, #1FH, NO_OVER
          CLR TR0 ;TONE值等于1FH,樂曲結(jié)束,重新賦初值開始
          CLR P3.7
          ORL P1, #0FH
          MOV POSITION, #00H
          MOV CU_COUNTER, COUNTER
          CALL LONG
          MOV TONE, #00
          MOV COUNTER_LOOP, #0
          SETB TR0
          JMP LOOP
          NO_OVER:
          MUTE: CALL DELAY
          CLR P3.7
          CALL DELAY
          JMP LOOP
          ;------------------
          PLAY: JNB FLAG_PRESS, OVER
          SETB P3.7 ;演奏部分
          CALL DELAY
          CLR P3.7
          OVER: CALL DELAY
          JMP LOOP
          ;****************串口中斷服務(wù)程序******************
          ;INT_S: PUSH ACC
          ;CLR RI
          ;MOV A, SBUF
          ;JB P, R_1
          ;R_0: JB RB8, TO_OVER
          ;JMP RIGHT
          ;R_1: JNB RB8, TO_OVER
          ;RIGHT: MOV NUM, A ;賦樂曲號
          ;ANL A, #0FH
          ;JNZ SELECT ;選曲跳轉(zhuǎn)
          ;MOV A, NUM
          ;SWAP A
          ;MOV CMD, A
          ;----------------------------
          ;CJNE A, #01H, IF_2
          ;CLR P3.7
          ;CPL FLAG_F
          ;ORL P1, #0FH
          ;JB FLAG_F, PLAY_SET
          ;SETB FLAG_GO
          ;JMP INT_OVER
          ;PLAY_SET: CLR FLAG_P
          ;CLR TR0
          ;CLR FLAG_GO
          ;CLR FLAG_PRESS
          ;JMP INT_OVER
          ;IF_2: CJNE A, #02H, IF_3
          ;MOV A, PERIOD_H
          ;ADD A, #4
          ;MOV NUM, A
          ;CLR C
          ;SUBB A, #240
          ;JC S_UP
          ;JMP INT_OVER
          ;S_UP: MOV PERIOD_H, NUM
          ;JMP INT_OVER
          ;IF_3: MOV A, CMD
          ;CJNE A, #03H, IF_4
          ;MOV A, PERIOD_H
          ;SUBB A, #9
          ;MOV NUM, A
          ;CLR C
          ;SUBB A, #100
          ;JNC S_DOWN
          ;JMP INT_OVER
          ;S_DOWN: MOV PERIOD_H, NUM
          ;JMP INT_OVER
          ;IF_4: MOV A, CMD
          ;CJNE A, #04H, IF_5
          ;MOV PERIOD_H, PERIOD_TEMP
          ;JMP INT_OVER
          ;IF_5: CJNE A, #05H, IF_9
          ;CPL FLAG_GO
          ;JMP INT_OVER
          ;IF_9: CJNE A, #09H, CMD_OVER
          ;CPL FLAG_MUTE
          ;CMD_OVER:
          ;TO_OVER: JMP INT_OVER
          ;---------------------------
          ;SELECT: DEC NUM
          ;MOV A, NUM
          ;ANL A, #0F0H
          ;JNZ TO_OVER
          ;MOV A, NUM
          ;CLR C
          ;SUBB A, #11
          ;JNC TO_OVER
          ;MOV A, NUM
          ;RL A
          ;MOV TAB_1, A
          ;MOV TAB_2, TAB_1
          ;INC TAB_2
          ;MOV DPTR, #TAB_SPEED ;查樂曲速度
          ;MOV A, TAB_1
          ;MOVC A, @A+DPTR
          ;MOV PERIOD_L, A
          ;MOV TL0, A
          ;MOV A, TAB_2
          ;MOVC A, @A+DPTR
          ;MOV PERIOD_H, A
          ;MOV PERIOD_TEMP, A
          ;MOV TH0, A
          ;MOV DPTR, #TAB_NUM_T ;查音高位置首地址
          ;MOV A, TAB_1
          ;MOVC A, @A+DPTR
          ;MOV TAB_TONE_H, A
          ;MOV A, TAB_2
          ;MOVC A, @A+DPTR
          ;MOV TAB_TONE_L, A
          ;MOV DPTR, #TAB_NUM_L ;查音長位置首地址
          ;MOV A, TAB_1
          ;MOVC A, @A+DPTR
          ;MOV TAB_H, A
          ;MOV A, TAB_2
          ;MOVC A, @A+DPTR
          ;MOV TAB_L, A
          ;HANDLE: JB FLAG_F, PLAY_0 ;演奏樂曲時跳轉(zhuǎn)
          ;SETB FLAG_P ;允許播放
          ;MOV POSITION, #0H ;賦樂曲位置值為0,即從頭開始撥出
          ;MOV COUNTER, #02H
          ;MOV CU_COUNTER, COUNTER ;賦當(dāng)前定時次數(shù)和應(yīng)定時次數(shù)值,使之相等,以使定時器工作時就播放,無需等待
          ;MOV COUNTER_1, COUNTER
          ;DEC COUNTER_1
          ;CLR FLAG_LAST
          ;MOV COUNTER_LOOP, #0
          ;SETB TR0 ;啟動定時器0
          ;JMP INT_OVER
          ;PLAY_0: CLR P3.7
          ;SETB FLAG_PRESS
          ;SETB FLAG_CH
          ;MOV DPTR, #TAB_TONE ;查音高表
          ;MOV A, NUM
          ;ADD A, #07
          ;RL A ;音高表每組音高有兩個延時值
          ;MOV TAB_1, A
          ;MOVC A, @A+DPTR ;查第一個延時值
          ;MOV D_1, A
          ;MOV A, TAB_1
          ;INC A
          ;MOVC A, @A+DPTR
          ;MOV D_2, A
          ;JB FLAG_L, L_0
          ;SETB FLAG_L
          ;CLR P3.4
          ;SETB P3.3
          ;JMP INT_OVER
          ;L_0: CLR FLAG_L
          ;CLR P3.3
          ;SETB P3.4
          ;INT_OVER: POP ACC
          ;RETI

          上一頁 1 2 下一頁

          評論


          技術(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); })();