中級會員
Joined
: 2004/10/19 11:53 最後登入時間
: 2006/7/5 15:13
Group:
註冊會員
Level : 5 HP : 0 / 122 MP : 16 / 7053 EXP : 90
|
大家好 這是我用中斷寫的蜂鳴器程式 我希望響聲一秒後停止 但是我試過了 蜂鳴器還是持續叫著 請各位高手 給予校正 謝謝 以下是我的程式碼 list p=16F873a #include <p16f873a.inc> ; Include file locate at defult directory
w_temp equ 0x20 ;定義暫存器位址w_temp,STATUS_temp, STATUS_temp equ 0x21 scaler equ 0x22 ;定義暫存器scaler,blankcnt位址 blankcnt equ 0x23 maxcount equ .10 ;定義maxcount為數值50 SOUNDDELAY1 equ 0x33
;******************************************** ;********************************************* org 0x00 ;初始位置為0x00 goto Main nop ;利用ICD偵錯時,程式第一個位址需填入nop org 0x04 ;中斷位置 goto IntServ IntServ movwf w_temp ;將w暫存器內容儲存 swapf STATUS_temp,w ;將STATUS暫存器高低byte內容交換 movwf STATUS_temp ;交換後,存至STATUS_temp中 btfsc PIR1,TMR1IF ;判斷Timer1是否中斷 call Timer1 ;當Timer1有溢位中斷產生,呼叫中斷服務程式 swapf STATUS_temp,w ;將中斷前STATUS內容重新載入 movwf STATUS swapf w_temp,f ;將中斷前w內容重新載入 swapf w_temp,w Timer1 banksel PIR1 ;選擇PIR1放置的Bank bcf PIR1,TMR1IF ;將Timer1的致能旗標清除 clrf TMR1L ;把Timer1L清為零,防止進位 movlw 0xf8 ; movwf TMR1H ;Timer1H載入f8h movlw 0x2f ;Timer1L載入2fh movwf TMR1L ;所以Timer1會從f82fh計數到溢位中斷產生,剛好為2000(2ms) banksel maxcount movlw maxcount movwf blankcnt return banksel PORTC ;定義PORTC,清除PORTC CLRF PORTC BSF STATUS,RP0 ; MOVLW b'00000000' ;定義TRISC為輸出模式 MOVWF TRISC BCF STATUS,RP0 SOUND MOVLW 222 ;1/222,450HZ BSF PORTC,2 ;將蜂鳴器打開 CALL SOUNDDELAY0 ;呼叫延遲 BCF PORTC,2 ;關閉延遲 MOVLW 222 ;反覆鳴叫 CALL SOUNDDELAY0 GOTO SOUND ;---------------------Main------------------------------------------------------------- Main call initial bcf PORTC,2
;---------------------sounddelay--------------------------------------------------- SOUNDDELAY0 MOVWF SOUNDDELAY1 ;將222放入暫存器 SOUNDDELAYUS_1 ;每一個指令為1us,所以延遲為222*5us+1=1111us,為900Hz NOP NOP DECFSZ SOUNDDELAY1 GOTO SOUNDDELAYUS_1 retfie
;------------------------------------------------------------------------------------- initial banksel maxcount movlw maxcount movwf blankcnt ;將常數值maxcount載入blankcnt暫存器 movlw b'00000000' movwf PORTC ;將PORTB的LED清除 ;movlw 0x04 ;初始值4,scaler ;movwf scaler banksel TRISC clrf TRISC ;定義PORTB為輸出阜 banksel T1CON clrf T1CON ;設定Timer1時脈為Fosc/4 clrf TMR1H ;將Timer1內容清為零 clrf TMR1L clrf INTCON ;將INTCON內容清為零 bsf INTCON,PEIE ;將周邊功能的中斷致能 banksel PIE1 clrf PIE1 ;將PIE1內容清為零 bsf PIE1,TMR1IE ;將Timer1溢位中斷致能 banksel PIR1 clrf PIR1 banksel TMR1L clrf TMR1L movlw 0xf8 movwf TMR1H movlw 0x2f movwf TMR1L bsf T1CON,TMR1ON ;讓Timer1開始計數 banksel INTCON bsf INTCON,GIE ;將中斷總開關打開,使中斷可以產生 return
;----------------Blink-------------------------------------------------------------------------- ;Blink ; decfsz blankcnt,f ;blankcnt減1 ; goto blinkend ;若blankcnt不為零,跳離Blink副程式 ; bcf PORTC,2 ;blinkend ; return
;------------------------------------------------------- end
發表於: 2005/7/25 13:51
|