⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diagnose_whl.asm

📁 这个可是我用了三个月的结晶
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	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 + -