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

📄 diagnose_whl.asm

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