;12C508超声波测距仪程序
; Internal Osc, WDT EnabLED
include <p12c508.inc>
loop equ 10h
dlyCTR equ 11h
tone_cnt equ 12h ; 反射周期计数
period equ 13h ; tmr0溢出时间
org 0
MOVwf OSCCAL
MOVlw b’10001001’
option ;1:2 WDT ON
MOVlw b’00001101’
tris GPIO
MOVwf 0
bcf GPIO,1 ;输出脉冲
;===================================
main clrwdt
btfss GPIO,0 ; 等待触发信号
goto main
m2 clrwdt
btfsc GPIO,0
goto m2
call burst ; 发送超声波
bsf GPIO,1 ; 开始输出定时脉冲
m1 btfsc GPIO,2
goto m1
bcf GPIO,1 ; 结束输出定时脉冲
goto main
;===================================
burst clrf loop
MOVlw 8
MOVwf loop
burst1 MOVlw b’00010000’
MOVwf GPIO
MOVlw 3
MOVwf dlyctr
burst2 decfsz dlyctr,f
goto burst2 ; 12uS
MOVlw b’00010100’
MOVwf GPIO
MOVlw 2 ; (2 * 3inst * 1uS) -1uS = 5uS
MOVwf dlyctr ; 5uS + (8*1uS) = 13uS
burst3 decfsz dlyctr,f
goto burst3
nop
decfsz loop,f
goto burst1
MOVlw 0x00
MOVwf GPIO
retlw 0
;================================
tone clrf TMR0
t1 btfsc GPIO,2
goto t1
MOVfw TMR0
clrf TMR0
MOVwf period
MOVlw 21 ; if(period>22 && period<30)
subwf period,w
btfss STATUS,C
goto t2
MOVlw 30
subwf period,f
btfsc STATUS,C
goto t2
decfsz tone_cnt,f ; 25uS period OK, so
goto t1 ; if not yet 3 of them, keep looking
retlw 0 ; else - success - return
t2 MOVlw 3
MOVwf tone_cnt
goto t1
;=====================================
end
上一篇:pic16c711测温程序