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

📄 engine.asm

📁 发动机喷油控制程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
PZ3_JC12V_OK:
		BSF		PQREG,PQ3
		GOTO	SET_PZ3             
PZ3_NO_JC12V:
		BCF		PQREG,PQ3
SET_PZ3:
		MOVF	PQREG,W
		MOVWF	PORTB
MEASURE_PZ3_PYMK:
        BSF     PZ3_FLAG,PQYC_LOAD_EN		;喷气延迟加载使能
        BCF    	PZ3_FLAG,PQYC_DELAY_EN		;清除喷气延迟使能
        INCFSZ 	PZ3_PYMK,0x1 				;喷油脉宽计数器累加
        GOTO 	EXE_PZ3_OVER
        MOVLW  	0xFF                  	;喷油计数器累加为0,
        MOVWF  	PZ3_PYMK		
		GOTO	EXE_PZ3_OVER

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

GET_PZ3_PERIOD_ADDR:		
        BCF     PZ3_FLAG,PQYC_LOAD_EN
		MOVF	PZ3_PRIODA,W
		MOVWF	PY_PERIOD
		MOVF	PZ3_PRIODB,W
		MOVWF	PY_PERIOD1

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

		MOVF	PZ3_PRIODB,W	;判断是否溢出	
		SUBLW	0x07
		BTFSS	STATUS,C
		GOTO	PZ3_OVFL		                      
		 
		RLF		PZ3_PRIODB,0x1
		SWAPF	PZ3_PRIODB,0x0
		ANDLW	0xE0
		IORWF	PERIOD_ADDR,0x1	;得到周期高3位
		
		MOVF	PERIOD_ADDR,W	;判断是否>0xFD
		SUBLW	0xFD
		BTFSC	STATUS,C
		GOTO	GET_PZ3_SPEED_LEVEL
PZ3_OVFL:
		MOVLW 	0xFD
		MOVWF	PERIOD_ADDR
		
GET_PZ3_SPEED_LEVEL:
		CLRF	PZ3_PRIODB
        MOVLW   0xA
        MOVWF   PCLATH
        CALL    0xA00 				;取出喷气延迟
        CLRF    PCLATH
		MOVWF	SPEED_LEVEL
		
LOAD_PZ3_PQYC:	
		BSF		PZ3_FLAG,PQYC_DELAY_EN	;使能喷气延迟
        MOVF    PZ3_PYMK,W   			;取出喷油脉宽值
        MOVWF   PYMK	       		;存储喷油脉宽值到PZTIME,由串口送出
		CLRF	PZ3_PYMK
		
JUDGE_PZ3_PYMK_OVFL:
		MOVF	PYMK,W		
		SUBLW	0xFD
		BTFSC	STATUS,C
		GOTO	GET_PZ3_PYMK_LEVEL
		MOVLW	0xFD
		MOVWF	PYMK
		
GET_PZ3_PYMK_LEVEL:		
		MOVLW	0xB
		MOVWF	PCLATH
		CALL	0xB00
		CLRF	PCLATH
		MOVWF	PYMK_LEVEL		
GET_PZ3_PQYC:
		CALL	GET_PZ_PQYC	
		CLRF	PCLATH
        MOVWF   PQYC     			;保存喷气延迟到PQYC,有串口送出
		MOVWF	PZ3_PQYC				;喷气延迟保存到延迟寄存器	
EXE_PZ3_PQYC:
		BTFSS	PZ3_FLAG,PQYC_DELAY_EN	;判断喷气延迟使能
		GOTO	EXE_PZ3_OVER
		DECFSZ	PZ3_PQYC,0x1
		GOTO	EXE_PZ3_OVER
		BCF		PZ3_FLAG,PQYC_DELAY_EN
		BCF		PQREG,PQ3
		MOVF	PQREG,W
		MOVWF	PORTB		
EXE_PZ3_OVER:
		RETURN		
		
		
		
		
		
		
		
;===================================================================================
;======================计算速度表地址=================================================
;===================================================================================

;600		2000	7d0	fa	00
;700		1714	6b2	d6	01
;800		1500	5dc	bb  02
;900		1333	535	a6	03
;1000		1200	4b0	96	04
;1200		1000	3e3	7c	05
;1400		857		359	6b	06
;1600		750		2ee	5d
;1800		666		29a	53
;2000		600		258	4b
;2200		545		221	44
;2400		500		1f4 3e
;2600		461		1cd 39
;2800		428		1ac 35
;3000		400		190 32
;3500		342		156 2a
;4000		300		12c 25
;4500		266		10a 21
;5000		240		f0	1e
;5500		218		da	1b
;6000		200		c8	18	
;6500		184		b8	17
;7000		171		ab	15
;=====================================================================================
;===========判断 检测12V 和 喷嘴12V,没有电压就不喷气,同时熄灭LED==========================
;=====================================================================================
JUDGE_PZ12VBIT_JC12V:
		CALL	PAGE0
		CLRWDT 
        BTFSC  	PORTA,PZ12VIN       ;喷嘴12V电源有效, 应该低电平有效
        GOTO   	NO_PZ12VBIT		
        BSF    	PZREG,PZ12VBIT   
        GOTO   	JUDGE_JC12V   
NO_PZ12VBIT:
		;没有喷嘴电压,不输出喷气脉冲
		BCF    	PZREG,PZ12VBIT                  
        BCF    	PZREG,PZ0BIT           
        BCF    	PZREG,PZ1BIT            
        BCF    	PZREG,PZ2BIT                    
        BCF    	PZREG,PZ3BIT                       
JUDGE_JC12V:
		BTFSS  	PORTC,JC12VIN      
        GOTO   	JC12V_OK                    
        GOTO   	NO_JC12V
JC12V_OK:
        BSF    	JCREG,JC12VBIT   
        BSF    	PORTC,LED    
		GOTO	JUDGE_PZJC_OVER               
NO_JC12V:
		;没有检测电压,不输出喷气脉冲,喷气延迟
		BCF    	PORTC,LED     
        BCF    	PQREG,PQ0
        BCF    	PQREG,PQ1
        BCF    	PQREG,PQ2
        BCF    	PQREG,PQ3
        MOVLW  	0x1     
        MOVWF  	PQYC        
JUDGE_PZJC_OVER:
        MOVF   	PQREG,W 
        MOVWF  	PORTB   
        BCF    	JCREG,JC12VBIT 
        RETURN 
;=====================================================================================
;===============================A/D采样================================================
AD_SAMPLE: 
		;判断是否采样
		BTFSS  	TIMER_IF,SMP_EN;           
        RETURN  
    	BCF    	TIMER_IF,SMP_EN
		;开始采样
		CLRF	CNT		;采样计数器清零
		MOVLW	AD_ADDR		
		MOVWF	FSR			;间接寻址采样存储地址
		MOVLW	0x0
		MOVWF	ADCON0		;采样地址清零
SAMPLE_LOOP:
		CALL 	PAGE1
        MOVLW  	0x0                      
        MOVWF  	ADCON1       ;所有PORTA输入为模拟输入                   
		CALL	PAGE0    
		BSF		ADCON0,ADON                                
SAMPLE:
		MOVLW	0x1		
		CALL	DELAY2
	   	BSF     ADCON0,GO      
		;采样时间		
		MOVLW	0x1
		CALL 	DELAY2
SMP_OVER:
        BTFSC   ADCON0,GO 
        GOTO    SMP_OVER 
        MOVF    ADRESH,W        			;10位采样值高8位              
        MOVWF  	INDF						;存储采样值
		INCF	FSR,0x1						;存储指针递增
		MOVLW	0x8
		ADDWF	ADCON0,0x1					;采样通道递增
		INCF	CNT,0x1
		BTFSS	CNT,0x2
		GOTO	SAMPLE_LOOP 
CLOSE_AD:
		CALL	PAGE1
        MOVLW  	0x6          
        MOVWF  	ADCON1          ;所有输入都是数字输入,保护AD              
		CALL	PAGE0   
		;RETURN 
JUDGE_ZKYL_OVFL:
		MOVF	ZKYL,W
		SUBLW	0xFD
		BTFSC	STATUS,C
		GOTO	GET_ZKYL_LEVEL
		MOVLW	0xFD
		MOVWF	ZKYL
GET_ZKYL_LEVEL:
		BCF		INTCON,GIE
		MOVLW	0xF
		MOVWF	PCLATH
		;MOVF	ZKYL,W
		CALL	0xF00
		CLRF	PCLATH
		MOVWF	ZKYL_LEVEL
		BSF		INTCON,GIE
		RETURN               
;===============记忆喷油脉宽==========================================
;根据当前压力,速度读出表格中的记忆喷油脉宽值
;新喷油脉宽稳定256*16=4096转之后,置忙标志
;和表格中的喷油脉宽值比较,相差大于1.6ms,那么写入新值,否则不写
SAVE_JYMK:
		BCF		INTCON,GIE
		CALL	GET_REC_JYMK_VALUE	;根据当前压力,速度读出表格中的记忆喷油脉宽值
		CLRF	PCLATH
		MOVWF	REC_PYMK		
		BSF		INTCON,GIE
	

		BTFSS	REC_FLAG,REC_BUSY	;检测忙标志
		RETURN
		GOTO 	GET_JYMK_FLAG		
GET_JYMK_FLAG_OVER:
		BTFSC	REC_FLAG,REC_EN
		GOTO	JYMK_WR_EXIT			
		
		MOVF	REC_PYMK,W
		ANDLW	0xF0				;得到当前喷右脉宽的高四位,保存到REC_PYMK_HIGH4BIT
		MOVWF	REC_JYMK_HIGH4BIT
	
		MOVF	REC_PYMKC,W				;得到前一个喷油脉宽的高四位,存到W中		
		;GOTO 	JYMK_WR_EXIT
		
		
		ANDLW	0xF0			
		XORWF	REC_JYMK_HIGH4BIT,0x0		;比较当前喷油脉宽和前一个喷油脉宽高四位是否相同
		BTFSC	STATUS,Z
		GOTO	SAVE_JYMK_OVER
	
		BTFSS	REC_FLAG,WR_EN				;判断写使能
		GOTO	SAVE_JYMK_OVER
;得到记忆脉宽的EEP_ADDRH值
GET_JYMK_EEP_ADDRH:
		BTFSS	SPEED_LEVEL,0x4
		GOTO	GET_JYMK_EEP_ADDRH8;
		MOVLW	0x9
		MOVWF	EEP_ADDRH
		GOTO	GET_JYMK_EEP_ADDRH_OVER		
GET_JYMK_EEP_ADDRH8:
		MOVLW	0x8
		MOVWF	EEP_ADDRH
GET_JYMK_EEP_ADDRH_OVER:
;得到记忆脉宽的EEP_ADDRL值
		SWAPF	SPEED_LEVEL,0x0
		ANDLW	0xF0
		MOVWF	EEP_ADDRL
		MOVF	ZKYL_LEVEL,W
		ADDLW	0x2
		ADDWF	EEP_ADDRL,0x1
;赋值给	EEP_DATAL
		MOVF	REC_PYMKC,W
		MOVWF	EEP_DATAL
		
		
		CALL	PAGE2
						
		MOVF	EEP_ADDRL,W		;得到4地址
		ANDLW	0xFC
		MOVWF	EEADR		
				
		MOVF	EEP_ADDRH,W		;
		MOVWF	EEADRH
		

		MOVLW	EEP_DATAH0		;保存数据保存地址
		MOVWF	FSR
		
		CLRF	EEP_NUMBER
		;读出8个数据到EEP_DATAH0---EEP_DATAL3
JYMK_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	JYMK_READ_EEP_LOOP
		
JYMK_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
JYMK_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	JYMK_WRITE_EEP_LOOP
		BSF		INTCON,GIE
		CALL	PAGE0		
;======================回送更改值========================
		MOVF	REC_PYMKC,W			;真空压力
		ANDLW	0x0F
		IORLW	0x30
		CALL	UART_SEND

		SWAPF	REC_PYMKC,0x0
		ANDLW	0x0F
		IORLW	0x40
		CALL	UART_SEND
		
		MOVLW	0x93
		CALL	UART_SEND
		
JYMK_WR_EXIT:
SAVE_JYMK_OVER:
		CALL	PAGE0
		BCF		REC_FLAG,REC_BUSY
		RETURN	
                                               

PAGE0:	BCF     STATUS,RP0
		BCF 	STATUS,RP1
		RETURN

PAGE1:	BSF     STATUS,RP0
		BCF 	STATUS,RP1
		RETURN

PAGE2:	BCF     STATUS,RP0
		BSF 	STATUS,RP1
		RETURN

PAGE3:	BSF     STATUS,RP0
		BSF 	STATUS,RP1
		RETURN
INI_COM:	
		CALL	PAGE1
		MOVLW	0x20		
		MOVWF	BRG		
		BSF		TXSTA,BRGH		;HIGH SPEED
		CALL  	PAGE0
		BSF		RCSTA,SPEN		;SET SPEN
		CALL	PAGE1
		BCF		TXSTA,SYNC
		BCF		TXSTA,TX9		;8BIT TRANSMISSION
		BSF		TXSTA,TXEN	
		CALL 	PAGE0
		BSF		RCSTA,CREN		;DISABEL CONTINUOUS RECIEVE
		RETURN				

		;SET TRANSMISSION CONTROL,8BIT,AYSYN,HIGH SPEED
		CALL	PAGE1
		BSF		PORTC,0x6	;TX
		BSF		PORTC,0x7	;RX
		
		
		
		CALL  	PAGE0
		BCF		RCSTA,RX9		;8BIT RECIEVE
		BCF		RCSTA,ADDEN		;DISABLE ADDRESS DETECT,ALL BYTES ARE RECIEVED
		BCF		RCSTA,FERR
		BCF		RCSTA,OERR
		BSF		RCSTA,SPEN		;SET SPEN
		BSF		RCSTA,CREN		;DISABEL CONTINUOUS RECIEVE
		
		;BSF		RCSTA,CREN		;DISABEL CONTINUOUS RECIEVE		
		CALL	PAGE1
		;MOVLW	0xC
		;MOVLW	0x33
		;MOVLW	0x81
		MOVLW	0x20		
		MOVWF	BRG				;SET BAUD RATE 9600BPS
		BCF		TXSTA,TX9		;8BIT TRANSMISSION
		BCF		TXSTA,SYNC		;CLEAR SYNC	;ASYNCHRONOUS MODE	
		BSF		TXSTA,BRGH		;HIGH SPEED
		BSF		TXSTA,TX9D		;ALWAYS ENABLE TX9D AND 9BIT TRANSMISION FOR POSSIBLE TIMING CONFLICT
		BSF		TXSTA,TXEN	
		CALL	PAGE0
		RETURN
;==================================得到记忆标志==========================================		
GET_JYMK_FLAG:
		CLRWDT
		CALL	PAGE0
		MOVF	ZKYL_LEVEL,W			
		CALL	PAGE1
		MOVWF	ZKYL_LEVEL1						;保存压力分级
		
		CALL	PAGE0
		MOVF	SPEED_LEVEL,W
		CALL	PAGE1
		MOVWF	SPEED_LEVEL1					;保存速度分级
		
		RLF		ZKYL_LEVEL1,1
		RLF		ZKYL_LEVEL1,0
		ANDLW	0x3C
		MOVWF	JYMK_FLAG_ADDRA					;得到标志表的压力寻址值
		
		MOVLW	0x07
		ANDWF	SPEED_LEVEL1,0
		MOVWF	JYMK_FLAG_ADDRB					;得到标志位的寻址
		
		RRF		SPEED_LEVEL1,1
		RRF		SPEED_LEVEL1,1
		RRF		SPEED_LEVEL1,0
		ANDLW	0x03							;得到转速字节寻址,选定一行四个字节中的一个标志字节
		IORWF	JYMK_FLAG_ADDRA,0x1				;得到标志字节寻址
	
		MOVLW	0xB0				
		ADDWF	JYMK_FLAG_ADDRA,0x0	
		MOVWF	FSR								;得到标志字节的绝对地址,给FSR

		MOVLW	0x00
		XORWF	JYMK_FLAG_ADDRB,0
		BTFSC	STATUS,Z
		GOTO	JUDGE_FLAG0

		MOVLW	0x01
		XORWF	JYMK_FLAG_ADDRB,0
		BTFSC	STATUS,Z
		GOTO	JUDGE_FLAG1

⌨️ 快捷键说明

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