兰花草c语言编码蜂鸣器,蜂鸣器奏乐-多种音乐分享

本文档展示了三个使用嵌入式系统通过蜂鸣器播放音乐的程序实例,涉及不同歌曲如《祝你平安》、《八月桂花香》和《生日快乐》。每个程序使用汇编语言编写,通过定时器中断实现音乐节奏的控制,并包含音乐的简谱数据。程序通过调整定时器计数值来改变音调,通过中断计数器控制节拍,实现了不同音符的播放和休止。
摘要由CSDN通过智能技术生成

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

大小: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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值