求51单片机 数字音乐盒 汇编语言代码

2024-11-28 14:48:04
推荐回答(2个)
回答1:

Z8279 EQU 8701H
D8279 EQU 8700H
LO EQU 30H
HI EQU 31H
ORG 0000H
AJMP START
ORG 000BH
LJMP T0_INT
START:
MOV SP,#60H
MOV P3,#0FFH
MOV TMOD,#00000000B
MOV IE,#10000010B
LCALL F8279 ;;8279的初始化
LCALL LO_KEY ;;判断是否有下压键
PAN1:
MOV DPTR,Z8279
MOVX A,@DPTR
ANL A,#3FH
MOV R2,A ; ;保存键值
ANL A,#01H ;;键值1
JNZ S_1
JZ P_1
S_1:
LCALL SONG_1
P_1:
MOV A,R2
ANL A,#02H ;;键值2
JNZ S_2
JZ P_2
S_2:
LCALL SONG_2
P_2
MOV A,R2
ANL A,#03H ;;键值3
JNZ S_3
JZ P_3
S_3:
LCALL SONG_3
P_3
MOV A,R2
ANL A,#04H ;;键值4
JNZ S_4
JZ P_4
S_4
LCALL SONG_4
P_4
MOV A,R2
ANL A,#05H ;;键值5
JNZ S_5
JZ PAN1
S_5:
LCALL SONG_5
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SONG_1: ;//歌曲1
MOV R4,#15
LOOP1:
LCALL VALUE1
SETB TR0
MOV R5,#20
LCALL DELAY
CLR TR0
MOV R5,#20
LCALL DELAY
LCALL P_KEY
DJNZ R4,LOOP1
LCALL SONG_2
RET
SONG_2: ;//歌曲2
MOV R4,#15
LOOP2:
LCALL VALUE1
SETB TR0
MOV R5,#20
LCALL DELAY
CLR TR0
MOV R5,#20
LCALL DELAY
LCALL P_KEY
DJNZ R4,LOOP2
LCALL SONG_3
RET
SONG_3: ;//歌曲3
MOV R4,#15
LOOP3:
LCALL VALUE1
SETB TR0
MOV R5,#20
LCALL DELAY
CLR TR0
MOV R5,#20
LCALL DELAY
LCALL P_KEY
DJNZ R4,LOOP3
LCALL SONG_4
RET
SONG_4: ;//歌曲4
MOV R4,#15
LOOP4:
LCALL VALUE1
SETB TR0
MOV R5,#20
LCALL DELAY
CLR TR0
MOV R5,#20
LCALL DELAY
LCALL P_KEY
DJNZ R4,LOOP4
LCALL SONG_5
RET
SONG_5: ;//歌曲5
MOV R4,#15
LOOP5:
LCALL VALUE1
SETB TR0
MOV R5,#20
LCALL DELAY
CLR TR0
MOV R5,#20
LCALL DELAY
LCALL P_KEY
DJNZ R4,LOOP5
LCALL SONG_1
RET
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
VALUE1: ;//歌曲1的频率设置
MOV DPTR,#FREH1
MOV A,R4
MOVC A,@A+DPTR
MOV HI,A
MOV DPTR,#FREL1
MOV A,R4
MOVC A,@A+DPTR
MOV LO,A
MOV R4,#1*****************************************
RET
VALUE2: ;/;/歌曲2的频率设置
MOV DPTR,#FREH2
MOV A,R4
MOVC A,@A+DPTR
MOV HI,A
MOV DPTR,#FREL2
MOV A,R4
MOVC A,@A+DPTR
MOV LO,A
MOV R4,#1
RET
VALUE3: ;//歌曲3的频率设置
MOV DPTR,#FREH3
MOV A,R4
MOVC A,@A+DPTR
MOV HI,A
MOV DPTR,#FREL3
MOV A,R4
MOVC A,@A+DPTR
MOV LO,A
MOV R4,#1
RET
VALUE4: ;//歌曲4的频率设置
MOV DPTR,#FREH4
MOV A,R4
MOVC A,@A+DPTR
MOV HI,A
MOV DPTR,#FREL4
MOV A,R4
MOVC A,@A+DPTR
MOV LO,A
MOV R4,#1
RET
VALUE5: ;//歌曲5的频率设置
MOV DPTR,#FREH5
MOV A,R4
MOVC A,@A+DPTR
MOV HI,A
MOV DPTR,#FREL5
MOV A,R4
MOVC A,@A+DPTR
MOV LO,A
MOV R4,#1
RET
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
T0_INT:
MOV TL0,LO
MOV TH0,HI
CPL P3.4
RETI
DELAY:
MOV R6,#50
D1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
F8279:
MOV DPTR,Z8279
MOV A,#10H
MOVX @DPTR,A
MOV A,#34H
MOVX @DPTR,A
MOV A,#0D1H
MOVX @DPTR,A
LCALL DELAY
MOV A,#80H
MOVX @DPTR,A
MOV A,#40H
MOVX @DPTR,A
RET
LO_KEY:
MOV DPTR,Z8279
MOVX A,@DPTR
ANL A,#0FH
JZ LO_KEY
RET
P_KEY:
MOV DPTR,Z8279
MOVX A,@DPTR
ANL A,#0FH
JNZ SIGN1
JZ SIGN2
SIGN1:
LJMP PAN1
SIGN2:
RET

FREH1 DB 0,226,229,232,233,236,238,240,241,242,244,244,246,247,248
FREL1 DB 0,4,13,10,20,3,8,6,2,23,5,26,1,4,3
FREH2 DB 0,236,229,232,233,226,230,240,231,246,244,234,236,247,248
FREL2 DB 0,4,13,10,20,3,8,6,2,23,5,26,1,4,3
FREH3 DB 0,226,229,232,233,236,238,240,241,242,244,244,246,247,248
FREL3 DB 0,4,13,10,20,3,8,6,2,23,5,26,1,4,3
FREH4 DB 0,226,229,232,233,236,238,240,241,242,244,244,246,247,248
FREL4 DB 0,4,13,10,20,3,8,6,2,23,5,26,1,4,3
FREH5 DB 0,226,229,232,233,236,238,240,241,242,244,244,246,247,248
FREL5 DB 0,4,13,10,20,3,8,6,2,23,5,26,1,4,3
END

回答2:

;这是我实验通过的,但愿对你有帮助

********************************************************************************
;P3.3---生日快乐音乐盒。 p3.3口接小喇叭 *
;********************************************************************************
;* 日期: 2010-3-25 *
;* 版本: 3.0 *
;* 作者: 黄庭剑 *

;********************************************************************************
;* 硬件:此程序在自己开发版上运行通过 *
;********************************************************************************
【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
;********************************************************************************
org 0000h
ajmp main
org 000bh
jmp tim0
org 0080h
main: ;主程序
mov tmod,#01h ;设定时方式
mov ie,#82h ;开中断
start0:
mov 30h,#00h ;
next: mov a,30h
mov dptr,#table
movc a,@a+dptr ;查表取音调和节拍
mov r2,a
jz end0 ;为零,不进行处理.
anl a,#0fh
mov r5,a ;将节拍存入R5
mov a,r2
swap a
anl a,#0fh
jnz sing ;根据音调决定是否演奏.
clr tr0
jmp d1
sing: dec a
mov 22h,a ;将音调存入22H.
rl a
mov dptr,#table1
movc a,@a+dptr ;根据音调决定定时器初值.
mov th0,a ;放入TH0
mov 21h,a
mov a,22h
rl a
inc a
movc a,@a+dptr
mov tl0,a ;放入TL0
mov 20h,a
setb tr0 ;启动定时
d1: call delay
inc 30h
jmp next
end0: clr tr0
jmp start0

tim0: ;定时器中断服务程序
push acc
push psw
mov tl0,20h ;重赋初值.
mov th0,21h
cpl p3.3
pop psw
pop acc
reti

delay: mov r7,#02h ;延时子程序
d2: mov r4,#187
d3: mov r3,#248
djnz r3,$
djnz r4,d3
djnz r7,d2
djnz r5,delay
ret

table1: ;决定音调的定时初值.
dw 64260,64400,64524,64580
dw 64684,64777,64820,64898
dw 64968,65030,65058,65110
dw 65157,65178,65217

table: ;决定音调和节拍的表格,不同的歌曲只是此表不同
;1
db 82h,01h,81h,94h,84h,0b4h,0a4h,04h,82h,01h,81h,94h,84h,0c4h,0b4h,04h
;2
db 82h,01h,81h,0f4h,0d4h,0b4h,0a4h,94h,0e2h,01h,0e1h,0d4h,0b4h,0c4h,0b4h,04h
;3
db 82h,01h,81h,94h,84h,0b4h,0a4h,04h,82h,01h,81h,94h,84h,0c4h,0b4h,04h
;4
db 82h,01h,81h,0f4h,0d4h,0b4h,0a4h,94h,0e2h,01h,0e1h,0d4h,0b4h,0c4h,0b4h,04h,00
end