微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机控制蜂鸣器播放5首歌曲汇编程序

51单片机控制蜂鸣器播放5首歌曲汇编程序

时间: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_

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top