單片機(jī)音樂盒DIY―生日快樂歌程序
基于STC89C52單片機(jī)的七彩迷你音樂盒。在單片機(jī)最小系統(tǒng)的基礎(chǔ)上,對(duì)其他兩個(gè)I/O口連接硬件電路。P1.0接一個(gè)七彩快閃LED燈。P1.5口接一個(gè)NPN型三極管的放大電路,再連接一個(gè)無源蜂鳴器(用來播放樂曲)。
本文引用地址:http://www.ex-cimer.com/article/172292.htm這樣一個(gè)迷你音樂盒就完成了。硬件電路非常簡單,其中單片機(jī)任意一個(gè)I/O口都可以作為樂曲的輸出,信號(hào)經(jīng)過NPN三極管放大驅(qū)動(dòng)蜂鳴器發(fā)出電子樂曲。
緊接著就是為單片機(jī)設(shè)計(jì)運(yùn)行的程序了,這里我用匯編寫了一段《生日快樂》的程序。大家可以仿照,我的思路修改樂曲。
DIY手記:用C52這么大塊頭的單片機(jī),確實(shí)很浪費(fèi)。因?yàn)橐还灿?2個(gè)I/O引腳,設(shè)計(jì)音樂盒只用了其中的兩個(gè),非常的浪費(fèi)。大家可以用其他的單片機(jī)代替,例如16引腳的單片機(jī)。價(jià)格相對(duì)會(huì)便宜一點(diǎn)。
單片機(jī)匯編源代碼分享:
org 0000h
ajmp main
org 000bh
jmp tim0
org 0030h
main: ;主程序
setb p1.1
clr p1.4
setb p3.0
mov tmod,#01h ;設(shè)定時(shí)方式
mov ie,#82h ;開中斷
start0:
mov 30h,#00h ;
next:mov a,30h
mov dptr,#table
movc a,@a+dptr ;查表取音調(diào)和節(jié)拍
mov r2,a
jz end0 ;為零,不進(jìn)行處理.
anl a,#0fh
mov r5,a ;將節(jié)拍存入R5
mov a,r2
swap a
anl a,#0fh
jnz sing ;根據(jù)音調(diào)決定是否演奏.
clr tr0
jmp d1
sing:dec a
mov 22h,a ;將音調(diào)存入22H.
rl a
mov dptr,#table1
movc a,@a+dptr ;根據(jù)音調(diào)決定定時(shí)器初值.
mov th0,a ;放入TH0
mov 21h,a
mov a,22h
rl a
inc a
movc a,@a+dptr
mov tl0,a ;放入TL0
mov 20h,a
setb tr0 ;啟動(dòng)定時(shí)
d1: call delay
inc 30h
jmp next
end0:clr tr0
jmp start0
tim0: ;定時(shí)器中斷服務(wù)程序
push acc
push psw
mov tl0,20h ;重賦初值.
mov th0,21h
cpl p1.7
pop psw
pop acc
retidelay:mov r7,#02h ;延時(shí)子程序
d2: mov r4,#130
d3: mov r3,#248
djnz r3,$
djnz r4,d3
djnz r7,d2
djnz r5,delay
ret
table1: ;決定音調(diào)的定時(shí)初值.
dw 64260,64400,64524,64580
dw 64684,64777,64820,64898
dw 64968,65030,65058,65110
dw 65157,65178,65217
table: ;決定音調(diào)和節(jié)拍的表格,不同的歌曲只是此表不同
;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
DIY機(jī)械鍵盤相關(guān)社區(qū):機(jī)械鍵盤DIY
蜂鳴器相關(guān)文章:蜂鳴器原理
評(píng)論