因?yàn)樵诳磿臅r(shí)候,看到了這樣一句話【單片機(jī)的案件處理子程序應(yīng)該盡可能少占用CPU的運(yùn)行時(shí)間,并且盡可能將鍵盤掃描安排在程序空余的時(shí)間,以滿足實(shí)時(shí)準(zhǔn)確響應(yīng)按鍵請(qǐng)求的目的】
大家怎么看?
因?yàn)樵诳磿臅r(shí)候,看到了這樣一句話【單片機(jī)的案件處理子程序應(yīng)該盡可能少占用CPU的運(yùn)行時(shí)間,并且盡可能將鍵盤掃描安排在程序空余的時(shí)間,以滿足實(shí)時(shí)準(zhǔn)確響應(yīng)按鍵請(qǐng)求的目的】
大家怎么看?
我是用中斷實(shí)行音樂播放。設(shè)備是51單片機(jī)。
這里,我將秒表和音樂播放放在一起。運(yùn)行的時(shí)候發(fā)現(xiàn)有很刺耳的聲音(不是音樂),同時(shí)數(shù)碼管不顯示時(shí)鐘,嗯鍵盤也完全沒有作用。
Break2:
PUSH PSW
PUSH ACC ;保護(hù)現(xiàn)場(chǎng)
MOVTL1,#000H;賦計(jì)數(shù)初值,每10ms中斷一次
MOVTH1,#0DCH
DJNZ 61H,back1 ;10毫秒未到,返回 ,61的初值為#01H
JBCounState,COUNT
JBAlarmRing1,MUSIC1
LJMP return1
COUNT:
MOV 61H,#01H ;61H存放中斷次數(shù)
MOV A,#01H
ADD A,35H
MOV 35H,A
JBAlarmRing1,MUSIC1
CJNE A,#64H,back1 ;是否到達(dá)100個(gè)10毫秒,沒有則返回
MOV 35H,#00H ;毫秒位清零
MOV A,#01H
ADD A,36H ;秒位加1
MOV 36H,A
CJNE A,#3CH,back1 ;60秒到了沒有
MOV 36H,#00H ;秒位清零
MOV A,#01H
ADD A,37H ;小時(shí)位加1
MOV 37H,A
back1: LJMP return1 ;返回
return1:
POP ACC
POP PSW ;恢復(fù)現(xiàn)場(chǎng)
RETI ;中斷返回
//delay1:
//push 07h ;2毫秒延遲
//push 06h
//MOV R7,#1EH
//DE1: MOV R6,#1FH
//D21: DJNZ R6,$
//DJNZ R7,DE1
//pop 06H
//pop 07H
//RET
;============================================================================================
MUSIC1:
NOP
MOV DPTR,#MDAT ;表頭地址送DPTR
INC62H
MOV B,#00H ;表序號(hào)清0
MUSIC1_1:
NOP
CLR A
MOVCA,@A+DPTR ;查表取代碼
JZ END1_0 ;是00H,則結(jié)束
CJNEA,#0FFH,MUSIC1_5
LJMP MUSIC1_3
MUSIC1_5:
NOP
MOV 63H,A ;取音符代碼送63H
INCDPTR
MOV A,B
MOVC A,@A+DPTR ;取節(jié)拍代碼送64H
MOV 64H,A
MUSIC1_2:
NOP
CPL P1.6
MOV A,63H
MOV R3,A
LCALL MDEL1_0 ;最大一次是2毫秒
AJMPMUMIAO
MUSIC1_3:
NOP
//CLR TR0 ;休止100毫秒
SETBP1.6
INC DPTR
//MOVA,#7DH ;休止500毫秒
MOV A,B
MOVC A,@A+DPTR ;取節(jié)拍代碼送64H
MOV 64H,A
MUMIAO:
MOVA,35H
CJNE A,#64H,MUSIC1_2_0 ;是否到達(dá)100個(gè)10毫秒,沒有則MUSIC1_2_0
MOV 35H,#00H ;毫秒位清零
MOV A,#01H
ADD A,36H ;秒位加1
MOV 36H,A
CJNE A,#3CH,MUSIC1_2_0 ;60秒到了沒有
MOV 36H,#00H ;秒位清零
MOV A,#01H
ADD A,37H ;小時(shí)位加1
MOV 37H,A
MUSIC1_2_0:
MOV A,64H
CJNE A,62H,MUSIC1_2 ;中斷計(jì)數(shù)器(20H)=R7否?;不等,則繼續(xù)循環(huán)
//LJMP MUSIC1_4
//MOV R3,A
//LCALL MDEL1_0
MUSIC1_4:
MOV 62H,#00H ;等于,則取下一代碼
MOV 63H,#00H ;存入音樂音符 清零
MOV 64H,#00H ;存入音樂節(jié)拍 清零
INC DPTR
LJMP MUSIC1_1
END1_0:
NOP
SETBP1.6
CLRAlarmRing1
AJMPreturn2
MDEL1_0:
MOV R4,#02H ;延遲(2+13*R3)*1.09=
NOP
DJNZ R4,$
NOP
DJNZ R3,MDEL1_0
RET
NOP
return2:
POP ACC
POP PSW ;恢復(fù)現(xiàn)場(chǎng)
RETI ;中斷返回
MDAT:
DB2DH,30H,2DH,10H,28H,40H,2DH,40H,22H,40H,24H,80H
DB2DH,30H,2DH,10H,28H,40H,2DH,40H,1EH,40H,22H,80H
DB2DH,30H,2DH,10H,16H,40H,1BH,40H,22H,40H,24H,40H,28H,40H,0FFH,10H
DB19H,30H,19H,10H,1BH,40H,22H,40H,1EH,40H,22H,80H
DB00H