怎么样才能在汇编语言程序设计插入音乐

怎么样才能在汇编语言程序设计插入音乐,第1张

下面是一段单片机音乐程序,你look 一 look吧。

单片机唱歌

ORG 0000H

LJMP START

ORG 000BH

INC 20H中断服务,中断计数器加1

MOV TH0,#0D8H

MOV TL0,#0EFH 12M晶振,形成10毫秒中断

RETI

START:

MOV SP,#50H

MOV TH0,#0D8H

MOV TL0,#0EFH

MOV TMOD,#01H

MOV IE,#82H

MUSIC0:

NOP

MOV DPTR,#DAT 表头地址送DPTR

MOV 20H,#00H 中断计数器清0

MUSIC1:

NOP

CLR A

MOVC A,@A+DPTR 查表取代码

JZ END0 是00H,则结束

CJNE A,#0FFH,MUSIC5 如果是休止符,往下执行

LJMP MUSIC3

MUSIC5:

NOP

MOV R6,A R6=18H音符的频率

INC DPTR DPTR加一

MOV A,#0

MOVC A,@A+DPTR 取节拍代码送R7

MOV R7,A R7=30H音符发音的时间

SETB TR0启动计数

MUSIC2:

NOP

CPL p3.6 p3.6是音乐输出引脚

MOV A,R6

MOV R3,A R3=R6=18H

LCALL DEL

MOV A,R7

CJNE A,20H,MUSIC2 中断计数器(20H)=R7否?

不等,则继续循环

MOV 20H,#00H 等于,则取下一代码

INC DPTR

LJMP MUSIC1

MUSIC3:

NOP 休止100毫秒

CLR TR0

MOV R2,#0DH R2=13

MUSIC4:

NOP

MOV R3,#0FFH R3=255

LCALL DEL

DJNZ R2,MUSIC4

INC DPTR

LJMP MUSIC1

END0:

NOP

MOV R2,#0FFH 歌曲结束,延时1秒后继续

MUSIC6:

MOV R3,#00H

LCALL DEL

DJNZ R2,MUSIC6

LJMP MUSIC0

DEL:

NOP

DEL3:

MOV R4,#02H

DEL4:

NOP

DJNZ R4,DEL4

NOP

DJNZ R3,DEL3

RET

NOP

DAT:

DB 18H, 30H, 1CH , 10H

DB 20H, 40H, 1CH , 10H

DB 18H, 10H, 20H , 10H

DB 1CH, 10H, 18H , 40H

DB 1CH, 20H, 20H , 20H

DB 1CH, 20H, 18H , 20H

DB 20H, 80H, 0FFH, 20H

DB 30H, 1CH, 10H , 18H

DB 20H, 15H, 20H , 1CH

DB 20H, 20H, 20H , 26H

DB 40H, 20H, 20H , 2BH

DB 20H, 26H, 20H , 20H

DB 20H, 30H, 80H , 0FFH

DB 20H, 20H, 1CH , 10H

DB 18H, 10H, 20H , 20H

DB 26H, 20H, 2BH , 20H

DB 30H, 20H, 2BH , 40H

DB 20H, 20H, 1CH , 10H

DB 18H, 10H, 20H , 20H

DB 26H, 20H, 2BH , 20H

DB 30H, 20H, 2BH , 40H

DB 20H, 30H, 1CH , 10H

DB 18H, 20H, 15H , 20H

DB 1CH, 20H, 20H , 20H

DB 26H, 40H, 20H , 20H

DB 2BH, 20H, 26H , 20H

DB 20H, 20H, 30H , 80H

DB 20H, 30H, 1CH , 10H

DB 20H, 10H, 1CH , 10H

DB 20H, 20H, 26H , 20H

DB 2BH, 20H, 30H , 20H

DB 2BH, 40H, 20H , 15H

DB 1FH, 05H, 20H , 10H

DB 1CH, 10H, 20H , 20H

DB 26H, 20H, 2BH , 20H

DB 30H, 20H, 2BH , 40H

DB 20H, 30H, 1CH , 10H

DB 18H, 20H, 15H , 20H

DB 1CH, 20H, 20H , 20H

DB 26H, 40H, 20H , 20H

DB 2BH, 20H, 26H , 20H

DB 20H, 20H, 30H , 30H

DB 20H, 30H, 1CH , 10H

DB 18H, 40H, 1CH , 20H

DB 20H, 20H, 26H , 40H

DB 13H, 60H, 18H , 20H

DB 15H, 40H, 13H , 40H

DB 18H, 80H, 00H

end

DATA SEGMENT

INFO1 DB 0DH,0AH,'WELCOME YOU TO COME HERE!$'

INFO2 DB 0DH,0AH,'this is a music program!$'

INFO3 DB 0DH,0AH,'please select!$'

INFO4 DB 0DH,0AH,'INPUT ERROR!$'

INFO5 DB 0DH,0AH,'PLEASE INPUT AGAIN!$'

MUSLIST DB 0DH,0AH,'A MUSIC1'

DB 0DH,0AH,'B MUSIC2'

DB 0DH,0AH,'C MUSIC3'

DB 0DH,0AH,'Q EXIT'

db 0dh,0ah,'$'

音乐一*********************************************************

MUS_FREG1 DW 330,294,262,294,3 DUP (330)

DW 3 DUP (294),330,392,392

DW 330,294,262,294,4 DUP (330)

DW 294,294,330,294,262,-1

MUS_TIME1 DW 6 DUP (25),50

DW 2 DUP (25,25,50)

DW 12 DUP (25),100

*********************************************************音乐二

MUS_FREG2 DW 330,392,330,294,330,392,330,294,330

DW 330,392,330,294,262,294,330,392,294

DW 262,262,220,196,196,220,262,294,332,262,-1

MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100

DW 2 DUP(50,50,25,25),100

DW 3 DUP(50,25,25),100

********************************************************音乐三

MUS_FREG3 DW 262,262,294,262,349

DW 330,262,262,294,262

DW 392,349,262,262,523

DW 440,349,262,262,466

DW 466,440,262,392,349,-1

MUS_TIME3 DW 50,50,100,100,100

DW 100,100,50,50,100,100

DW 100,100,100,50,50,100

DW 100,100,100,100,100,50

DW 50,100,100,100,100,100

DATA ENDS

STACK SEGMENT

DB 200 DUP ('STACK')

STACK ENDS

CODE SEGMENT

ASSUME DS:DATA,SS:STACK,CS:CODE

START:

MOV AX,DATA

MOV DS,AX

MOV aH, 0

MOV AL,00

INT 10H

*****定义一个宏*****

SHOW MACRO b

LEA DX,b

MOV AH,9

INT 21H

ENDM

**********************音乐地址宏

ADDRESS MACRO A,B

LEA SI,A

LEA BP,DS:B

ENDM

***********************

show INFO1

show INFO2

show INFO3

show MUSLIST

INPUT:MOV AH,01H

INT 21H

CMP AL,'Q'

JZ retu

CMP AL,'A'

JNZ B0

ADDRESS MUS_FREG1,MUS_TIME1

CALL MUSIC

JMP EXIT1

B0: CMP AL,'B'

JNZ C0

ADDRESS MUS_FREG2,MUS_TIME2

CALL MUSIC

JMP EXIT1

C0: CMP AL,'C'

JNZ exit

ADDRESS MUS_FREG3,MUS_TIME3

CALL MUSIC

EXIT1:show INFO5

JMP INPUT

EXIT:

call clear

show INFO4

show INFO5

show INFO1

show INFO2

show INFO3

show MUSLIST

jmp input

RETU: MOV AH,4CH

INT 21H

******************************************发声

GENSOUND PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH DI

MOV AL,0B6H

OUT 43H,AL

MOV DX,12H

MOV AX,348ch

DIV DI

OUT 42H,AL

MOV AL,AH

OUT 42H,AL

IN AL,61H

MOV AH,AL

OR AL,3

OUT 61H,AL

WAIT1:MOV CX,3314

call waitf

DELAY1: DEC BX

JNZ WAIT1

MOV AL,AH

OUT 61H,AL

POP DI

POP DX

POP CX

POP BX

POP AX

RET

GENSOUND ENDP

********************************************

waitf proc near

push ax

waitf1:

in al,61h

and al,10h

cmp al,ah

je waitf1

mov ah,al

loop waitf1

pop ax

ret

waitf endp

*********************************************

MUSIC PROC NEAR

PUSH DS

SUB AX,AX

PUSH AX

FREG: MOV DI,[SI]

CMP DI,-1

JE END_MUS

MOV BX,DS:[BP]

CALL GENSOUND

ADD SI,2

ADD BP,2

JMP FREG

END_MUS:

RET

MUSICENDP

************************************************clear!!!

clear proc near

push ax

push bx

push cx

push dx

mov ah,6

mov al,0

mov ch,0

mov cl,0

mov dh,24

mov dl,79

mov bh,7

int 10h

pop dx

pop cx

pop bx

pop ax

ret

clear endp

CODE ENDS

END START

这是一个例子,希望有用


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11693531.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存