蜂鸣器奏乐-多种音乐分享
大小:0.1 MB 人气: 2017-09-06 需要积分:0
1、蜂鸣器奏乐(祝你平安)
ORG 0000HLJMP 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%
下载地址
蜂鸣器奏乐-多种音乐分享下载
相关电子资料下载
- 基于启明RA6M5的物联网居家环境健康监控设备设计 57
- 基于51单片机温度监控Proteus仿真设计_报警值可调 226
- 51单片机数字温度报警器_DS18B20可调上下限 252
- 火遍童年的FC游戏是使用什么语言编写的 330
- 51单片机停车场车位管理系统仿真设计 488
- 分析五种蜂鸣器驱动电路 130
- 汇编语言中常见的两个指令 167
- 相序表使用注意事项 100
- 求一种基于RJM8L151S的智能提醒药盒解决方案 279
- 汇编语言的产生 汇编语言的组成 233