?? 程序.txt
字號:
リスト1 超音波距離計プログラムリスト
;********************************************************************
; 超音波距離計 Version 3
; このプログラムでは超音波により1cm単位での距離測定ができる。
; 測定距離は10cmから9.99mまで
;********************************************************************
LIST P=16F873
#INCLUDE "P16F873.INC"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF
;******************************
; 変數レジスタ割付定義
;******************************
DPDT EQU 2CH ;LCD output data
DISLOW EQU 2DH ;距離カウンタ下位
DISHIGH EQU 2EH ;距離カウンタ上位
CNT1 EQU 2FH ;タイマ用カウンタ
CNT2 EQU 20H
CNT3 EQU 31H
CNT4 EQU 32H
CNT5 EQU 33H
WORK1 EQU 34H ;work
TEMP EQU 35H ;tempolary work
ZFLG EQU 36H ;zero supress flag
TRCNT EQU 37H ;Transimit counter
TRINTVL EQU 38H ;Transmit interval
BINL EQU 39H ;binary couter low
BINH EQU 3AH ;Binary counter upper
TITLCNT EQU 3BH ;Title Massage Table count
OUTDATA EQU 3CH ;OUTPUT DATA
VR_FRQ EQU 3DH ;Variable Frequency
VRLP_CNT EQU 3EH ;Variable Freq Loop Counter
VRLP_CNT2 EQU 3FH
REC_INTS EQU 40H ;Recieve Intensity
55
TABLE_CNT EQU 41H ;Table Counter
VR_DISP_CNT EQU 42H ;V.R.Display Counter
ORG 0H
GOTO MAIN
ORG 20H
;********************************
; メインプログラム
;********************************
;*** 初期化 ****
MAIN
CALL PORT_INI ;Port A,B initialize
BSF PORTC,2 ;Stop transmitter
CLRF PORTB ;all clear
CALL LCD_INI ;Reset LCD
CALL COMP_INI
;**** 測定メインループ *****
MAINLP
CALL V_FREQ ;送信周波數決定
CALL MESURE ;距離計測
CALL R_INTENS ;受信強度測定
BTFSC BINH,2 ;無応答チェック
GOTO NOANS ;無応答処理へ
CALL CONV ;バイナリからBCD に変換
; CALL LCD_CLR ;表示クリア
; CALL TITLEDSP ;タイトル表示
CALL TIM1S ;1秒待ち
CALL CM_DISP ;距離データ表示
CALL INTS_DISP ;強度表示
RET_NOANS CALL TRFRQ_DISP ;送信周波數表示
GOTO MAINLP
;**** 無応答処理 NoAns の表示 ***
NOANS
MOVLW 0x80
CALL LCD_CMD
MOVLW ' '
56
CALL LCD_DATA
MOVLW ' '
CALL LCD_DATA
MOVLW ' '
CALL LCD_DATA
MOVLW 'N' ;NoAns 表示
CALL LCD_DATA
MOVLW 'o'
CALL LCD_DATA
MOVLW 'A'
CALL LCD_DATA
MOVLW 'n'
CALL LCD_DATA
MOVLW 's'
CALL LCD_DATA
MOVLW ' '
CALL LCD_DATA
MOVLW ' '
CALL LCD_DATA
MOVLW ' '
CALL LCD_DATA
MOVLW ' '
CALL LCD_DATA
MOVLW ' '
CALL LCD_DATA
MOVLW ' '
CALL LCD_DATA
MOVLW ' '
CALL LCD_DATA
MOVLW ' '
CALL LCD_DATA
CALL TIM1S ;1秒待ち
GOTO RET_NOANS
; RETURN
;*******************************************
; 受信強度測定ルーチン
57
; A/D変換上位3BIT の8段階
;*******************************************
R_INTENS
MOVLW 0x81 ;CH2
MOVWF ADCON0
CALL TIME10
CALL TIME10
BSF ADCON0,GO
RINTS_LOOP BTFSC ADCON0,GO
GOTO RINTS_LOOP
MOVF ADRESH,W ;BIT反転
ANDLW 0xE0 ;上位3BIT ホールド
MOVWF REC_INTS ;変換結果REC_INTS に代入
SWAPF REC_INTS,F
BCF STATUS,C
RRF REC_INTS,F ;0-7の値に変換
RETURN
;*******************************************
; 1cm計測サブルーチン
; 音速 =340m/s
; 1000000usec/34000cm=29.412usec/cm
; 29.412*2(send+receive)/(0.4usec/step)
; =147steps/cm
;*******************************************
MESURE
MOVLW 014H ;20cm のオフセット
MOVWF BINL
CLRF BINH ;上位クリア
CALL TRANS ;599μsec 送信出力
CALL WAIT ;599μsec待ち
;**** 1cm間隔で測定 全體で147step ***
MESLP1
CALL CM ;1cm delay 134+2step
;*** ここ以下で11step ***
58
BTFSS PORTC,1 ;Input test(元はBTFSC)
RETURN ;応答検出戻り
BCF STATUS,C ;キャリーリセット
MOVLW 1 ;+1
ADDWF BINL,F ;バイナリカウンタアップ
RLF BINL,W ;キャリー取り出し
ANDLW 01H
ADDWF BINH,F ;BINH+キャリー
BTFSS BINH,2 ;1024 オーバーか?
GOTO MESLP1 ;繰り返し
RETURN ;1024オーバー戻り
;*** 1cm delay ****
CM
MOVLW 2DH ;counter=44
MOVWF CNT1 ;save
CMLOOP
DECFSZ CNT1,F
GOTO CMLOOP ;3*44-1=131
RETURN ;131+3=134
;**** 10cm 待ち=147*10=1470 *****
WAIT
MOVLW 0AH ;10 times
MOVWF CNT2
WAITLP
CALL CM ;1cm delay 137
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ CNT2,F ;end test
GOTO WAITLP ;(137+9)*10-1=1459
RETURN ;total=1462
59
;*******************************************
; 可変周波數入力ルーチン
; 40kHz を中心に±4 段階の計8 段階で設定
;*******************************************
V_FREQ
MOVLW 0x89 ;CH1
MOVWF ADCON0
CALL TIME10
CALL TIME10
BSF ADCON0,GO
VFRQ_LOOP BTFSC ADCON0,GO
GOTO VFRQ_LOOP
COMF ADRESH,W ;BIT反転
ANDLW 0xE0 ;上位3BIT ホールド
MOVWF VR_FRQ ;変換結果VR_FRQ に代入
SWAPF VR_FRQ,F
BCF STATUS,C
RRF VR_FRQ,F ;0-7の値に変換
INCF VR_FRQ,F ;値1-8
RETURN
;**************************************
; 超音波送信出力制御サブルーチン
; 送信周波數 29,31,34,37,40,45,50,57(kHz)
; 599μsec の間送信
;**************************************
TRANS
CLRF TMR1H
CLRF TMR1L ;TMR1クリア
BCF PIR1,CCP1IF ;CCP1割り込みフラグクリア
TR_START BSF PORTC,2 ;HIGH出力
MOVLW 0x05
MOVWF VRLP_CNT ;6回ループ
60
MOVF VR_FRQ,W
MOVWF VRLP_CNT2
NOP
NOP
TRLP0 DECFSZ VRLP_CNT,F
GOTO TRLP0 ;6+3*5-1=20CYC
TRLP1 DECFSZ VRLP_CNT2,F ;0ならTRLP1 へ
GOTO TRLP1 ;20+(VR_FRQ)*3-1=22~43CYC
BCF PORTC,2 ;LOW出力
MOVLW 0x05
MOVWF VRLP_CNT ;6回ループ
MOVF VR_FRQ,W
MOVWF VRLP_CNT2
NOP
NOP
TRLP2 DECFSZ VRLP_CNT,F
GOTO TRLP2 ;3*7-1=20CYC
TRLP3 DECFSZ VRLP_CNT2,F ;0ならTRLP1 へ
GOTO TRLP3 ;20+(VR_FRQ)*3-1=22~43CYC
;ここで1 周期
BTFSS PIR1,CCP1IF ;割り込みフラグが立っていれば
GOTO TR_START
RETURN
;*************************************
; バイナリからBCD への変換
; バイナリ-1 と同時にBCD+1
;*************************************
CONV
CLRF DISLOW ;初期クリア
CLRF DISHIGH
INCF BINH,F ;上位+1
COLP
CALL DISUP ;BCD+1
DECFSZ BINL,F ;バイナリ下位-1
GOTO COLP ;ゼロで無い
61
DECFSZ BINH,F ;バイナリ上位-1
GOTO COLP ;ゼロで無い
RETURN ;全部ゼロで完了
;************************************
; 3桁BCD カウントアップサブルーチン
; 最大1024 までと仮定
;************************************
DISUP
INCF DISLOW,F ;1桁目+1
MOVF DISLOW,W ;1桁目オーバーフローチェック
ANDLW 0FH ;下位4ビット
SUBLW 0AH ;W-10
BTFSS STATUS,Z ;W=10か
RETURN ;カウントアップ終了
;*** 2桁目カウントアップ ****
MOVF DISLOW,W ;再取り出し
ANDLW 0F0H ;1桁目0セット
ADDLW 010H ;2桁目カウントアップ
MOVWF DISLOW ;更新
ANDLW 0F0H ;上位4ビット
SUBLW 0A0H ;2桁目オーバーフロー
BTFSS STATUS,Z
RETURN ;終了
;**** 3桁目カウントアップ ****
CLRF DISLOW ;1,2 桁目更新
INCF DISHIGH,F ;3桁目カウントアップ
ANDLW 0FH ;下位4ビット
SUBLW 0AH
BTFSS STATUS,Z ;3桁目オーバーフロー?
RETURN ;終了
MOVLW 010H ;4桁目更新
MOVWF DISHIGH
RETURN
;******************************************
62
; 3桁表示サブルーチン ゼロサプレス付き
; 単位'cm'表示
;*****************************************
CM_DISP
MOVLW 0x80 ;2段目に表示
CALL LCD_CMD
;**** 「DEST」表示 ****
MOVLW 'D'
CALL LCD_DATA
MOVLW 'e'
CALL LCD_DATA
MOVLW 's'
CALL LCD_DATA
MOVLW 't'
CALL LCD_DATA
MOVLW ':'
CALL LCD_DATA
;**** 數字表示 ****
BCF ZFLG,0 ;reset zero flag
MOVF DISHIGH,W
CALL DISP_D ;display 1,2digits
MOVF DISLOW,W
CALL DISP_D ;display 3,4digits
;**** 単位表示 ****
MOVLW 'c' ;display cm
CALL LCD_DATA
MOVLW 'm'
CALL LCD_DATA
RETURN
;**** 強度表示 ****
INTS_DISP
MOVLW 0x8C ;1段目11 文字目
CALL LCD_CMD
MOVLW 'L'
63
CALL LCD_DATA
MOVLW 'v'
CALL LCD_DATA
MOVLW ':'
CALL LCD_DATA
MOVF REC_INTS,W
IORLW 0x30 ;ASCII コードにする
CALL LCD_DATA ;1桁表示
RETURN
;**** 送信周波數表示 ****
TRFRQ_DISP
MOVLW 0x00
MOVWF TABLE_CNT
MOVLW 0xC1 ;2段目2 文字目
CALL LCD_CMD
TRDISP_LP MOVLW 0x03
MOVWF PCLATH
MOVF TABLE_CNT,W
CALL FRQ_MEM ;テーブル呼び出し
CALL LCD_DATA ;データ書き込み
INCF TABLE_CNT,F ;カウンタあわせ
MOVLW 0x0A
SUBWF TABLE_CNT,W ;ブランチ條件
BTFSS STATUS,Z
GOTO TRDISP_LP
;**** 數字表示 ****
MOVLW 0x00
MOVWF TABLE_CNT
MOVF VR_FRQ,W
MOVWF VR_DISP_CNT
TRDISP_LP2 MOVLW 0x03
MOVWF PCLATH
DECFSZ VR_DISP_CNT,F
GOTO TRDISPLAY2
64
TRDISPLAY MOVLW 0x03
MOVWF PCLATH
MOVF TABLE_CNT,W
CALL FRQ_TABLE
CALL LCD_DATA
INCF TABLE_CNT,F
MOVF TABLE_CNT,W
CALL FRQ_TABLE
CALL LCD_DATA
GOTO KHZ_DISP
TRDISPLAY2 MOVLW 0x02
ADDWF TABLE_CNT,F
GOTO TRDISP_LP2
;**** kHz 表示 ****
KHZ_DISP MOVLW 0x00
MOVWF TABLE_CNT
TRDISP_LP3 MOVLW 0x03
MOVWF PCLATH
MOVF TABLE_CNT,W
CALL TR_DISP_MEM
CALL LCD_DATA
INCF TABLE_CNT,F
MOVLW 0x03
SUBWF TABLE_CNT,W
BTFSS STATUS,Z
GOTO TRDISP_LP3
RETURN
;**** 2桁BCD 表示 *****
DISP_D
MOVWF WORK1 ;一時保存
SWAPF WORK1,W ;桁入れ替え
ANDLW 0FH ;上位だけ取り出し
65
MOVWF TEMP ;一時保管
BTFSS ZFLG,0 ;既にゼロでないか?
CALL ZEROSUP ;ゼロチェック
MOVF TEMP,W
SUBLW 0FH ;ゼロサプレスか?
BTFSS STATUS,Z
GOTO NUM1 ;サプレスしない
MOVLW 020H ;ゼロサプレス
GOTO DISP1 ;ブランク表示
;**** 數字表示 ****
NUM1 MOVF TEMP,W ;再取り出し
IORLW 030H ;ASCII コードに変換
;**** 表示制御 ****
DISP1 CALL LCD_DATA ;表示
;**** 下位桁の表示 ****
MOVF WORK1,W ;再取り出し
ANDLW 0FH ;下位桁取り出し
MOVWF TEMP ;一時保管
BTFSS ZFLG,0 ;既にゼロでないか?
CALL ZEROSUP ;ゼロチェック
MOVF TEMP,W ;
SUBLW 0FH ;再取り出し
BTFSS STATUS,Z ;ゼロサプレスか?
GOTO NUM2 ;數字表示へ
MOVLW 020H ;ゼロサプレス
GOTO DISP2
;**** 數字表示 ****
NUM2 MOVF TEMP,W
IORLW 030H ;ASCII コードに変換
DISP2 CALL LCD_DATA ;表示
RETURN
;**** ゼロチェック、ゼロのときOF を返す ****
ZEROSUP
ANDLW 0FH ;check zero
66
BTFSS STATUS,Z
GOTO ZEND ;not zero
MOVLW 0FH
MOVWF TEMP ;set blank
BCF ZFLG,0 ;zero flag off
RETURN
ZEND BSF ZFLG,0 ;not zero flag on
MOVF TEMP,W
RETURN
;***************************************************
; 液晶表示器制御サブルーチン
;***************************************************
;**** 表示データ書込み ****
LCD_DATA
MOVWF DPDT ;save dat
ANDLW 0F0H ;mask lower
BCF STATUS,C ;Carry clear
MOVWF OUTDATA ;Write Data 2bit right shift
RRF OUTDATA
RRF OUTDATA
MOVF OUTDATA,W
MOVWF PORTB
BSF PORTB,6 ;RS high
BSF PORTB,7 ;E high
BCF PORTB,7 ;E low
SWAPF DPDT,W ;get data lower
ANDLW 0F0H
BCF STATUS,C ;Carry clear
MOVWF OUTDATA ;Write Data 2bit right shift
RRF OUTDATA
RRF OUTDATA
MOVF OUTDATA,W
MOVWF PORTB
67
BSF PORTB,6 ;RS high
BSF PORTB,7
BCF PORTB,7
CALL TIME100
RETURN
;**** コマンドデータ出力 *****
LCD_CMD
MOVWF DPDT ;save dat
ANDLW 0F0H ;mask lower
BCF STATUS,C ;Carry clear
MOVWF OUTDATA ;Write Data 2bit right shift
RRF OUTDATA
RRF OUTDATA
MOVF OUTDATA,W
MOVWF PORTB
BSF PORTB,7 ;E high
BCF PORTB,7 ;E low
SWAPF DPDT,W ;get data lower
ANDLW 0F0H
BCF STATUS,C ;Carry clear
MOVWF OUTDATA ;Write Data 2bit right shift
RRF OUTDATA
RRF OUTDATA
MOVF OUTDATA,W
MOVWF PORTB
BSF PORTB,7
BCF PORTB,7
CALL TIME100
RETURN
;**** コマンドデータ8 ビット長
LCD_CMD8
BCF STATUS,C ;Carry clear
MOVWF OUTDATA ;Write Data 2bit right shift
RRF OUTDATA
68
RRF OUTDATA
MOVF OUTDATA,W
MOVWF PORTB
BCF PORTB,6 ;RS Low
BSF PORTB,7 ;E High
BCF PORTB,7 ;E Low
CALL TIME100
RETURN
;**** 表示クリアコマンド出力 ****
LCD_CLR
MOVLW 01H ;clear command
CALL LCD_CMD
CALL TIME1M
CALL TIME1M
RETURN
;**** 初期化 *****
LCD_INI
CLRF PORTB
CALL TIME5M ;wait
CALL TIME5M
CALL TIME5M
MOVLW 30H ;Function set 8bits
CALL LCD_CMD8
CALL TIME5M ;wait
MOVLW 30H
CALL LCD_CMD8
MOVLW 30H
CALL LCD_CMD8
MOVLW 20H ;Function set 4bits mode
CALL LCD_CMD8
MOVLW 28H ;function DL=0 4bit mode
CALL LCD_CMD
MOVLW 08H ;Display off D=C=B=0
69
CALL LCD_CMD
MOVLW 01H ;**Display on D=1 C=B=0
CALL LCD_CLR
MOVLW 06H ;Entry I/D=1 S=0
CALL LCD_CMD
MOVLW 0CH
CALL LCD_CMD ;Cursur on
RETURN
;************************************
; 入出力ピンモード初期化サブルーチン
;************************************
PORT_INI
BSF STATUS,RP0 ;Set page 1
MOVLW 0xC0 ;PullUp
MOVWF OPTION_REG
MOVLW 0xFF
MOVWF TRISA ;PortA All Input
CLRF TRISB ;PortB set
MOVLW 0x03 ;RC0,1 Input
MOVWF TRISC ;PortC set
MOVLW 0x06 ;RA0,1,3 Analog Input
MOVWF ADCON1 ;変換結果左詰
BCF STATUS,RP0 ;Set Page 0
MOVLW 0x80
MOVWF ADCON0
RETURN
;*****************************************
; コンペアモード初期化
;*****************************************
COMP_INI
BSF STATUS,RP0
MOVLW 0x04 ;CCP1割り込み使用許可
MOVWF PIE1
70
BCF STATUS,RP0
MOVLW 0x05 ;プリスケール1:1、オシレータ停止
MOVWF T1CON ;內部クロック同期
MOVLW 0x0A ;Compare Mode set
MOVWF CCP1CON
MOVLW 0x05 ;1497CYC=598.8usec
MOVWF CCPR1H ;256*5=1280
MOVLW 0xD9 ;D9=217
MOVWF CCPR1L ;1280+217=1497
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -