新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機控制蜂鳴器播放5首歌曲匯編程序

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

        作者: 時間:2016-11-28 來源:網絡 收藏
        ;機器人代碼:(外部中斷用來接紅外傳感器的)
        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 ;是否播放標志,0停止,1播放
        FLAG_CH EQU 04H ;演奏時是否換音符,1有效
        FLAG_LAST EQU 05H ;播放時是否到最后64分音符
        FLAG_PRESS EQU 06H ;是否有演奏按鍵
        FLAG_GO EQU 07H ;是否行走標志位(1為行走,0為停止)
        STAT_0 EQU 08H ;4位行走狀態,對應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 ;定時器計數(設定定時周期的倍數)
        CU_COUNTER EQU 41H ;當前定時器計數
        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 ;當前樂曲的音長表首地址高八位
        TAB_L EQU 43H ;當前樂曲的音長表首地址低八位
        TAB_TONE_H EQU 44H ;當前樂曲的音高表首地址高八位
        TAB_TONE_L EQU 45H ;當前樂曲的音高表首地址低八位
        THIS_NUM EQU 46H ;存儲當前按鍵號
        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 ;查表時的高低字節序號存儲
        TAB_2 EQU 4FH
        CMD EQU 50H
        ;行走命令存儲 (1:功能選擇、2:加速、3:減速、4:原速、5:停止/前進、
        ;(6:左轉、7:右轉、8:朝前) )
        COUNTER_LOOP EQU 51H ;定時器循環計數
        ; STATUS EQU 52H ;行走狀態寄存
        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位計數器定時 ,1為8位自動裝載
        MOV TH0, #0FFH
        MOV TL0, #0FFH
        MOV TH1, #0CCH
        MOV TL1, #0CCH
        MOV SCON, #0D0H
        SETB IT0 ;設定外部中斷0為負跳變觸發
        SETB PX0 ;外部中斷為高優先級
        SETB PS
        SETB EA
        SETB ET0
        SETB EX0 ;開外部中斷
        SETB ES
        SETB TR1
        ;CALL DELAY
        ;-------------------------------------------
        LOOP: JB FLAG_F, PLAY ;演奏功能跳轉
        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,樂曲結束,重新賦初值開始
        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
        ;****************串口中斷服務程序******************
        ;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 ;選曲跳轉
        ;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 ;演奏樂曲時跳轉
        ;SETB FLAG_P ;允許播放
        ;MOV POSITION, #0H ;賦樂曲位置值為0,即從頭開始撥出
        ;MOV COUNTER, #02H
        ;MOV CU_COUNTER, COUNTER ;賦當前定時次數和應定時次數值,使之相等,以使定時器工作時就播放,無需等待
        ;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 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 成都市| 涟源市| 思南县| 永吉县| 荆州市| 兴化市| 冕宁县| 冷水江市| 连南| 喜德县| 辽阳市| 康定县| 平安县| 达尔| 建湖县| 林甸县| 孟州市| 云安县| 洛隆县| 南川市| 上思县| 万年县| 蒙山县| 星子县| 镇宁| 时尚| 开远市| 鄂伦春自治旗| 肥城市| 漳浦县| 天气| 昭觉县| 交口县| 阿克陶县| 宁南县| 泾川县| 昌乐县| 茶陵县| 陇南市| 天水市| 舒城县|