📄 diagnose_whl.asm
字号:
LIST P=16F877
INCLUDE "P16F877.INC"
;嵌套中断如何解决程序的溢出!
CBLOCK 0X20
LOOP1_STACK
LOOP2_STACK
PAGEADD
PAGENUM
CLMADD
CLMSUM
LCDFLAG
SBDATA
INTSCODE
TEMP_1
COUNT_CLM
TOTAL
TEMP ;the counter for getting average value
FLAG ;标志
COUNT ;求平均值记数寄存器
;COUNTW EQU TEMP+4
COM_HIGH
ADD_COUNT
VOL_STACK
; ST_STACK ;for store the data value
result_L1
result_H1
result_L2
result_H2
CAPTURE_VALUE
IIC_ADDRH ;IIC总线选择地址
IIC_ADDRL
IIC_ADDRH1
IIC_ADDRL1
REF_AVERAGE
;**************************************************
ACCALO
ACCAHI
EXPA
ACCBLO
ACCBHI
EXPB
ACCCLO
ACCCHI
ACCDLO
ACCDHI
; TEMP
TEMP1
TIMES
SIGN
; COUNT
ACCEHI
ACCEL0
C_DIV
C_MUL
FPOL
;**********************************************************
FIS_FLAG
FIS_FLAG1
TEMP_STACK
DEYL
DEYH
;*************
COUNT_FLAG ;记数寄存器
; TEMP_STACK
RECORD_TMR1L
RECORD_TMR1H
ENDC
; LCD 模块命令
DISP_ON EQU 0x03F ; 开显示
DISP_OFF EQU 0x03E ;关显示R/W=0 D/I=0
;E-RB0,CS1-RE2,CS2-RA3,R/W-RE0,D/I-RE1
; 定义 LCD控制相应的I/O引脚
RW EQU 6 ;RC6
DI EQU 7 ;RC7
E EQU 5 ;RC5
CS1 EQU 2 ;RB2
CS2 EQU 3 ;RB3
REF_VALUE EQU 0X06 ;参考值的判断是否缺齿
TMR0_B EQU 0X40 ;确定最小频率的数值(30HZ)
;BF EQU 7
;关程序-清屏-开显示
ORG 0X0000
NOP
GOTO MAIN
ORG 0X04
;*******************************************************************************
NOP
BTFSC PIR1,CCP1IF
GOTO CCP1_INTSERVE ;求频率的运算
NOP
; RETFIE
;********************************************************************************
NOP
BTFSC PIR2,CCP2IF
; BTFSS PIR1,CCP1IF
GOTO CCP2_INTSERVE
; GOTO CCP1_INTSERVE
nop
BTFSC INTCON,T0IF
GOTO TIMER0_INTERRUPT
NOP
RETFIE
;**********************************************************************************
;***************FLAG1,COUNT**********************************
CCP1_INTSERVE
BTFSC COUNT_FLAG,7
GOTO CCP1_INTSERVE_CAL
BCF PIR1,CCP1IF ;清除中断标志
BTFSS FLAG,0 ;看是否TIME0是否已经益处,FLAG0 IS 0 THEN GOTO SERVE1_CCP1
GOTO SERVE1_CCP1 ;判断频率是否已达到30HZ的要求
BCF FLAG,0
; BANKSEL TMR1H
MOVLW TMR1L ;
MOVWF RECORD_TMR1L ;记录当前的值
MOVLW TMR1H ;为下面求频率做准备
MOVWF RECORD_TMR1H
BSF INTCON,T0IE ;开T0中断
MOVLW TMR0_B ;TMR0赋初值
MOVWF TMR0 ;并启动定时记数
RETFIE
SERVE1_CCP1
BSF FLAG,1
RETFIE
;************************************************
TIMER0_INTERRUPT
BCF INTCON,T0IF
BSF FLAG,0
BCF INTCON,T0IE ;关T0中断
RETFIE
;**************************************************
;***************************************************
;*************COUNT_FLAG,7**********************************
CCP1_INTSERVE_CAL
BCF PIR1,CCP1IF ;清除中断标志
MOVF CCPR1H,W
MOVWF INDF
INCF FSR,F
DECF COUNT,F
RETFIE
;************AD中断服务端口占用资源:FSR,COUNT,DEY******************************
CCP2_INTSERVE
BCF PIR2,CCP2IF ;清除CCP2中断标志位
BCF PIR1,ADIF ;清除AD中断标志位
BANKSEL ADRESH ;选通BANK ADRESH即BANK0
MOVF ADRESH,W
MOVWF INDF
INCF FSR,F
BANKSEL ADRESL ;选通BANK ADRESH即BANK1
MOVF ADRESL,W
MOVWF INDF
INCF FSR,F
BCF STATUS,RP0 ;返回BANK0
DECF COUNT,F
RETFIE
ORG 0X0100
MAIN
MOVLW HIGH INIT_PORT
MOVWF PCLATH
CALL INIT_PORT ;初始化控制线的数据流动方向
CLRF PCLATH
bsf STATUS,RP0
MOVLW 0X00
MOVWF TRISE
BCF STATUS,RP0
; BSF PORTE,0
BCF PORTE,0 ;use PWM TO CONTROL THE LIGHT
;*************************************************
;程序启动进行判断采集
;********************************
;等待键盘中断的来临
CLRF FLAG
BSF PORTB,0
LOOP
; BTFSC PORTB,0 ;对地跳转
; GOTO LOOP
; CALL KEYDELAY
; BTFSC PORTB,0
; GOTO LOOP
; NOP
; NOP
;***************************************************8***********************8
;判断传感器是否断路,或者短路
;***************************************************************************
; NOP
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL CLEAR1
CALL CLEAR2
NOP
NOP
CLRF PCLATH
NOP
NOP
MOVLW HIGH DISP_INIT
MOVWF PCLATH
CALL DISP_INIT ;显示采集显示
CLRF PCLATH
NOP
NOP
CLRF COUNT_FLAG ;清除以前的值
CLRF FLAG ;
;**************************************************************
; CALL INIT_CCP2 ;采用CCP2方式采样A/D转换
; NOP
; NOP
; CLRF result_H1
; CLRF result_L1
; CLRF result_H2
; CLRF result_L2
; CLRF IIC_ADDRH ;把IIC总线选择地址借用为是否有信号进入
; CLRF IIC_ADDRL ;
; CLRF TEMP ;记数用做是否进入采集范围
; CLRF CAPTURE_VALUE
; MOVLW 0XA0
; MOVWF FSR
; MOVLW .40
; MOVWF COUNT ;一次测量40次
; BSF PORTA,2 ;开RA0,进行A/D采集PORTA2口控制采样PORTA0
;先关上模拟开关口
; BANKSEL PIE1
; BSF PIE1,ADIE ;A/D转换中断允许
; BANKSEL T1CON ;返回BANK0
;wait_start1
; BSF T1CON,TMR1ON ;TMR1工作允许;开始CCP2工作
;WAIT_START
; MOVF COUNT,W ;COUNTW=0X0B
; BTFSS STATUS,Z
; GOTO WAIT_START ;若测量次数未到,则继续等待中断
; BCF T1CON,TMR1ON ;;TMR1工作禁止;停止CCP2工作
;; CALL GETMAX ;求最大值并将其放入result_H2,result_L2中
; INCF IIC_ADDRL,F
; BTFSC STATUS,Z ;INCF影响位为Z
; INCF IIC_ADDRH,F ;在此时所计算的值,为判断是否不合格用的
; BTFSS IIC_ADDRH,1 ;延时什么值是最适合的!!等待一分钟多约81S,/4
; GOTO START_CON
; MOVLW HIGH ERROR1
; MOVWF PCLATH
; GOTO ERROR1 ;没信号,调用ERROR1,所用时间500Tcyc*有16秒未进入
;采集状态
;START_CON
; MOVLW .40
;; MOVWF COUNT
; MOVLW 0XA0 ;初始化FSR数据,若超过该GENERALPURPOSE REGISTER
;值时序将会混乱!
; MOVWF FSR
; MOVLW 0X01 ;*************************
; SUBWF result_H2,W ;这值是否真的合适,在什么条件下完成呢??
; BTFSS STATUS,C
; GOTO wait_start1
; INCF TEMP,F
; BTFSS TEMP,3 ;什么样的值才是最合适呢
; GOTO wait_start1
; BCF INTCON,GIE ;清除上次的中断
; BCF T1CON,TMR1ON
; CALL delay40ms ;让速度在再待均匀上升的时候
; CALL delay40ms
; CALL delay40ms
;在实际过程为何有误判断直接进入下面的工作???????
;这部分若是有外部的电路来判断更为合理!
;*********************************************************************8
WAIT_START
CALL INIT_CCP1 ;捕捉要达到的速度
BSF PORTA,1 ;设立CNTR RA1 FOR CCP1
;**************************************************
BANKSEL OPTION_REG
MOVLW 07H
MOVWF OPTION_REG ;分频比值设为"1:256"
BCF STATUS, RP0
CLRF FLAG
START_CCP
BTFSS PIR1,CCP1IF
GOTO START_CCP ;一个上升沿来临时后开始记时,保证不是在波形中间开始
BCF PIR1,CCP1IF
BSF INTCON,GIE ;总中断允许
BSF INTCON,T0IE ;开T0中断
BSF T1CON,0 ;开定时器CCP1开始运行
BCF INTCON,T0IF ;
MOVLW TMR0_B ;TMR0赋初值
MOVWF TMR0 ;并启动定时记数
START_CCP1
BTFSS FLAG,1
GOTO START_CCP1 ;等待这两个中断来临!
BCF INTCON,T0IF
BCF INTCON,T0IE ;禁止T0中断
BCF INTCON,GIE
INCF COUNT_FLAG,F ;取得频率做下面基数采样幅值做准备!
BTFSS COUNT_FLAG,3
GOTO WAIT_START
;**********************************asad*****************************************
NOP
NOP
BANKSEL OPTION_REG
CLRF OPTION_REG
BCF STATUS,RP0
; BCF INTCON,T0IE ;禁止T0中断
; BCF INTCON,T0IF
CLRF COUNT_FLAG ;***
CLRF FLAG ;去掉所有已使用过的积存器
CLRF FIS_FLAG ;
CLRF FIS_FLAG1
;con_START
; CLRF CCP2CON ;去除CCP2CON,CCP2工作于特别事件触发方式
; CLRF CCPR2L ;因为这个跟CCP1有冲突
; CLRF CCPR2H ;去除所有的于特别事件触发的值
; BCF ADCON0,ADON ;切断ADON采集
; BCF PORTA,2 ;清除CNTR RA2 FOR CCP2
;上程序到下一程序将释放所有的资源!
BSF COUNT_FLAG,7
;**************进入频率采集*********************************************
;先求平均值再对每一个周期进行比较**
;*************************************
;在这里判断是否缺齿************************************************
;占用资源result_L1,result_H1,TEMP,IIC_ADDRESSL,IIC_ADDRESSH****
START
; CALL INIT_CCP1 ;捕捉要达到的速度
; BSF PORTA,1 ;设立CNTR RA1 FOR CCP1
CLRF result_L1
CLRF result_H1
CLRF IIC_ADDRL
CLRF IIC_ADDRH
CLRF FLAG
BSF INTCON,GIE ;总中断允许
BSF T1CON,0 ;开定时器CCP1开始运行
MOVLW 0X10
MOVWF TEMP
WAIT_CCP
BSF STATUS,IRP ;bank2.3
MOVF TEMP,W
MOVWF FSR
MOVLW .51 ;EF有一段的值多为RR
MOVWF COUNT
WAIT_CCP1
MOVF COUNT,W ;用事件查询可保证不会由于中断而在写数据的
BTFSS STATUS,Z ;时候,发生中断
GOTO WAIT_CCP1
BTFSC FLAG,0 ;若在这里求得时间T再去算采样的扶植的时间比较好
GOTO END_CCP
MOVLW 0X90 ;110~190故要求
MOVWF TEMP
BSF FLAG,0 ;采满80+80个数值
GOTO WAIT_CCP
END_CCP
BCF T1CON,0 ;CCP1运行完毕,关T1CON中断
BCF INTCON,GIE ;关总中断
CLRF CCP1CON ;为了防止CCP1&CCP2的冲突
BCF PORTA,1 ;保证信号不再衰减PORTA1,PORTA2
; CLRF FLAG
;****************************************** *************
CALL SUBTRACT
CALL GET_AVERAGE
;数据进行比较
COMPARE
MOVLW 0X10
MOVWF TEMP
CLRF FLAG
;;数据进行比较
COMP_INIT
BSF STATUS,IRP ;
MOVF TEMP,W
MOVWF FSR
MOVLW .50 ;此时的值应该减少
MOVWF COUNT
COMP_LOOP
MOVF REF_AVERAGE,W ;保持参考值不变
MOVWF result_H2
MOVF INDF,W
SUBWF result_H2,F ;产生借位,C为1
BTFSC STATUS,C BTFSC STATUS,C
GOTO COMP_LOOP1
MOVF REF_AVERAGE,W
SUBWF INDF,W
MOVWF result_H2
;*******************************
;**************************
COMP_LOOP1
INCF FSR,F
MOVLW REF_VALUE
SUBWF result_H2,W
BTFSS STATUS,C
GOTO COMP_LOOP1_CON
MOVLW HIGH ERROR3
MOVWF PCLATH
GOTO ERROR3 ;齿圈缺齿
COMP_LOOP1_CON
DECFSZ COUNT,F
GOTO COMP_LOOP
BTFSC FLAG,0
GOTO END_COMP
BSF FLAG,0
MOVLW 0X90
MOVWF TEMP
GOTO COMP_INIT
NOP
END_COMP
BTFSC FIS_FLAG,0
GOTO END_COMP_FIS
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL CLEAR1
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL CLEAR2
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL DISP_CHAR ;显示电压,赫兹,及其相关的数值
CLRF PCLATH
END_COMP_FIS
; CALL delay40ms
BCF STATUS,IRP ;IRP不清除!将会造成存贮错误!
CALL FREQ_VALUE
MOVLW 0X40
MOVWF COUNT_CLM
MOVLW 0XB9
MOVWF ADD_COUNT
MOVF TEMP_1,W
MOVWF COUNT ;求数值为多少频率
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL DISP_DIGITAL
; CALL delay40ms
;*****************************************************
MOVLW 0X48
MOVWF COUNT_CLM
MOVLW 0XB9
MOVWF ADD_COUNT
MOVF result_H1,W
MOVWF COUNT ;求数值为多少频率
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL DISP_DIGITAL
CALL delay40ms
MOVLW 0X50
MOVWF COUNT_CLM
MOVLW 0XB9
MOVWF ADD_COUNT
MOVF result_L1,W ;求数值为多少频率
MOVWF COUNT
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL DISP_DIGITAL
CALL delay40ms
;*****************************************
;*********************************************************
CLRF PCLATH ;ADD FOR CALL INIT_CCP2
;取得CCP1的值即CCP1L & CCP1H / 32 即可判断求幅值的分段数!
RRL REF_AVERAGE
;************************************************************
CALL INIT_CCP2
CLRF TEMP
BCF STATUS,IRP ;选种BANK0,BANK1
BANKSEL PIE1 ;将近在75HZ上采满40个点
BSF PIE1,ADIE ;A/D转换中断允许
BANKSEL PORTA
BSF PORTA,2
MOVLW 0X80 ;保证一圈,测试全齿,(223)128次500uS*40=20mS,*223=4460mS,0XDF改为80
MOVWF TEMP ;(时间的设定)右移2.5FFFF益处
MOVLW 0X00
MOVWF IIC_ADDRH ;求最大值
MOVWF IIC_ADDRL
MOVLW 0XFF
MOVWF IIC_ADDRH1 ;求最小值
MOVWF IIC_ADDRL1
CLRF FLAG ;清除标志,为下面判断是否装偏的做准备
AD_LAST
MOVLW 0XA0
MOVWF FSR
MOVLW .40 ;骗人的东西*500US
MOVWF COUNT
CLRF result_H2
CLRF result_L2
BANKSEL T1CON ;返回BANK0
AD_LAST1
BSF T1CON,TMR1ON ;TMR1工作允许;开始CCP2工作
AD_LAST2
MOVF COUNT,W ;COUNTW=0X0B
BTFSS STATUS,Z
GOTO AD_LAST2 ;若测量次数未到,则继续等待中断
BCF T1CON,TMR1ON ;;TMR1工作禁止;停止CCP2工作
CALL GETMAX ;求最大值并将其放入result_H2,result_L2中
; MOVLW 0X01
; SUBWF result_H2,W ;求一个周期的最大值是否满足了1/3*5V的要求
; BTFSS STATUS,C ;采集的点是否有一个周期多呢??
; GOTO ERROR2 ;是否满足了要求齿圈
; INCF FLAG,F
NOP
NOP
; MOVF result_H2,W
; MOVWF IIC_ADDRH ;IIC总线选择地址
; MOVWF IIC_ADDRH1
; MOVF result_L2,W
; MOVWF IIC_ADDRL
; MOVWF IIC_ADDRL1
CALL LOOP_MI ;IIC_ADDRL1 ,IIC_ADDRH1
CALL LOOP_MA1 ;IIC_ADDRH IIC_ADDRL
; BTFSC FLAG,2
; GOTO ERROR2 ;是否满足了要求齿圈
NOP
NOP ;存最大峰值,存最小峰值
DECFSZ TEMP,F ;ERROR齿圈装偏共采样多少个周期
GOTO AD_LAST
NOP
MOVF IIC_ADDRH1,W
SUBWF IIC_ADDRH,W
SUBWF IIC_ADDRH1,W
BTFSC STATUS,C ;要产生借位
GOTO AD_LAST_CON
MOVLW HIGH ERROR2
MOVWF PCLATH
GOTO ERROR2 ;齿圈装偏
AD_LAST_CON
MOVF IIC_ADDRL,W
MOVWF ACCBLO
MOVF IIC_ADDRH,W
MOVWF ACCBHI
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 0XBB
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 0XBB
MOVWF ADD_COUNT
MOVLW 0X0F
ANDWF ACCCLO,W
MOVWF COUNT ;求数值为多少电压值
MOVLW HIGH CLEAR1
MOVWF PCLATH
CALL DISP_DIGITAL
CALL delay40ms
;**************************************************
MOVLW 0X48
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -