Beep equ P2.2 ;板子上的蜂鳴器是接的P2.2 musich equ 40h ;音樂定時(shí)高位數(shù)據(jù) musicl equ 41h ;音樂定時(shí)低位數(shù)據(jù) musicstart equ 42h ;音樂開始首地址 ; ************************ 預(yù)定義結(jié)束 ******************* org 00h ;程序開始 jmp main ;跳轉(zhuǎn)到主程序 org 1bh ;定時(shí)器T1中斷入口地址 jmp timer1 ;定時(shí)器服務(wù)程序 org 030h ;主程序代碼開始 main:mov sp,#30h ;設(shè)置堆棧 lcall music ;調(diào)用音樂程序 jmp main ;重新開始 musdelay:mov r0,#20 ;短時(shí)間延時(shí) d:djnz r0,d ;延時(shí)時(shí)間 20uS ret ;返回 ; ************ 定時(shí)器 服務(wù)程序 ******************* timer1:clr tr1 ;停止定時(shí)器工作 mov th1,musich ;重新設(shè)置定時(shí)初值 mov tl1,musicl ; cpl beep ;從蜂鳴器輸出聲音 setb tr1 ;開始定時(shí)工作 reti ;中斷返回 ;**************************************************** ;************ 音樂播放程序 ********************* music:mov tmod,#10h ;設(shè)置定時(shí)器T1工作方式1 setb ea ;總的中斷 setb et1 ;定時(shí)器T1中斷允許 mov musicstart,#00h ;音樂開始地址 mov musich,#0ffh ;音樂定時(shí)常數(shù)高位 mov musicl,#0ffh ;音樂定時(shí)常數(shù)低位 loopm:mov dptr,#mu_tab ;得到音符表頭 mov a,musicstart ;開始查表 movc a,@a+dptr ;獲得音樂數(shù)據(jù) jz musend ;結(jié)束符 00H,返回 rl a ;A*2 mov b,a ;暫存地址 mov dptr,#mustab ;獲得音符表頭 movc a,@a+dptr ;根據(jù)音樂數(shù)據(jù)查得定時(shí)常數(shù) mov musich,a ;保存定時(shí)常數(shù)高位 mov th1,a ;設(shè)置定時(shí)器高位常數(shù) mov a,b ;開始找低位數(shù)據(jù) inc a ;指向下一個(gè)數(shù)據(jù) mov dptr,#mustab ;得到音符表頭 movc a,@a+dptr ;查得低位數(shù)據(jù) mov musicl,a ;保存數(shù)據(jù) mov tl1,a ;設(shè)置定時(shí)低位常數(shù) setb tr1 ;定時(shí)器T1開始工作 mov dptr,#mu_tab ;得到音樂表 inc musicstart ;指向下一個(gè)單元(音符節(jié)拍) mov a,musicstart ;開始查找 movc a,@a+dptr ;找到數(shù)據(jù) lcall delay1 ;根據(jù)參數(shù)延時(shí),發(fā)出持續(xù)音樂 inc musicstart ;指向下一個(gè)音 clr tr1 ;停止發(fā)聲 lcall delay jmp loopm ;重復(fù),直到遇到結(jié)束符號 00H. musend:clr tr1 ;樂曲播放完畢,關(guān)閉定時(shí)器 clr ea ;禁止中斷 clr et1 ;關(guān)閉定時(shí)器T1中斷 clr beep ;禁止蜂鳴器 mov a,#20 lcall delay1 ret ;********************* ;************ 節(jié)拍發(fā)生器 ,產(chǎn)生音樂節(jié)拍 ********************************* delay1:mov r0,#00h ;節(jié)拍發(fā)生器,用來發(fā)生節(jié)拍 mov r1,#00h ; mov r2,a ;這是節(jié)拍發(fā)生器的參數(shù),當(dāng)它為8 dlay1:djnz r0,dlay1 ;表示1拍 mov r0,#00h djnz r1,dlay1 mov r0,#00h mov r1,#00h djnz r2,dlay1 ret ; ???????????????????? ; ******** 延時(shí) 產(chǎn)生休止符 ***************** delay:mov r0,#00h ;延時(shí) 10ms mov r1,#100 dlay:djnz r0,dlay mov r0,#100 djnz r1,dlay ret ; ************************ ; ************************曲譜編碼,這是定義的曲譜表,對應(yīng)如下 ************************************************** ; 1 低音 DO 2 低音 RE 3 低音ME 4 低音 FA 5 低音 SO 6 低音LA 7 低音SI mustab: db 'h','j', 0f8h,8bh, 0f9h,5bh, 0fah,14h, 0fah,0ch, 0fbh,03h, 0fbh,8fh, 0fch,0bh ; 8 中音 DO 9 中音 RE 0ah 中音ME 0bh 中音 FA 0ch 中音 SO 0dh 中音LA 0eh 中音SI db 0fch,43h, 0fch,0abh, 0fdh,08h, 0fdh,33h, 0fdh,81h, 0fdh,0c7h, 0feh,05h ; 0fh 高音 DO 10h 高音 RE 11h 高音ME 12h 高音 FA 13h 高音 SO 14h 高音LA 15h 高音SI db 0feh,21h, 0feh,55h, 0feh,84h, 0fdh,99h, 0feh,0c0h, 0feh,0e3h, 0ffh,02h ;以下為音樂樂譜代碼,前兩位表示曲譜,后一位表示節(jié)拍 ;8為 1 拍,4 ->半拍 mu_tab: db 6,4,8,4,10,4,1,4, 9,8,8,4,7,4,10,8,9,8,6,16 db 8,4,10,4,12,4,12,4, 13,8,12,4,11,4,10,16 db 00h end
好東西,都要支持一下。。。。
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |