//两只老虎汇编程序,成功调试,p2.4=beep
此方法与第一种方法不同之处,第一种是将所有音阶低中高所对应的定时初值列一个表,而本程序采用将一首歌曲的对应音阶频率按序列表,再列出每个音阶的节拍表,通过同步查表实现音乐程序。
org 0000h
ajmp main
org 000bh
ajmp timer0
org 001bh
ajmp timer1
org 0030h
main:
mov tmod,#11h
mov th1,#3ch
mov tl1,#0b0h
mov IE,#8ah
mov r0,#0
mov r1,#0
mov r7,#0
setb tf0
setb tr1
sjmp $
timer0: mov a,r0
mov dptr,#freq
movc a,@a+dptr
mov th0,a
mov a,r0
inc a
movc a,@a+dptr
mov tl0,a
setb tr0
cpl p2.4
reti
/********控制节拍********/
timer1:
mov th1,#3ch
mov tl1,#0b0h
cjne r7,#00,next
mov a,r1
mov dptr,#time
movc a,@a+dptr
rl a ;控制音阶长短,加倍
mov r7,a
ajmp exit
next:djnz r7,exit
inc r0 ;修改频率指针
inc r0
inc r1 ;修改节拍指针
mov a,r1
mov dptr,#time
movc a,@a+dptr
cjne a,#0ffh,exit
clr tr0
clr tr1
exit:
reti
/*******直接根据歌曲按顺序给出每个音阶的定时初值******/
/****两只老虎对应的音阶初值****/
freq:dw 64579,64684,64777,64579
dw 64579,64684,64777,64579
dw 64777,64819,64898
dw 64777,64819,64898
dw 64898,64968,64898,64819,64777,64579
dw 64898,64968,64898,64819,64777,64579
dw 64684, 64260,64579
dw 64684, 64260,64579
/****两只老虎音阶对应的节拍****/
time: db 4,4,4,4
db 4,4,4,4
db 4,4,8
db 4,4,8
db 3,1,3,1,4,4,3,1,3,1,4,4
db 4,4,8
db 4,4,8 ,0xff
end