春節(jié)期間閑來(lái)沒(méi)事,用廢控制器(PIC16F72版)做了一個(gè)測(cè)電機(jī)轉(zhuǎn)速的東東.
原理是:檢測(cè)單位時(shí)間內(nèi)的霍耳換相數(shù),再換算成每分鐘轉(zhuǎn)速.因目前市面上有32\40\46\56\70片磁鋼的電機(jī),只能用外部切換選擇了.
、硬件約定:
RB口對(duì)應(yīng)7段輝光管,BIT0-A……BIT6-G,不用小數(shù)點(diǎn).
RC口對(duì)應(yīng)位,動(dòng)態(tài)顯示,BIT7-千位……BIT4-個(gè)位.
RA口對(duì)應(yīng)電機(jī)選擇:
000-32片磁鋼
001-40片磁鋼
010-46片磁鋼
011-56片磁鋼
100-70片磁鋼
RA口之3用來(lái)輸入霍耳信號(hào),RA口之4用來(lái)輸出采樣周期信號(hào),以調(diào)試程序。
;用中斷時(shí)間來(lái)控制采樣周期,0.5--1秒刷新一次,預(yù)計(jì)精度為千分之一。
#INCLUDE
; RAM_VARIABLE
LS_1 EQU 0X25 ;臨時(shí)寄存器
LS_2 EQU 0X26
LS_3 EQU 0X27
LS_4 EQU 0X28
LS_5 EQU 0X29
LS_6 EQU 0X2A
LS_7 EQU 0X2B
LS_8 EQU 0X2C
LS_9 EQU 0X2D
LJIA_1 EQU 0X2E
LJIA_2 EQU 0X2F
LJIA_3 EQU 0X30
LJIA_4 EQU 0X31 ;數(shù)據(jù)累加寄存器
XIANS_1 EQU 0X32
XIANS_2 EQU 0X33
XIANS_3 EQU 0X34
XIANS_4 EQU 0X35 ;顯示寄存器
DFEN_1 EQU 0X36 ;動(dòng)態(tài)分配寄存器
FLAG EQU 0X37 ;標(biāo)旗寄存器
LS_INT1 EQU 0X39 ;中斷保護(hù)寄存器1
LS_INT2 EQU 0X3A ;中斷保護(hù)寄存器2
JS_INT1 EQU 0X3B ;中斷計(jì)數(shù)器1
JS_INT2 EQU 0X3C ;中斷計(jì)數(shù)器2
JS_INT3 EQU 0X3D ;中斷計(jì)數(shù)器3
; =========================================================
ORG 0X000
NOP
GOTO PROGRAM
ORG 0X4
GOTO ZHONGDUAN
PROGRAM ;程序開始
CALL CSH
CLRWDT
LOOP5 CALL SHONGX
CALL DINPOT_0
BTFSC FLAG,0
GOTO LOOP5
CALL ALLADD
BTFSC FLAG,3 ;單\雙計(jì)數(shù)選擇
CALL ALLADD
LOOP6 CALL SHONGX
CALL DINPOT_1
BTFSS FLAG,1
GOTO LOOP6
CALL ALLADD
BTFSC FLAG,3 ;單\雙計(jì)數(shù)選擇
CALL ALLADD
GOTO LOOP5
ORG 0X20
;===============================================================
CHABIAO ;查表
MOVWF PCL
RETLW 0X3F ;00111111
RETLW 0X6 ;00000110
RETLW 0X5B ;01011011
RETLW 0X4F ;01001111
RETLW 0X66 ;01100110
RETLW 0X6D ;01101101
RETLW 0X7D ;01111101
RETLW 0X7 ;00000111
RETLW 0X7F ;01111111
RETLW 0X6F ;01101111
RETLW 0X79 ;01111001 ,E,表示超出量程
RETLW 0X79
;==================================================================
CSH ;初始化
BCF STATUS,RP0 ;體0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF CCP1CON ;CCP模塊設(shè)置(禁用)
BSF STATUS,RP0 ;體1
CLRF PIE1 ;外設(shè)中斷禁止
MOVLW 0XDF
MOVWF TRISA
CLRF TRISB
CLRF TRISC ;I/O口設(shè)置
MOVLW 0X88
MOVWF OPTION_REG ;分頻器設(shè)定
MOVLW 0X7
MOVWF ADCON1 ;A口全設(shè)為數(shù)字口
BCF STATUS,RP0 ;體0
CLRF T1CON
CLRF SSPCON ;串口禁止
CLRF CCPR1L
MOVLW 0X5C
MOVWF 0X22
MOVLW 0X23
MOVWF FSR
LOOP1 CLRF INDF ;通用寄存器清零
INCF FSR,F
DECFSZ 0X22,F
GOTO LOOP8
BCF STATUS,RP0
MOVLW 0X80
MOVWF ADCON0 ;AD設(shè)置
CLRF TMR0
MOVLW 0XA0
MOVWF INTCON ;中斷設(shè)置
RETURN
;================================================================
SHONGX ;送顯
INCF DFEN_1,F ;動(dòng)態(tài)分配寄存器
MOVLW 0X1
SUBWF DFEN_1,W
BTFSC STATUS,Z
GOTO ZT_1
MOVLW 0X2
SUBWF DFEN_1,W
BTFSC STATUS,Z
GOTO ZT_2
MOVLW 0X3
SUBWF DFEN_1,W
BTFSC STATUS,Z
GOTO ZT_3
GOTO ZT_4
ZT_1 ;狀態(tài)1,個(gè)位送顯
MOVF XIANS_1,W
ADDLW 0X21
CALL CHABIAO
MOVWF PORTB
MOVLW 0X10
MOVWF PORTC
RETURN
ZT_2 ;狀態(tài)2,十位送顯
MOVF XIANS_2,W
ADDLW 0X21
CALL CHABIAO
MOVWF PORTB
MOVLW 0X20
MOVWF PORTC
RETURN
ZT_3 ;狀態(tài)3,百位送顯
MOVF XIANS_3,W
ADDLW 0X21
CALL CHABIAO
MOVWF PORTB
MOVLW 0X40
MOVWF PORTC
RETURN
ZT_4 ;狀態(tài)4,千位送顯
MOVF XIANS_4,W
ADDLW 0X21
CALL CHABIAO
MOVWF PORTB
MOVLW 0X80
MOVWF PORTC
CLRF DFEN_1
RETURN
;======================================================
DINPOT_0 ;讀輸入信號(hào),0有效
MOVLW 0x8 ;連續(xù)判斷8次
MOVWF LS_1
CLRF LS_2
LOOP_1
BTFSS PORTA, 3
INCF LS_2, F
DECFSZ LS_1, F
GOTO LOOP_1
MOVLW 0x8
SUBWF LS_2, W
BTFSS STATUS, Z
GOTO LOOP_2
BCF FLAG,0 ;表示讀入0
RETURN
LOOP_2
BSF FLAG,0 ;表示讀入1
RETURN
;========================================================
DINPOT_1 ;讀輸入信號(hào),1有效
MOVLW 0x8 ;連續(xù)判斷8次
MOVWF LS_3
CLRF LS_4
LOOP_3
BTFSC PORTA, 3
INCF LS_4, F
DECFSZ LS_3, F
GOTO LOOP_3
MOVLW 0x8
SUBWF LS_4, W
BTFSS STATUS, Z
GOTO LOOP_4
BSF FLAG,1 ;表示讀入1
RETURN
LOOP_4
BCF FLAG,1 ;表示讀入0
RETURN
;==========================================================
ALLADD ;信號(hào)累集
INCF LJIA_1,F
MOVLW 0XA
SUBWF LJIA_1,W
BTFSS STATUS,C
RETURN
INCF LJIA_2,F ;滿十進(jìn)一
CLRF LJIA_1
MOVLW 0XA
SUBWF LJIA_2,W
BTFSS STATUS,C
RETURN
INCF LJIA_3,F ;滿百進(jìn)一
CLRF LJIA_2
MOVLW 0XA
SUBWF LJIA_3,W
BTFSS STATUS,C
RETURN
INCF LJIA_4,F ;滿千進(jìn)一
CLRF LJIA_3
MOVLW 0XA
SUBWF LJIA_4,W
BTFSS STATUS,C ;上萬(wàn)則顯示故障
RETURN
MOVLW 0XB
MOVWF LJIA_4
RETURN
;========================================================
ZHONGDUAN ;中斷
MOVWF LS_INT1
SWAPF STATUS,W
BCF STATUS,RP0
MOVWF LS_INT2 ;現(xiàn)場(chǎng)保護(hù)
CLRWDT
MOVF PORTA,W
ANDLW 0X7
MOVWF LS_5
BTFSC STATUS,Z
GOTO XUANZ_32
MOVLW 0X1
SUBWF LS_5,W
BTFSC STATUS,Z
GOTO XUANZ_40
MOVLW 0X2
SUBWF LS_5,W
BTFSC STATUS,Z
GOTO XUANZ_46
MOVLW 0X3
SUBWF LS_5,W
BTFSC STATUS,Z
GOTO XUANZ_56
MOVLW 0X4
SUBWF LS_5,W
BTFSC STATUS,Z
GOTO XUANZ_70
GOTO XUANZ_46 ;電機(jī)選擇
;-------------------------------------------------------------
XUANZ_32 ;32片磁鋼電機(jī)
MOVLW 0X39
MOVWF LS_6
MOVLW 0X38
MOVWF LS_7
BSF FLAG,3 ;單\雙計(jì)數(shù)選擇
GOTO JISHU ;開始計(jì)數(shù)
XUANZ_40 ;40片磁鋼電機(jī)
MOVLW 0X2D
MOVWF LS_6
MOVLW 0XC7
MOVWF LS_7
BSF FLAG,3 ;單\雙計(jì)數(shù)選擇
GOTO JISHU ;開始計(jì)數(shù)
XUANZ_46 ;46片磁鋼電機(jī)
MOVLW 0X27
MOVWF LS_6
MOVLW 0XCE
MOVWF LS_7
BSF FLAG,3 ;單\雙計(jì)數(shù)選擇
GOTO JISHU ;開始計(jì)數(shù)
XUANZ_56 ;56片磁鋼電機(jī)
MOVLW 0X20
MOVWF LS_6
MOVLW 0XB3
MOVWF LS_7
BSF FLAG,3 ;單\雙計(jì)數(shù)選擇
GOTO JISHU ;開始計(jì)數(shù)
XUANZ_70 ;70片磁鋼電機(jī)
MOVLW 0X34
MOVWF LS_6
MOVLW 0X51
MOVWF LS_7
BCF FLAG,3 ;單\雙計(jì)數(shù)選擇
GOTO JISHU ;開始計(jì)數(shù)
;------------------------------------------------------------
JISHU ;開始計(jì)數(shù)
BTFSC FLAG,2 ;計(jì)數(shù)器滿期標(biāo)記
GOTO CAIJIXH ;采集信號(hào)
INCF JS_INT1,F
BTFSS STATUS,Z
GOTO HFXC ;1號(hào)計(jì)數(shù)未滿,返回
INCF JS_INT2,F ;2號(hào)計(jì)數(shù)
MOVF LS_6,W
SUBWF JS_INT2,W
BTFSS STATUS,C
GOTO HFXC ;2號(hào)計(jì)數(shù)未滿,返回
BSF FLAG,2 ;2號(hào)計(jì)數(shù)已滿,打上標(biāo)記
GOTO HFXC
;-----------------------------------------------------------
CAIJIXH ;采集信號(hào)
INCF JS_INT1,F
MOVF LS_7,W
SUBWF JS_INT1,W
BTFSS STATUS,C
GOTO HFXC ;1號(hào)計(jì)數(shù)余數(shù)未滿,返回
MOVF LJIA_1,W
MOVWF XIANS_1
MOVF LJIA_2,W
MOVWF XIANS_2
MOVF LJIA_3,W
MOVWF XIANS_3
MOVF LJIA_4,W
MOVWF XIANS_4
CLRF LJIA_1
CLRF LJIA_2
CLRF LJIA_3
CLRF LJIA_3
CLRF JS_INT1
CLRF JS_INT2
BCF FLAG,2 ;所用的計(jì)數(shù)器,標(biāo)記位復(fù)位
BTFSC PORTA,5 ;用于驗(yàn)證采樣周期
GOTO LOOP_9
BSF PORTA,5
GOTO HFXC
LOOP_9 BCF PORTA,5
HFXC BCF INTCON,2 ;恢復(fù)現(xiàn)場(chǎng),出棧
SWAPF LS_INT2,W
MOVWF STATUS
SWAPF LS_INT1,F
SWAPF LS_INT1,W
RETFIE
END