200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 单片机音乐盒c语言源程序 51单片机八音盒源程序(汇编语言)

单片机音乐盒c语言源程序 51单片机八音盒源程序(汇编语言)

时间:2019-01-05 09:06:09

相关推荐

单片机音乐盒c语言源程序 51单片机八音盒源程序(汇编语言)

;//*****************************************************

;文件名:八音盒.asm

;描述:八音盒,P1选择音乐,低电平有效,P3.0音乐输出口。

; 本程序使用的寄存器有R1至R7,40H,41H,42H单元。

; 标号TAB1处为T0的定时常数数据表。

;//*****************************************************

Speaker BIT P3.4

FLAG1 BIT 20H

FLAG2 BIT 21H

ORG 0000H

LJMP Start

ORG 0003H

LJMP EXINT0

ORG 000BH

LJMP INT_T0

ORG 0013H

LJMP EXINT1

ORG 001BH

DJNZ R4,GOON;中断次数不够,继续。

CLR ET1 ;持续时间到,该音符停止。

CLR ET0

SJMP RE01

GOON: MOV TL1,40H

MOV TH1,41H

RE01: RETI

INT_T0: MOV C,FLAG1

JC TORET

DJNZ R0,TORET

MOV R0,#6

MOV C,FLAG2

JC TOADD

SJMP TOSUB

TOADD:MOV A,R3

CJNE A,#0FEH,ADD1

CLR FLAG2

SJMP TORET

ADD1:MOV A,R2

ADD A,#1

MOV R2,A

MOV A,R3

ADDC A,#0

MOV R3,A

SJMP TORET

TOSUB:MOV A,R3

CJNE A,#0FBH,SUB1

SETB FLAG2

SJMP TORET

SUB1:MOV A,R2

SUBB A,#1

MOV R2,A

MOV A,R3

SUBB A,#0

MOV R3,A

TORET: MOV TL0,R2

MOV TH0,R3

CPL Speaker ;音乐输出口.

RETI

ORG 0080H

EXINT0:

CLR ET0

CLR ET1

CLR A

PUSH ACC

PUSH ACC

RETI

EXINT1:

CLR ET0

CLR ET1

CLR A

PUSH ACC

PUSH ACC

RETI

Start:

mov TCON, #05h ; 外部中断0下降沿触发

SETB EX0; 打开外部中断允许位(EX0)及总中断允许位(EA)

SETB EX1

SETB EA

MOV A,P1

JNB ACC.0,Voice0

JNB ACC.1,Voice1

JNB ACC.2,Voice2

JNB ACC.3,Voice3

JNB ACC.4,Voice4

JNB ACC.5,Voice5

JNB ACC.6,Voice6

JNB ACC.7,Voice7

Sjmp Start

Voice0: MOV DPTR,#tab_0 ;乐曲数据表的表头

Sjmp Main

Voice1: MOV DPTR,#tab_1 ;乐曲数据表的表头

Sjmp Main

Voice2: MOV DPTR,#tab_2 ;乐曲数据表的表头

Sjmp Main

Voice3: MOV DPTR,#tab_3 ;乐曲数据表的表头

Sjmp Main

Voice4: LJMP Main2

;MOV DPTR,#tab_4 ;乐曲数据表的表头

;Sjmp Main

Voice5: MOV DPTR,#tab_5 ;乐曲数据表的表头

Sjmp Main

Voice6: MOV DPTR,#tab_6 ;乐曲数据表的表头

Sjmp Main

Voice7: MOV DPTR,#tab_7 ;乐曲数据表的表头

Main: MOV TMOD,#11H

MOV IP,#02H

MOV 41H,#4CH ;T1初值放在41H,40H单元

MOV 40H,#0B0H ;值越大,演奏越快

SETB EA

SETB FLAG1

CLR A

MOV R1,A ;R1作为音符指针

L1: MOVC A,@A+DPTR

INC R1 ;指向音符的拍数字节

MOV R6,A ;音级字节暂存入R6

JZ L3

ACALL TONE

MOV TH0,R3

MOV TL0,R2

SETB TR0

SETB ET0

MOV A,R1

MOVC A,@A+DPTR

INC R1

CJNE R1,#00H,L2

MOV DPTR,#0400H ;表指针溢出,更改表头

L2: ACALL LONG ;

MOV A,R1

AJMP L1 ;

L3: MOV A,R1

MOVC A,@A+DPTR

MOV R7,A

INC R1

CJNE R1,#00H,L4

MOV DPTR,#0400H

L4: ACALL LONG ;

MOV A,R1

CJNE R7,#0FH,L1

LJMP Main ;重复播放

ORG 0200H

TONE: MOV A,R6 ;取出音级字节

RL A ;乘2,定时常数为双字节

MOV 42H,A ;暂存入42H单元

ADD A,#05H ;距离数表有7个字节,使查表正确

MOVC A,@A+PC;取出TH0

MOV R3,A

MOV A,42H

INC A

MOVC A,@A+PC;取出TL0

MOV R2,A ;

RET

TAB1: DB 0F8H,8EH,0F8H,0F9H,0F9H,5EH

DB 0F9H,0BEH,0FAH,18H,0FAH,6DH

DB 0FAH,0BEH,0FBH,09H,0FBH,51H

DB 0FBH,95H,0FBH,0D4H,0FCH,11H

DB 0FCH,49H,0FCH,7FH,0FCH,0B2H

DB 0FCH,0E1H,0FDH,0FH,0FDH,39H

DB 0FDH,61H,0FDH,87H,0FDH,0ABH

DB 0FDH,0CDH,0FDH,0EDH,0FEH,0BH

DB 0FEH,27H,0FEH,42H,0FEH,5BH

DB 0FEH,73H,0FEH,8AH,0FEH,9FH

DB 0FEH,0B3H,0FEH,0C6H,0FEH,0D8H

DB 0FEH,0E9H,0FEH,0F9H,0FFH,08H

DB 0FFH,16H,0FFH,24H,0FFH,30H

DB 0FFH,3CH,0FFH,47H,0FFH,52H

DB 0FFH,5CH,0FFH,66H,0FFH,6FH

DB 0FFH,77H,0FFH,7FH,0FFH,86H

ORG 0300H ;音长子程序

LONG: ADD A,#0FH ;使查表正确

MOVC A,@A+PC;取出定时器T1应中断的次数

MOV R4,A ;T1应中断的次数存入R4中

MOV TH1,41H

MOV TL1,40H

SETB TR1

SETB ET1

CJNE R4,#00H,$

RET

;音长子程序结束

TAB2: DB 01,02,04,06 ;应中断的次数

DB 08,10,12,14

DB 16,20,24,28

DB 32,40,48,64

Main2:CLR FLAG1

MOV TMOD,#01H

MOV R3,#0FCH ; T1初值放在41H,40H单元

MOV R2,#000H ;值越大,演奏越快

MOV TL0,R2

MOV TH0,R3

SETB FLAG2

SETB ET0

SETB EA

SETB TR0

MOV R0,#6

sjmp $

TAB_0: ;《友谊天长地久》

DB 00H,04H,00H,04H,08H,04H,0DH,08H,0DH,04H

DB 0DH,08H,11H,04H,0FH,08H,0DH,04H

DB 0FH,08H,11H,02H,0FH,02H,0DH,08H,0DH,04H

DB 11H,08H,14H,04H,16H,0DH,16H,04H

TAB_4: ;《千里之外》

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。