这么巧,我前几个星期刚做过。我这里就有程序,在实验板上调试出来的,实物我没有做过。不过接法也应该很简单,就是P3随便找个口接蜂鸣器,如果功率不够再接个上拉。
ORG 0000H
JMP MAIN
ORG 000BH ;跳转定时器0,定时器0控制节拍
JMP SETJPJS ;跳转节拍计数中断,
ORG 001BH ;跳转定时器1,定时器1控制频率
JMP SETPLZF ;跳转到频率计数中断,在该中断中对喇叭高低电平至反
ORG 0080H
MAIN:
MOV TMOD , #00010001B
JMP RESETJS
LOOP:
MOV P3 , R7
JMP LOOP
RET
RESETJS:
;对定时器赋初值
MOV R1 , #00H
MOV R2 , #00H
MOV R3 , #00H
MOV R4 , #00H
MOV DPTR , #TAB1
MOV A , R1
MOVC A , @a + DPTR
MOV TH0 , A ;对TH0赋初值
MOV DPTR , #TAB2
MOV A , R1
MOVC A , @A + DPTR
MOV TL0 , A ;对TL0赋初值
INC R1
MOV DPTR , #TAB3
MOV A , R2
MOVC A , @A + DPTR
MOV R3 , A
INC R2 ;对R3赋初值,决定节拍的长度
MOV DPTR , #TAB4
MOV A , R4
MOVC A , @A + DPTR
MOV TH1 , A
MOV 20H , A ;对TH1赋初值
MOV DPTR , #TAB5
MOV A , R4
MOVC A , @A + DPTR
MOV TL1 , A
MOV 21H , A ;对TL1赋初值
INC R4
MOV IE , #10001010B
SETB TR0
SETB TR1
JMP LOOP
RESETJS1:
;对定时器赋初值
MOV R1 , #00H
MOV R2 , #00H
MOV R3 , #00H
MOV R4 , #00H
MOV DPTR , #TAB1
MOV A , R1
MOVC A , @A + DPTR
MOV TH0 , A ;对TH0赋初值
MOV DPTR , #TAB2
MOV A , R1
MOVC A , @A + DPTR
MOV TL0 , A ;对TL0赋初值
INC R1
MOV DPTR , #TAB3
MOV A , R2
MOVC A , @A + DPTR
MOV R3 , A
INC R2 ;对R3赋初值,决定节拍的长度
MOV DPTR , #TAB4
MOV A , R4
MOVC A , @A + DPTR
MOV TH1 , A
MOV 20H , A ;对TH1赋初值
MOV DPTR , #TAB5
MOV A , R4
MOVC A , @A + DPTR
MOV TL1 , A
MOV 21H , A ;对TL1赋初值
INC R4
RETI
SETPLZF:
MOV A , R7
CPL A
MOV R7 , A
MOV TH1 , 20H
MOV TL1 , 21H
;CPL P1.1
RETI
SETJPJS:
DJNZ R3 , SETLOOP
MOV DPTR , #TAB3
MOV A , R2
MOVC A , @A + DPTR
MOV R3 , A ;对R3赋初值,决定节拍的长度
MOV DPTR , #TAB1
MOV A , R1
MOVC A , @A + DPTR
MOV R6 , A
CJNE A , #00H , SETJS
MOV DPTR , #TAB2
MOV A , R1
MOVC A , @A + DPTR
CJNE A , #00H , SETJS
;如果节拍记录到0000H则要重头开始
JMP RESETJS1
RETI
SETJS:
MOV TH0 , R6 ;对TH0赋初值
MOV DPTR , #TAB2
MOV A , R1
MOVC A , @A + DPTR
MOV TL0 , A
INC R1 ;对TL0赋初值
MOV DPTR , #TAB3
MOV A , R2
MOVC A , @A + DPTR
MOV R3 , A
INC R2 ;对R3赋初值,决定节拍的长度
MOV DPTR , #TAB4
MOV A , R4
MOVC A , @A + DPTR
MOV TH1 , A
MOV 20H , A ;对TH1赋初值
MOV DPTR , #TAB5
MOV A , R4
MOVC A , @A + DPTR
MOV TL1 , A
MOV 21H , A
INC R4 ;对TL1赋初值
RETI
SETLOOP:
MOV DPTR , #TAB1
MOV A , R1
MOVC A , @A + DPTR
MOV TH0 , A ;对TH0赋初值
MOV DPTR , #TAB2
MOV A , R2
MOVC A , @A + DPTR
MOV TL0 , A ;对TL0赋初值
;MOV DPTR , #TAB3
;MOV A , R2
;MOVC A , @A + DPTR
;MOV R3 , A
;INC R2 ;对R3赋初值,决定节拍的长度
RETI
;祝你生日快乐歌
TAB1: DB 03CH , 03CH , 03CH , 03CH , 03CH , 03CH , 03CH ;TH0
DB 03CH , 03CH , 03CH , 03CH , 03CH , 03CH , 03CH
DB 03CH , 03CH , 03CH , 03CH , 03CH , 03CH , 03CH
DB 03CH , 03CH , 03CH , 03CH
DB 000H
TAB2: DB 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H ;TL0
DB 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H
DB 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H
DB 0B0H , 0B0H , 0B0H , 0B0H
DB 000H
TAB3: DB 02H , 02H , 04H , 04H , 04H , 08H , 02H
DB 02H , 04H , 04H , 04H , 08H , 02H , 02H
DB 04H , 04H , 04H , 04H , 04H , 02H , 02H
DB 04H , 04H , 04H , 08H
DB 000H
TAB4: DB 0FBH , 0FBH , 0FBH , 0FBH , 0FCH , 0FCH , 0FBH
DB 0FBH , 0FBH , 0FBH , 0FCH , 0FCH , 0FBH , 0FBH
DB 0FDH , 0FDH , 0FCH , 0FCH , 0FBH , 0FDH , 0FDH
DB 0FDH , 0FCH , 0FCH , 0FCH
TAB5: DB 004H , 004H , 090H , 004H , 044H , 00CH , 004H
DB 004H , 090H , 004H , 0ACH , 044H , 004H , 004H
DB 082H , 009H , 044H , 00CH , 090H , 084H , 084H
DB 009H , 044H , 0ACH , 044H
;1-7 , 1-7 , 1-7
;TAB1: DB 03CH , 03CH , 03CH , 03CH , 03CH , 03CH , 03CH ;TH0
; DB 03CH , 03CH , 03CH , 03CH , 03CH , 03CH , 03CH
; DB 03CH , 03CH , 03CH , 03CH , 03CH , 03CH , 03CH
; DB 000H
;TAB2: DB 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H ;TL0
; DB 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H
; DB 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H , 0B0H
; DB 000H
;TAB3: DB 014H , 014H , 014H , 014H , 014H , 014H , 014H ;TH0
; DB 014H , 014H , 014H , 014H , 014H , 014H , 014H
; DB 014H , 014H , 014H , 014H , 014H , 014H , 014H
; DB 000H
;TAB4: DB 0F8H , 0F9H , 0FAH , 0FAH , 0FBH , 0FBH , 0FCH ;TH1
; DB 0FCH , 0FCH , 0FDH , 0FDH , 0FDH , 0FDH , 0FEH
; DB 0FEH , 0FEH , 0FEH , 0FEH , 0FEH , 0FEH , 0FFH
; DB 000H
;TAB5: DB 08CH , 05CH , 015H , 067H , 004H , 090H , 00CH ;TL1
; DB 044H , 0ACH , 009H , 084H , 082H , 0C8H , 006H
; DB 021H , 056H , 085H , 09AH , 0C1H , 0E4H , 003H
; DB 000H
END |