📄 diagnose_whl.asm
字号:
MOVWF COUNT_CLM
MOVLW 0XBB
MOVWF ADD_COUNT
SWAPF ACCCLO,F
MOVLW 0X0F
ANDWF ACCCLO,W
MOVWF COUNT ;求数值为多少电压值
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL DISP_DIGITAL
CALL delay40ms
;*********************************************************
MOVLW 0X58
MOVWF COUNT_CLM
MOVLW 0XBB
MOVWF ADD_COUNT
SWAPF ACCDHI,F
MOVLW 0X0F
ANDWF ACCDHI,W
MOVWF COUNT ;求数值为多少电压值
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL DISP_DIGITAL
CALL delay40ms
NOP
NOP
;********************************************************
MOVF IIC_ADDRL1,W
MOVWF ACCBLO
MOVF IIC_ADDRH1,W
MOVWF ACCBHI
CLRF PCLATH
CALL DtoF ;化为浮点数
NOP
MOVLW 0X10 ;在4V的情况下改的!
MOVWF ACCALO
; MOVLW 0X60
MOVLW 0X66 ;电压蜂值偏大59改正修正数字
MOVWF ACCAHI
MOVLW 0XF9 ;原为F8,求峰峰时改为F9
MOVWF EXPA ;电压最大值
CALL F_mpy
CALL FtoBCD
NOP
MOVLW 0X40
MOVWF COUNT_CLM
MOVLW 0XBD
MOVWF ADD_COUNT
MOVLW 0X0F
ANDWF ACCCHI,W
MOVWF COUNT ;求数值为多少电压值
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL DISP_DIGITAL
CALL delay40ms
;*********************************************************
MOVLW 0X50
MOVWF COUNT_CLM
MOVLW 0XBD
MOVWF ADD_COUNT
MOVLW 0X0F
ANDWF ACCCLO,W
MOVWF COUNT ;求数值为多少电压值
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL DISP_DIGITAL
CALL delay40ms
;*************************************************************
MOVLW 0X48
MOVWF COUNT_CLM
MOVLW 0XBD
MOVWF ADD_COUNT
SWAPF ACCCLO,F
MOVLW 0X0F
ANDWF ACCCLO,W
MOVWF COUNT ;求数值为多少电压值
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL DISP_DIGITAL
CALL delay40ms
;**********************************
MOVLW 0X58
MOVWF COUNT_CLM
MOVLW 0XBD
MOVWF ADD_COUNT
SWAPF ACCDHI,F
MOVLW 0X0F
ANDWF ACCDHI,W
MOVWF COUNT ;求数值为多少电压值
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL DISP_DIGITAL
CALL delay40ms
;**********************************************************
;上程序到下一程序将释放所有的资源!
;**************进入频率采集*********************************************
;先求平均值再对每一个周期进行比较***************************************
;在这里判断是否缺齿************************************************
;占用资源result_L1,result_H1,TEMP,IIC_ADDRESSL,IIC_ADDRESSH****
;**********让数字在一直的显示,***********************************************
BSF FIS_FLAG,0
CLRF PCLATH
INCF FIS_FLAG1,F
BTFSS FIS_FLAG1,2 ;数值应该多少次为合适?3-2
; GOTO con_START *********继续动作************
;**********************************************************************
end_sleep
BCF INTCON,GIE
MOVLW HIGH DISP_FINISH
MOVWF PCLATH
CALL CLEAR1
CALL CLEAR2
CALL DISP_FINISH
sleep ;进入睡眠
nop
GOTO $-1 ;等待复位;OK
;**********************************************************************
PWMINT
MOVLW 0X2F
MOVWF CCPR1L
MOVLW 0X3C
MOVWF CCP1CON
MOVLW 0X04
MOVWF T2CON
BANKSEL PR2
MOVLW 0X50
MOVWF PR2
BCF TRISC,1 ;
BCF PIE1,CCP2IE ;CCP FORBID THE CCP INTERRUPT
RETURN
;****************************************
KEYDELAY
MOVLW 0X0A
MOVWF DEYH
AGAIN2
MOVLW 0XFF
MOVWF DEYL
AGAIN1
DECFSZ DEYL,F
GOTO AGAIN1
DECFSZ DEYH,F
GOTO AGAIN2
RETURN
;***************ERROR1 FOR NO SIGNAL OR THE DISTANCE BETWEEN TOOTH WHELL AND SENOR IS TOO LARGE********
;*************初始化CCP1****************************
INIT_CCP1
BANKSEL CCP1CON
MOVLW 0X05
MOVWF CCP1CON ;首先设置CCP1捕捉每个脉冲的上升沿
CLRF T1CON ;关闭定时器1
CLRF INTCON
BSF INTCON,PEIE ;外围中断允许(此时总中断关闭)
BANKSEL PIE1
CLRF PIE1 ;清除其它中断允许
CLRF PIE2 ;清除其它中断允许
BSF PIE1,CCP1IE ;允许CCP1中断
BSF TRISC,2 ;设置RC2为输入,对于CCP1而言其入口是RC2
BCF TRISA,1 ;CNTL RA1
BANKSEL TMR1H
CLRF TMR1H ;清除记录翻转的时间
CLRF TMR1L ;清除记录翻转的时间
;在开中断前,必须清除CCP1的中断标志位;否
BCF PIR1,CCP1IF ;则下次循环到此时,一开中断,中断程序马上
;执行,损失惨重
RETURN
;***********初始化CCP2采集*******************************************************************************
;当CCP2工作在比较工作方式时,不断地用16位的CCP2寄存器中的值与TMR1寄存器中的值做比较,如果二者相等,CCP2的特殊
;事件触发将对TMR1寄存器对复位,并且启动模/数转换;
;*********************************************************************************************************
INIT_CCP2
BCF STATUS,IRP
BSF INTCON,GIE ;打开总中断允许
BSF INTCON,PEIE ;外围中断允许
MOVLW 0X81 ;初始化ADCON0寄存器
MOVWF ADCON0
BSF STATUS,RP0 ;换到BANK1
CLRF PIE1 ;清除其它中断允许NEW ADD
CLRF PIE2 ;清除其它中断允许NEW ADD
MOVLW 0X8E ;初始化ADCON1寄存器,选定PORTA0为模拟输入通道,并且参考电压为电源电压
MOVWF ADCON1
BCF PIE2,CCP2IE ;禁止CCP2中断?????
; BSF PIE2,CCP2IE
BSF TRISA,0
BCF TRISA,2 ;SET TRISA2 AS OUTPUT PORT,CONTROL CCP2
BANKSEL CCP2CON ;返回BANK0
MOVLW 0X0B
MOVWF CCP2CON ;初始化CCP2CON,CCP2工作于特别事件触发方式
MOVLW 0XEE ;设置500us采集数据一次
MOVWF CCPR2L
MOVLW 0X02
MOVWF CCPR2H
BCF PORTA,2 ;FIRST GAP THE PORTB ,FOR CD4006 CNTL2 AS CLOSED
;*********
CLRF T1CON ;初始化T1CON积存器
CLRF TMR1H ;清TMR1H,TMR1L寄存器
CLRF TMR1L
CLRF PIR1 ;清除各中断标志位
CLRF PIR2
RETURN
;**************出口值TEMP,TEMP_1********************************************
FREQ_VALUE
CLRF TEMP
CLRF TEMP_1
CLRF result_L1
CLRF result_H1
CLRF FLAG
MOVLW 0X16
MOVWF result_H2 ;1000000*3/2 即16E360,去掉后两位
MOVLW 0XE4
MOVWF result_L2
CALL CAL_FREQ
CALL SBTBCD2
MOVLW 0X0F
ANDWF TEMP_1,F
MOVF TEMP,W
MOVWF result_L1
SWAPF TEMP,W
MOVWF result_H1
MOVLW 0X0F
ANDWF result_L1,F
ANDWF result_H1,F
RETURN
;****************求频率值*******************************************
CAL_FREQ
MOVF REF_AVERAGE,W ;减数
SUBWF result_L2,F ;
BTFSS STATUS,C
GOTO END_CAL_FREQ
INCF TEMP,F
GOTO CAL_FREQ
END_CAL_FREQ
BTFSC FLAG,0
GOTO END_CAL_FREQ2
INCF TEMP,F
DECFSZ result_H2,F
GOTO CAL_FREQ
GOTO END_CAL_FREQ1
END_CAL_FREQ1
BSF FLAG,0
GOTO CAL_FREQ
END_CAL_FREQ2
RETURN
;*****************************************************************
SBTBCD2 MOVF TEMP,W
MOVWF IIC_ADDRH
CLRF TEMP
CLRF TEMP_1
BCF STATUS,C
MOVLW 8
MOVWF COUNT ;BIAN
LOOPC RLF IIC_ADDRH,F
RLF TEMP,F
RLF TEMP_1,F
DECFSZ COUNT,F
GOTO ADJDEC2
RETURN ;整个子程序结束
ADJDEC2 MOVLW TEMP
MOVWF FSR
CALL ADJBCD2 ;调整SOU
MOVLW TEMP_1
MOVWF FSR
CALL ADJBCD2 ;调整SOUH
GOTO LOOPC
;********************调整BCD********************
ADJBCD2 MOVLW 03H
ADDWF INDF,W ;低四位加3
MOVWF IIC_ADDRL ;暂存
BTFSC IIC_ADDRL,3 ;结果大于7,
MOVWF INDF ;则存起来
MOVLW 30H
ADDWF INDF,W ;高四位加3
MOVWF IIC_ADDRL
BTFSC IIC_ADDRL,7 ;结果大于7,
MOVWF INDF ;则存起来
RETLW 0
;************FDUMA***求最大值,FLAG0=0*****************************
GETMAX
MOVLW 0XA0
MOVWF FSR
MOVLW .40
MOVWF COUNT
CLRF result_H2
CLRF result_L2
MAX_VALUE
MOVF INDF,W
MOVWF result_H1
INCF FSR,F
MOVF INDF,W
MOVWF result_L1
INCF FSR,F
CALL LOOP_MA
DECFSZ COUNT,F
GOTO MAX_VALUE
RETURN
LOOP_MA
MOVF result_H1,W ;旧值存放在result_H2中
SUBWF result_H2,W
BTFSC STATUS,C
GOTO NOVER ;如果result_H2>=resultH1 goto NOVER
MOVF result_H1,W
MOVWF result_H2 ;result_H2中总是存放最大值
RELOW
MOVF result_L1,W
MOVWF result_L2
NEXT19
RETURN
NOVER
BTFSS STATUS,Z ;判断高位是否相等
GOTO NEXT19 ;如果result_H2>=resultH1 goto next19
MOVF result_L1,W ;判断低位
SUBWF result_L2,W
BTFSS STATUS,C ;如果result_L2>=result_L1 goto NEXT19
GOTO RELOW
GOTO NEXT19
;***********************************************************
;********************求最小值,出口result_H2,result_L2*********************************
LOOP_MI
MOVF result_H2,W ;IIC_ADDRH1存放旧值
subwf IIC_ADDRH1,W
btfss STATUS,C ;CARRY/BORROW
GOTO NEXT21 ;result_H2<result_H1 goto next21
BTFSS STATUS,Z ;判断是否相等
GOTO REHIGH ;如果result_H2>result_H1 goto BELOW
MOVF result_L2,W ;在高位相等的情况下判断低位大小
subwf IIC_ADDRL1,W
BTFSS STATUS,C ;如果rusult_L2>result_L1 goto RELOW
GOTO NEXT21
GOTO MI_RELOW
REHIGH
MOVF result_H2,W
movwf IIC_ADDRH1 ;置放高位,result_H2,总是放置最小值
MI_RELOW
movf result_L2,W
movwf IIC_ADDRL1
NEXT21
RETURN
;*************************************************************
LOOP_MA1
MOVF result_H2,W ;旧值存放在result_H2中
SUBWF IIC_ADDRH,W
BTFSC STATUS,C
GOTO NOVER1 ;如果result_H2>=resultH1 goto NOVER
MOVF result_H1,W
MOVWF IIC_ADDRH ;result_H2中总是存放最大值
RELOW1
MOVF result_L2,W
MOVWF IIC_ADDRL
NEXT191
RETURN
NOVER1
BTFSS STATUS,Z ;判断高位是否相等
GOTO NEXT191 ;如果result_H2>=resultH1 goto next19
MOVF result_L2,W ;判断低位
SUBWF IIC_ADDRL,W
BTFSS STATUS,C ;如果result_L2>=result_L1 goto NEXT19
GOTO RELOW1
GOTO NEXT191
;*********求下降沿的差值即为所求的周期放回到原来的积存器*****************************************
SUBTRACT ;求周期的值
MOVLW 0X10
MOVWF TEMP
CLRF FLAG ;清除前面的所占用寄存器
SUB_INIT
; BSF STATUS,IRP ;是否有必要再加呢?还有考虑其它的值吗?BANK0~3
MOVF TEMP,W
MOVWF FSR
MOVLW .50
MOVWF COUNT
SUB_LOOP
MOVF INDF,W ;从110 LACATION 开始
MOVWF result_H1
INCF FSR,F
MOVF INDF,W
MOVWF result_H2
MOVF result_H1,W
SUBWF result_H2,F ;当值小于零自动会取反求值
DECF FSR,F
MOVF result_H2,W
MOVWF INDF
INCF FSR,F
DECFSZ COUNT,F
GOTO SUB_LOOP
BTFSC FLAG,0
GOTO END_SUB
BSF FLAG,0
MOVLW 0X90
MOVWF TEMP
GOTO SUB_INIT
END_SUB
RETURN
;*********求频率的平均值*******************************
GET_AVERAGE
CLRF REF_AVERAGE
CLRF FLAG ;这时应该不改变积存器所有的值
BSF STATUS,IRP ;110~159
MOVLW 0X10
MOVWF TEMP
; MOVWF FSR
MOVF INDF,W
MOVWF REF_AVERAGE
; INCF FSR,F ;*********0X11
; MOVF FSR,W
INIT_AVERAGE
; BSF STATUS,IRP
MOVF TEMP,W
MOVWF FSR
MOVLW .50 ;79个数值求平均值!
MOVWF COUNT
AVERAGE_LOOP
MOVF INDF,W
ADDWF REF_AVERAGE,F
RRF REF_AVERAGE,F
INCF FSR,F
DECFSZ COUNT,F
GOTO AVERAGE_LOOP
BTFSC FLAG,0
GOTO END_AVERAGE
BSF FLAG,0
MOVLW 0X90
MOVWF TEMP
GOTO INIT_AVERAGE
END_AVERAGE
RETURN
;*&****************浮点数至BCD码子程序************8
;入口条件:ACCBHI、ACCBLO、EXPB
;出口条件:5位压缩BCD码存于ACCCHI低半字节、ACCCLO和ACCDHI中,
;符号保存于FPOL寄存器的第7位,小数点位置存于C_MUL和C_DIV中
FtoBCD
CLRF C_MUL
CLRF C_DIV
CLRF ACCAHI
CALL S_SIGN
MOVF SIGN,0
MOVWF FPOL
MOVLW 50
MOVWF ACCAHI
CLRF ACCALO
MOVLW 04
MOVWF EXPA
MU15
BTFSS EXPB,7
GOTO MU12
MU11
CALL F_mpy
INCF C_MUL,F
GOTO MU15
MU12
MOVLW .12
SUBWF EXPB,0
BTFSC STATUS,C
GOTO MU14
MU13
CALL F_mpy
INCF C_MUL,F
GOTO MU12
MU14
MOVLW .16
SUBWF EXPB,W
BTFSS STATUS,C
GOTO NEXT
DIV1
CALL FDIV
INCF C_DIV,F
GOTO MU14
NEXT
CALL FTOW3
CALL BtoBCD
MOVF ACCCHI,W
BTFSS STATUS,Z
RETLW 0
MOVLW 04
MOVWF TIMES
BCF STATUS,C
MU16
RLF ACCDHI,F
RLF ACCCLO,F
RLF ACCCHI,F
DECFSZ TIMES,F
GOTO MU16
MOVF C_DIV,F
BTFSC STATUS,Z
GOTO TEMUL
DECF C_DIV,F
RETLW 0
TEMUL
INCF C_MUL,F
RETLW 0
D_add1
MOVF ACCALO,0
ADDWF ACCBLO,0
BTFSC STATUS,C
INCF ACCDLO,F
MOVF ACCAHI,0
ADDWF ACCDLO,F
RETLW 0
;**************************************************
;**********双字节数至BCD码子程序************
BtoBCD CLRF SIGN ;初始化符号寄存器
BTFSS ACCBHI,7 ;被转换数为负?
GOTO LOOP1 ;否,转BtoBCD
BSF SIGN,7 ;是,存符号
CALL NEG_B ;ACCB取补
LOOP1 BCF STATUS,C ;清进位位
MOVLW .16 ;移位计数器赋初值
MOVWF COUNT
CLRF ACCCHI ;初始化出口寄存器
CLRF ACCCLO
CLRF ACCDHI
LOOP16 RLF ACCBLO,F ;ACCB左移一位至出口寄存器
RLF ACCBHI,F
RLF ACCDHI,F
RLF ACCCLO,F
RLF ACCCHI,F
DECFSZ COUNT ,F ;移位计数器=0?
GOTO ADJDEC ;否,转ADJDEC
RETLW 0 ;是,返回
ADJDEC
MOVLW ACCDHI ;指针指向ACCDHI
MOVWF FSR
CALL ADJBCD ;调用BCD码校正子程序
MOVLW ACCCLO ;指针指向ACCCLO
MOVWF FSR
CALL ADJBCD ;调用BCD码校正子程序
MOVLW ACCCHI ;指针指向ACCCHI
MOVWF FSR
CALL ADJBCD ;调用BCD码校正子程序
GOTO LOOP16 ;ACCB重新左移
;************* BCD码校正子程序**************
ADJBCD MOVLW 0X03 ;LSD+3>7?
ADDWF INDF,0
MOVWF TEMP
BTFSC TEMP,3
MOVWF INDF ;是,LSD=LSD+3
MOVLW 0X30 ;否,MSD+3>7?
ADDWF INDF,0
MOVWF TEMP
BTFSC TEMP,7
MOVWF INDF ;是,MSD=MSD+3
RETLW 0 ;返回
;****************************************
FTOW3 MOVLW .15 ;EXPB=15(十进制数)?
SUBWF EXPB,0
BTFSC STATUS,Z
RETLW 0 ;是,返回
BCF STATUS,C ;否,ACCB继续右移,EXPB加1
RRF ACCBHI,F
RRF ACCBLO,F
INCF EXPB,F
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -