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

📄 engine.asm

📁 发动机喷油控制程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
		
		CLRF	EEP_NUMBER
		;读出8个数据到EEP_DATAH0---EEP_DATAL3
READ_EEP_LOOP:
		;读EEPROM
		BSF 	STATUS, RP0 	;读EEPROM
		BSF 	EECON1, EEPGD 
		BSF 	EECON1, RD
		NOP
		NOP
		BCF 	STATUS, RP0
		;保存数据
		MOVF 	EEDATH, W 		
		MOVWF 	INDF			;保存EEP高8位
		INCF	FSR,0x1			
		MOVF 	EEDATA, W 
		MOVWF 	INDF			;保存EEP低8位
		INCF	FSR,0x1
		;地址递增
		INCF	EEADR,0x1		;EEP地址+1
		INCF	EEP_NUMBER,0x1	;EEP读计数器+1
		;循环判断
		BTFSS	EEP_NUMBER,0x2	;是否读了四个数据
		GOTO	READ_EEP_LOOP
FRESH_EEP_DATA:							
		;更新EEP_DATAL
		RLF		EEP_ADDRL,0x0
		ANDLW	0x6
		ADDLW	EEP_DATAL0

		MOVWF	FSR				;						=>FSR
		MOVF	EEP_DATAL,W		;EEP_DATA
		MOVWF	INDF			;			=>[EEP_ADDR+EEP_ADDR[1:0]]

		;写循环准备
		MOVLW	EEP_DATAH0
		MOVWF	FSR				;间接寻址EEP_DATA

		MOVF	EEP_ADDRL,W		;ADDRH,ADDRL为首地址
		ANDLW	0xFC
		MOVWF	EEADR			;调入低8位地址的4偶地址

		MOVF	EEP_ADDRH,W	
		MOVWF	EEADRH			;调入高8位地址
		CLRF	EEP_NUMBER		;写入数据计数清零
		BCF		INTCON,GIE
WRITE_EEP_LOOP:
		CLRWDT
		;调入数据
		;MOVLW	0x34
 		MOVF 	INDF,W 		
		MOVWF 	EEDATH			;存入数据高字节
		INCF	FSR,0x1	 
		MOVF 	INDF,W 
		MOVWF 	EEDATA			;存入数据低字节
		INCF	FSR,0x1
		;保存数据到EEPROM
		BSF 	STATUS,RP0 		
		BSF 	EECON1,EEPGD 
		BSF 	EECON1,WREN

		MOVLW 	0x55 
		MOVWF 	EECON2 
		MOVLW 	0xaa
		MOVWF 	EECON2
		BSF 	EECON1,WR
		NOP
		NOP 
		BCF 	EECON1,WREN 
		BCF 	STATUS,RP0

		;地址递增
		INCF	EEP_NUMBER,0x1
		INCF	EEADR,0x1
		BTFSS	EEP_NUMBER,0x2
		GOTO	WRITE_EEP_LOOP
		BSF		INTCON,GIE
UART_WR_EXIT:
		CALL	PAGE0
		MOVLW	0x92
		CALL	UART_SEND
UART_WR_OVER:
		RETURN
;===========================
UART_SEND:
		BCF		STATUS,RP0
		BCF		STATUS,RP1		
UART_WAIT:
		CLRWDT
		BTFSS	PIR1,TXIF
		GOTO 	UART_WAIT
 		MOVWF	TXREG	
 		RETURN	
;========================================================
;喷嘴处理
;========================================================	
PJ_TIMING:
		;GOTO EXE_PZ1
;===================================处理喷嘴0===================================
EXE_PZ0:
	 	CLRWDT	
		INCFSZ	PZ0_PRIODA,0x1                 
		GOTO 	JUDGE_PZ0
		
		INCFSZ	PZ0_PRIODB,0x1
		GOTO	JUDGE_PZ0
		MOVLW	0xFF
		MOVWF	PZ0_PRIODB
JUDGE_PZ0:
		BTFSC   PORTB,PZ0IN     	;判断喷嘴0输入是否有效
		GOTO	PZ0_HIGH
PZ0_LOW:

		BTFSS  	PORTC,JC12VIN      
        GOTO   	PZ0_JC12V_OK                    
        GOTO   	PZ0_NO_JC12V
PZ0_JC12V_OK:
		BSF		PQREG,PQ0
		GOTO	SET_PZ0             
PZ0_NO_JC12V:
		BCF		PQREG,PQ0
SET_PZ0:
		MOVF	PQREG,W
		MOVWF	PORTB
MEASURE_PZ0_PYMK:
        BSF     PZ0_FLAG,PQYC_LOAD_EN		;喷气延迟加载使能
        BCF    	PZ0_FLAG,PQYC_DELAY_EN		;清除喷气延迟使能
        INCFSZ 	PZ0_PYMK,0x1 				;喷油脉宽计数器累加
        GOTO 	EXE_PZ0_OVER
        MOVLW  	0xFF                  	;喷油计数器累加为0,
        MOVWF  	PZ0_PYMK		
		GOTO	EXE_PZ0_OVER
PZ0_HIGH:          		
        BTFSS   PZ0_FLAG,PQYC_LOAD_EN 	;判断喷气延迟加载使能
		GOTO	EXE_PZ0_PQYC			;PQYC_LOAD_EN=0,已经读取喷气延迟,执行喷气延迟
        BCF     PZ0_FLAG,PQYC_LOAD_EN

JUDGE_PZ0_STUDY_EN:
		BTFSC	REC_FLAG,STUDY_ENABLE		;判断是否学习使能
		GOTO	CAL_PZ0_REC_PYMK
		MOVLW	0x08
		MOVWF	REC_CNT
		CLRF	REC_PYMKA
		CLRF	REC_PYMKB
		CLRF	REC_PYMKC
		BCF		REC_FLAG,REC_BUSY
		GOTO	GET_PZ0_PERIOD_ADDR		
			
CAL_PZ0_REC_PYMK:
		BTFSC	REC_FLAG,REC_BUSY
		GOTO	GET_PZ0_PERIOD_ADDR
ACUMULATE_PZ0_REC_PYMK:
		CLRF	STATUS
		MOVF	PZ0_PYMK,W
		ADDWF	REC_PYMKA,0x1
		BTFSC	STATUS,C
		INCFSZ	REC_PYMKB,0x1
		GOTO	CAL_PZ0_CNT
		MOVLW	0xFF
		MOVWF	REC_PYMKB	
CAL_PZ0_CNT:
		DECFSZ	REC_CNT,0x01
		GOTO	GET_PZ0_PERIOD_ADDR
SET_PZ0_REC_PYMK_BUSY:
		BSF		REC_FLAG,REC_BUSY	;设置忙标志,等待主程序写入EEPROM
		
		RRF		REC_PYMKA,1
		RRF		REC_PYMKA,1
		RRF		REC_PYMKA,0
		ANDLW	0x1F
		MOVWF	REC_PYMKC
	
		RLF		REC_PYMKB,1
		SWAPF	REC_PYMKB,0
		ANDLW	0xE0
		IORWF	REC_PYMKC,1
REC_PZ0_INI:		
		CLRF	REC_PYMKA
		CLRF	REC_PYMKB
REC_PZ0_PYMK_OVER:
		MOVLW	0x08
		MOVWF	REC_CNT

GET_PZ0_PERIOD_ADDR:		
		MOVF	PZ0_PRIODA,W
		MOVWF	PY_PERIOD
		MOVF	PZ0_PRIODB,W
		MOVWF	PY_PERIOD1

		RRF		PZ0_PRIODA,0x1
		RRF		PZ0_PRIODA,0x1
		RRF		PZ0_PRIODA,0x0	;右移三位
		ANDLW	0x1F		
		MOVWF	PERIOD_ADDR		;得到周期低5位
		CLRF	PZ0_PRIODA

		MOVF	PZ0_PRIODB,W	;判断是否溢出	
		SUBLW	0x07
		BTFSS	STATUS,C
		GOTO	PZ0_OVFL		                      
		 
		RLF		PZ0_PRIODB,0x1
		SWAPF	PZ0_PRIODB,0x0
		ANDLW	0xE0
		IORWF	PERIOD_ADDR,0x1	;得到周期高3位
		
		MOVF	PERIOD_ADDR,W	;判断是否>0xFD
		SUBLW	0xFD
		BTFSC	STATUS,C
		GOTO	GET_PZ0_SPEED_LEVEL
PZ0_OVFL:
		MOVLW 	0xFD
		MOVWF	PERIOD_ADDR
		
GET_PZ0_SPEED_LEVEL:
		CLRF	PZ0_PRIODB
        MOVLW   0xA
        MOVWF   PCLATH
        CALL    0xA00 				;取出喷气延迟
        CLRF    PCLATH
		MOVWF	SPEED_LEVEL
		
LOAD_PZ0_PQYC:	
		BSF		PZ0_FLAG,PQYC_DELAY_EN	;使能喷气延迟
        MOVF    PZ0_PYMK,W   			;取出喷油脉宽值
        MOVWF   PYMK	       		;存储喷油脉宽值到PZTIME,由串口送出
        MOVWF	OLD_PZ0_PYMK
		CLRF	PZ0_PYMK
		
JUDGE_PZ0_PYMK_OVFL:
		MOVF	PYMK,W		
		SUBLW	0xFD
		BTFSC	STATUS,C
		GOTO	GET_PZ0_PYMK_LEVEL
		MOVLW	0xFD
		MOVWF	PYMK
GET_PZ0_PYMK_LEVEL:		
		MOVLW	0xB
		MOVWF	PCLATH
		CALL	0xB00
		CLRF	PCLATH
		MOVWF	PYMK_LEVEL		
GET_PZ0_PQYC:
		CALL	GET_PZ_PQYC	
		CLRF	PCLATH
        MOVWF   PQYC     			;保存喷气延迟到PQYC,有串口送出
		MOVWF	PZ0_PQYC				;喷气延迟保存到延迟寄存器	
EXE_PZ0_PQYC:
		BTFSS	PZ0_FLAG,PQYC_DELAY_EN	;判断喷气延迟使能
		GOTO	EXE_PZ0_OVER
		DECFSZ	PZ0_PQYC,0x1
		GOTO	EXE_PZ0_OVER
		BCF		PZ0_FLAG,PQYC_DELAY_EN
		BCF		PQREG,PQ0
		MOVF	PQREG,W
		MOVWF	PORTB		
EXE_PZ0_OVER:
		;RETURN

;===================================处理喷嘴1===================================
EXE_PZ1:	
		CLRWDT
		INCFSZ	PZ1_PRIODA,0x1                 
		GOTO 	JUDGE_PZ1
		
		INCFSZ	PZ1_PRIODB,0x1
		GOTO	JUDGE_PZ1
		MOVLW	0xFF
		MOVWF	PZ1_PRIODB
JUDGE_PZ1:
		BTFSC   PORTB,PZ1IN     	;判断喷嘴0输入是否有效
		GOTO	PZ1_HIGH
PZ1_LOW:
		BTFSS  	PORTC,JC12VIN      
        GOTO   	PZ1_JC12V_OK                    
        GOTO   	PZ1_NO_JC12V
PZ1_JC12V_OK:
		BSF		PQREG,PQ1
		GOTO	SET_PZ1             
PZ1_NO_JC12V:
		BCF		PQREG,PQ1
SET_PZ1:

		MOVF	PQREG,W
		MOVWF	PORTB
MEASURE_PZ1_PYMK:
        BSF     PZ1_FLAG,PQYC_LOAD_EN		;喷气延迟加载使能
        BCF    	PZ1_FLAG,PQYC_DELAY_EN		;清除喷气延迟使能
        INCFSZ 	PZ1_PYMK,0x1 				;喷油脉宽计数器累加
        GOTO 	EXE_PZ1_OVER
        MOVLW  	0xFF                  	;喷油计数器累加为0,
        MOVWF  	PZ1_PYMK		
		GOTO	EXE_PZ1_OVER

PZ1_HIGH:           	
        BTFSS   PZ1_FLAG,PQYC_LOAD_EN 	;判断喷气延迟加载使能
		GOTO	EXE_PZ1_PQYC			;PQYC_LOAD_EN=0,已经读取喷气延迟,执行喷气延迟	
GET_PZ1_PERIOD_ADDR:		
        BCF     PZ1_FLAG,PQYC_LOAD_EN
		MOVF	PZ1_PRIODA,W
		MOVWF	PY_PERIOD
		MOVF	PZ1_PRIODB,W
		MOVWF	PY_PERIOD1

		RRF		PZ1_PRIODA,0x1
		RRF		PZ1_PRIODA,0x1
		RRF		PZ1_PRIODA,0x0	;右移三位
		ANDLW	0x1F		
		MOVWF	PERIOD_ADDR		;得到周期低5位
		CLRF	PZ1_PRIODA

		MOVF	PZ1_PRIODB,W	;判断是否溢出	
		SUBLW	0x07
		BTFSS	STATUS,C
		GOTO	PZ1_OVFL		                      
		 
		RLF		PZ1_PRIODB,0x1
		SWAPF	PZ1_PRIODB,0x0
		ANDLW	0xE0
		IORWF	PERIOD_ADDR,0x1	;得到周期高3位
		
		MOVF	PERIOD_ADDR,W	;判断是否>0xFD
		SUBLW	0xFD
		BTFSC	STATUS,C
		GOTO	GET_PZ1_SPEED_LEVEL
PZ1_OVFL:
		MOVLW 	0xFD
		MOVWF	PERIOD_ADDR

GET_PZ1_SPEED_LEVEL:
		CLRF	PZ1_PRIODB
        MOVLW   0xA
        MOVWF   PCLATH
        CALL    0xA00 				;取出喷气延迟
        CLRF    PCLATH
		MOVWF	SPEED_LEVEL
JUDGE_PZ1_PQYC_LOAD:	
		BSF		PZ1_FLAG,PQYC_DELAY_EN	;使能喷气延迟
        MOVF    PZ1_PYMK,W   			;取出喷油脉宽值
        MOVWF   PYMK	       		;存储喷油脉宽值到PZTIME,由串口送出
		CLRF	PZ1_PYMK

JUDGE_PZ1_PYMK_OVFL:
		MOVF	PYMK,W		
		SUBLW	0xFD
		BTFSC	STATUS,C
		GOTO	GET_PZ1_PYMK_LEVEL
		MOVLW	0xFD
		MOVWF	PYMK
GET_PZ1_PYMK_LEVEL:
		MOVLW	0xB
		MOVWF	PCLATH
		CALL	0xB00
		CLRF	PCLATH
		MOVWF	PYMK_LEVEL		
GET_PZ1_PQYC:
		CALL	GET_PZ_PQYC	
		CLRF	PCLATH
        MOVWF   PQYC     			;保存喷气延迟到PQYC,有串口送出
		MOVWF	PZ1_PQYC				;喷气延迟保存到延迟寄存器		
EXE_PZ1_PQYC:
		BTFSS	PZ1_FLAG,PQYC_DELAY_EN	;判断喷气延迟使能
		GOTO	EXE_PZ1_OVER
		DECFSZ	PZ1_PQYC,0x1
		GOTO	EXE_PZ1_OVER
		BCF		PZ1_FLAG,PQYC_DELAY_EN
		BCF		PQREG,PQ1
		MOVF	PQREG,W
		MOVWF	PORTB			
EXE_PZ1_OVER:
		;RETURN
		
;===================================处理喷嘴2===================================
EXE_PZ2:
	 	CLRWDT	
		INCFSZ	PZ2_PRIODA,0x1                 
		GOTO 	JUDGE_PZ2
		
		INCFSZ	PZ2_PRIODB,0x1
		GOTO	JUDGE_PZ2
		MOVLW	0xFF
		MOVWF	PZ2_PRIODB
JUDGE_PZ2:
		BTFSC   PORTB,PZ2IN     	;判断喷嘴0输入是否有效
		GOTO	PZ2_HIGH
PZ2_LOW:
		BTFSS  	PORTC,JC12VIN      
        GOTO   	PZ2_JC12V_OK                    
        GOTO   	PZ2_NO_JC12V
PZ2_JC12V_OK:
		BSF		PQREG,PQ2
		GOTO	SET_PZ2             
PZ2_NO_JC12V:
		BCF		PQREG,PQ2
SET_PZ2:
		MOVF	PQREG,W
		MOVWF	PORTB
MEASURE_PZ2_PYMK:
        BSF     PZ2_FLAG,PQYC_LOAD_EN		;喷气延迟加载使能
        BCF    	PZ2_FLAG,PQYC_DELAY_EN		;清除喷气延迟使能
        INCFSZ 	PZ2_PYMK,0x1 				;喷油脉宽计数器累加
        GOTO 	EXE_PZ2_OVER
        MOVLW  	0xFF                  	;喷油计数器累加为0,
        MOVWF  	PZ2_PYMK		
		GOTO	EXE_PZ2_OVER

PZ2_HIGH:          		
        BTFSS   PZ2_FLAG,PQYC_LOAD_EN 	;判断喷气延迟加载使能
		GOTO	EXE_PZ2_PQYC			;PQYC_LOAD_EN=0,已经读取喷气延迟,执行喷气延迟

GET_PZ2_PERIOD_ADDR:		
        BCF     PZ2_FLAG,PQYC_LOAD_EN
		MOVF	PZ2_PRIODA,W
		MOVWF	PY_PERIOD
		MOVF	PZ2_PRIODB,W
		MOVWF	PY_PERIOD1

		RRF		PZ2_PRIODA,0x1
		RRF		PZ2_PRIODA,0x1
		RRF		PZ2_PRIODA,0x0	;右移三位
		ANDLW	0x1F		
		MOVWF	PERIOD_ADDR		;得到周期低5位
		CLRF	PZ2_PRIODA

		MOVF	PZ2_PRIODB,W	;判断是否溢出	
		SUBLW	0x07
		BTFSS	STATUS,C
		GOTO	PZ2_OVFL		                      
		 
		RLF		PZ2_PRIODB,0x1
		SWAPF	PZ2_PRIODB,0x0
		ANDLW	0xE0
		IORWF	PERIOD_ADDR,0x1	;得到周期高3位
		
		MOVF	PERIOD_ADDR,W	;判断是否>0xFD
		SUBLW	0xFD
		BTFSC	STATUS,C
		GOTO	GET_PZ2_SPEED_LEVEL
PZ2_OVFL:
		MOVLW 	0xFD
		MOVWF	PERIOD_ADDR
		
GET_PZ2_SPEED_LEVEL:
		CLRF	PZ2_PRIODB
        MOVLW   0xA
        MOVWF   PCLATH
        CALL    0xA00 				;取出喷气延迟
        CLRF    PCLATH
		MOVWF	SPEED_LEVEL
		
LOAD_PZ2_PQYC:	
		BSF		PZ2_FLAG,PQYC_DELAY_EN	;使能喷气延迟
        MOVF    PZ2_PYMK,W   			;取出喷油脉宽值
        MOVWF   PYMK	       		;存储喷油脉宽值到PZTIME,由串口送出
		CLRF	PZ2_PYMK
		
JUDGE_PZ2_PYMK_OVFL:
		MOVF	PYMK,W		
		SUBLW	0xFD
		BTFSC	STATUS,C
		GOTO	GET_PZ2_PYMK_LEVEL
		MOVLW	0xFD
		MOVWF	PYMK
		
GET_PZ2_PYMK_LEVEL:		
		MOVLW	0xB
		MOVWF	PCLATH
		CALL	0xB00
		CLRF	PCLATH
		MOVWF	PYMK_LEVEL		
GET_PZ2_PQYC:
		CALL	GET_PZ_PQYC	
		CLRF	PCLATH
        MOVWF   PQYC     			;保存喷气延迟到PQYC,有串口送出
		MOVWF	PZ2_PQYC				;喷气延迟保存到延迟寄存器	
EXE_PZ2_PQYC:
		BTFSS	PZ2_FLAG,PQYC_DELAY_EN	;判断喷气延迟使能
		GOTO	EXE_PZ2_OVER
		DECFSZ	PZ2_PQYC,0x1
		GOTO	EXE_PZ2_OVER
		BCF		PZ2_FLAG,PQYC_DELAY_EN
		BCF		PQREG,PQ2
		MOVF	PQREG,W
		MOVWF	PORTB		
		
EXE_PZ2_OVER:
		;RETURN		
;===================================处理喷嘴3===================================
EXE_PZ3:	
	 	CLRWDT
		INCFSZ	PZ3_PRIODA,0x1                 
		GOTO 	JUDGE_PZ3
		
		INCFSZ	PZ3_PRIODB,0x1
		GOTO	JUDGE_PZ3
		MOVLW	0xFF
		MOVWF	PZ3_PRIODB
JUDGE_PZ3:
		BTFSC   PORTB,PZ3IN     	;判断喷嘴0输入是否有效
		GOTO	PZ3_HIGH
PZ3_LOW:
		BTFSS  	PORTC,JC12VIN      
        GOTO   	PZ3_JC12V_OK                    
        GOTO   	PZ3_NO_JC12V

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -