您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>汇编编程>

蜂鸣器奏乐-多种音乐分享

大小:0.1 MB 人气: 2017-09-06 需要积分:0

1、蜂鸣器奏乐(祝你平安)

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
MOV B,#00H ;表序号清0
MUSIC1:
NOP
CLR A
MOVC A,@A+DPTR ;查表取代码
JZ END0 ;是00H,则结束
CJNE A,#0FFH,MUSIC5
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR ;取节拍代码送R7
MOV R7,A
SETB TR0 ;启动计数
MUSIC2:
NOP
CPL P3.7
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?
;不等,则继续循环
MOV 20H,#00H ;等于,则取下一代码
INC DPTR
; INC B
LJMP MUSIC1
MUSIC3:
NOP
CLR TR0 ;休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#64H ;歌曲结束,延时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 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db 20h,10h,2bh,10h,26h,30h,30h,80h,00H
END
 

2、蜂鸣器奏乐(八月桂花香)

;**********************************************************
   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
   MOV B,#00H           ;表序号清0
MUSIC1:
   NOP
   CLR A
   MOVC A,@A+DPTR       ;查表取代码
   JZ END0              ;是00H,则结束
   CJNE A,#0FFH,MUSIC5
   LJMP MUSIC3
MUSIC5:
   NOP
   MOV R6,A
   INC DPTR
   MOV A,B
   MOVC A,@A+DPTR       ;取节拍代码送R7
   MOV R7,A
   SETB TR0             ;启动计数
MUSIC2:
   NOP
   CPL P3.7
   MOV A,R6
   MOV R3,A
   CPL A
   MOV P1,A             ;显示(修改者加入的显示)
   CPL A
   LCALL DEL
   MOV A,R7
   CJNE A,20H,MUSIC2    ;中断计数器(20H)=R7否?
                        ;不等,则继续循环
   MOV 20H,#00H         ;等于,则取下一代码
   INC DPTR
   LJMP MUSIC1
MUSIC3:
   NOP
   CLR TR0              ;休止100毫秒
   MOV R2,#0DH
MUSIC4:
   NOP
   MOV R3,#0FFH
   LCALL DEL
   DJNZ R2,MUSIC4
   INC DPTR
   LJMP MUSIC1
END0:
   NOP
   MOV R2,#64H          ;歌曲结束,延时1秒后继续
MUSIC6:
   MOV R3,#00H
   LCALL DEL
   DJNZ R2,MUSIC6
   LJMP MUSIC0
DEL:
   NOP
DEL3:
   MOV R4,#05H
DEL4:
   NOP
   DJNZ R4,DEL4
   NOP
   DJNZ R3,DEL3
   RET
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
 

3、蜂鸣器奏乐(生日快乐)

;本程序实现蜂鸣器演奏歌曲功能
;乐曲名称:生日快乐
;///////////////////////////////////////////
 BUZZER EQU P3.7
 org 0000h  ;主程序起始地址
 ajmp main  ;跳至主程序
 org 000bh  ;timer0中断起始地址
 jmp tim0  ;跳至timer0中断子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 org 0030h
main:
 mov tmod,#01h ;设timer0在MODE1
 mov ie,#82h  ;中断使能
start0:
 mov 30h,#00h ;取简谱码指针
next: mov a,30h  ;简谱码指针载入A
 mov dptr,#table ;至table取简谱码
 movc a,@a+dptr
 mov r2,a  ;取到的简谱码暂存于R2
 jz end0  ;是否取到00(结束码)?
 anl a,#0fh  ;不是,则取低4位(节拍码)
 mov r5,a  ;将节拍码存入R5
 mov a,r2  ;将取到的简谱码再载入A
 swap a  ;高低四位交换
 anl a,#0fh  ;取低四位(音符码)
 jnz sing  ;取到的音符码是否为零?
 clr tr0  ;是,则不发音
 jmp d1
sing: dec a  ;取到的音符码减1(不含0).
 mov 22h,a  ;存入(22H).
 rl a  ;乘2
 mov dptr,#table1 ;至table1取相对的高位字节计数值
 movc a,@a+dptr
 mov th0,a  ;取到的高位字节存入TH0
 mov 21h,a  ;取到的高位字节存入(21H)
 mov a,22h  ;再载入取的的音符码
 rl a  ;乘2
 inc a  ;加1
 movc a,@a+dptr ;至table1取相对的低位字节计数值
 mov tl0,a  ;取到的高位字节存入TL0  
 mov 20h,a           ;取到的高位字节存入(20H)
 setb tr0  ;启动timer0
d1: call delay  ;基本单位时间1/4拍187毫秒
 inc 30h  ;取简谱码指针加1
 jmp next  ;取下一个码
end0: clr tr0  ;停止timer0
 jmp start0  ;重复循环
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;time0中断服务子程序用来产生相应的音调脉冲频率。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tim0:
 push acc  ;将A的值暂存于堆栈
 push psw  ;将psw的值暂存于堆栈
 mov tl0,20h  ;重设计数值
 mov th0,21h
 cpl BUZZER  ;将蜂鸣器反相
 pop psw  ;至堆栈取回psw的值
 pop acc  ;至堆栈取回a的值
 reti   ;返回主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay: mov r7,#02h  ;187毫秒
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
 

4、蜂鸣器奏乐

SPK EQU P3.7   ; 蜂鸣器所在端口
 ORG 0000H
 JMP START
 
START:
 MOV R3,#00H
NEXT:
 MOV A,R3
 MOV DPTR,#TABLE
 MOVC A,@A+DPTR
 JZ START
 MOV R7,A
 INC R3
 MOV A,R3
 MOVC A,@A+DPTR
 MOV R2,A
 ACALL SONG
 INC R3
 SJMP NEXT

;=============================================================================== 
;===  歌曲播放子程序 ===
SONG:
 MOV A,R2     ; 取出节拍
 RL A
 JNZ KEEP
 MOV A,#01H
KEEP:
 MOV R2,A
REPEAT:
 ACALL EIGHTH
 DJNZ R2,REPEAT
 RET
 
;=============================================================================== 
;===  产生1/8拍延时子程序  ===  
EIGHTH:
 MOV A,R7     ; 查表取出廷时参数,保存到R4
 MOV DPTR,#DELAY_T
 MOVC A,@A+DPTR
 MOV R4,A
 MOV A,R7     ; 查表取出1/8拍周期数,保存到R5
 MOV DPTR,#S_PARA
 MOVC A,@A+DPTR
 MOV R5,A
NEXTCYC:
 ACALL SOUND
 DJNZ R5,NEXTCYC
 RET
 
;=============================================================================== 
;===  发声子程序 === 
SOUND:
 SETB SPK
 ACALL SDELAY
 CLR SPK
 ACALL SDELAY
 RET
 
;=============================================================================== 
;===  延时子程序  ===
SDELAY:
 MOV A,R4     ; 廷时值在R4内
 MOV R0,A
XL2:
 MOV R1,#03H
DL1:
 NOP
 DJNZ R1,DL1
 DJNZ R0,XL2
 RET
;=============================================================================== 
;===  1/8拍周期表  ===
S_PARA:
 DS 1DH
 DB 15H,16H,00
 DB 19H,00H,1CH,00H,1FH,21H,00H,25H
 DB 00H,29H,2CH,00H,31H,34H,37H,00H
 DB 3EH,41H,00H,49H,00H,52H,57H,00H
 DB 62H
 
;=============================================================================== 
;===  延时参数表  ===
DELAY_T:
 DS 1DH
 DB 7EH,77H,00H
 DB 6AH,00H,5EH,00H,54H,4FH,00H,46H
 DB 00H,3FH,3BH,00H,35H,32H,2FH,00H
 DB 2AH,27H,00H,23H,00H,1FH,1DH,0C0H
 DB 1AH
 
;=============================================================================== 
;===  歌曲表  ===
TABLE:
 DW 2202H,2902H,2902H,2902H,2906H,2702H ;我从山中来
 DW 2502H,2702H,2502H,2402H,2208H  ;带着兰花草
 DW 2E02H,2E02H,2E02H,2E02H,2E06H,2C02H ;种在小园中
 DW 2902H,2C02H,2D02H,2A02H,2908H  ;祈祷花开早
 DW 2902H,2E02H,2E02H,2C02H,2906H,2702H ;一日看三回
 DW 2502H,2702H,2502H,2402H,2206H,1D02H ;看得花时过
 DW 1D02H,2502H,2502H,2402H,2206H,2902H ;兰花却依然
 DW 2702H,2502H,2402H,2002H,2208H  ;苞也无一个
 DW 0000H     ;
 
 END 

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!