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

📄 engine.asm

📁 发动机喷油控制程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;======================================================================================================================================
;edit by geyuanqing 20051119
;==========================================================程序流程图=============================================================
;INT_PROGRAM	:UART
;		   		:TIMER0		:>]		:JUDGE_PY0	:>TABLE			
;											:JUDGE_PY1	:>TABLE
;											:JUDGE_PY2	:>TABLE
;											:JUDGE_PY3	:>TABLE							
;							:>JUDGE_PZ_JC
;中断服务程序中调用3级子程序嵌套,主程序至多有5级嵌套
;=====================================================================
;MAINLOOP:
;		:>AD_SAMPLE
;		:>SEND_AD_VALUE		:>SEND_STATUS	:>UART_SEND
;		:>JUDGE_JC12V_PZ12V
;		:>PROCESS_UART		:>UART_RD_EEP	:RD_EEP
;							:>UART_WR_EEP	:WR_EEP
;主程序中最多嵌套3级,所有子程序和中断调用没有问题
include "headfile.h"
		ORG  	0x000
        NOP
        NOP               
        NOP
        GOTO   START
        GOTO   INT_PROG
;===================================================================================================================================
;==========================================================中断服务程序===============================================================
;===================================================================================================================================
INT_PROG:
		;保存W STATUS PC
    	MOVWF  	WSAVE
        SWAPF  	STATUS,W
        CLRF   	STATUS
        MOVWF  	STATUSSAVE
        MOVF   	PCLATH,W
        MOVWF  	PCLATHSAVE
        CLRF   	PCLATH   
		MOVF	FSR,W
		MOVWF	FSRSAVE
          
		;检测串口中断
		BTFSS	PIR1,RCIF
		GOTO 	TMR0_PROG
		BTFSC	RCSTA,FERR
		GOTO	UART_ERR
		BTFSC	RCSTA,OERR
		GOTO	UART_ERR
		;缓存串口数据,串口收数缓存在PAGE1中
		MOVF	RCREG,W
		MOVWF	UART_DATAA
		
JUDGE_UART_COMMAND:
		XORWF	OLD_COMMAND,0x0		;判断是否和旧数据相同	
		BTFSS	STATUS,Z
		GOTO	CLEAR_COMMAND_CNT

		INCFSZ	COMMAND_CNT,0x1
		GOTO	NORMAL_RECIEVE
		;累加次数溢出,判断命令
JUDGE_RD_DISEN:		
		MOVLW	0xA0
		XORWF	OLD_COMMAND,0
		BTFSS	STATUS,Z
		GOTO	JUDGE_RD_EN
		BCF		REC_FLAG,RD_EN
		GOTO	CLEAR_COMMAND_CNT
JUDGE_RD_EN:
		MOVLW  	0xA1
		XORWF	OLD_COMMAND,0
		BTFSS	STATUS,Z
		GOTO	JUDGE_WR_DISEN
		BSF		REC_FLAG,RD_EN
		GOTO	CLEAR_COMMAND_CNT
JUDGE_WR_DISEN:				
		MOVLW	0xA2
		XORWF	OLD_COMMAND,0
		BTFSS	STATUS,Z
		GOTO	JUDGE_WR_EN
		BCF		REC_FLAG,WR_EN
		GOTO	CLEAR_COMMAND_CNT		
JUDGE_WR_EN:
		MOVLW  	0xA3
		XORWF	OLD_COMMAND,0
		BTFSS	STATUS,Z
		GOTO	JUDGE_STUDY_DISEN
		BSF		REC_FLAG,WR_EN
		GOTO	CLEAR_COMMAND_CNT		
JUDGE_STUDY_DISEN:
		MOVLW	0xA4
		XORWF	OLD_COMMAND,0
		BTFSS	STATUS,Z
		GOTO	JUDGE_STUDY_EN
		BCF		REC_FLAG,STUDY_ENABLE
		GOTO	CLEAR_COMMAND_CNT		
JUDGE_STUDY_EN:
		MOVLW  	0xA5
		XORWF	OLD_COMMAND,0
		BTFSS	STATUS,Z
		GOTO	CLEAR_COMMAND_CNT
		BSF		REC_FLAG,STUDY_ENABLE
CLEAR_COMMAND_CNT:
		MOVLW	0xC0
		MOVWF	COMMAND_CNT
		MOVF	UART_DATAA,W
		MOVWF	OLD_COMMAND

NORMAL_RECIEVE:		
		SWAPF	UART_DATAA,0x0
		ANDLW	0xF
		ADDLW	UART_DATA_ADDR
		MOVWF	FSR
		MOVF	UART_DATAA,W
		MOVWF	INDF
		GOTO	TMR0_PROG
UART_ERR:
		CALL 	PAGE0
		BCF		RCSTA,FERR
		BCF		RCSTA,OERR
		CALL	INI_COM
		CALL 	PAGE0
		
TMR0_PROG:
		CLRWDT

        BTFSS  	INTCON,TMR0IF
		GOTO	INT_RECOVER		
		;MOVLW  	0x9C     			;定时器0中断,0.1mS,溢出中断,并赋初值(0xA5)
		;MOVLW	0x38
		MOVLW	0x07
        MOVWF  	TMR0
        CALL   	PJ_TIMING				;检测喷嘴输入

        DECFSZ 	TMR0A,0x1				;定时器A 25mS
        GOTO 	TMR0_OVER
        MOVLW  	0xFA
        MOVWF  	TMR0A	
        ;BSF    	TIMER_IF,SMP_EN

        DECFSZ 	TMR0B,0x1 				;定时器B 100mS
        GOTO 	TMR0_OVER   
        MOVLW  	0x10;0x4         
        MOVWF  	TMR0B
        BSF    	TIMER_IF,SMP_EN 
        BSF    	TIMER_IF,STATUS_SEN

        DECFSZ 	TMR0C,0x1  				;定时器C 1S
        GOTO 	TMR0_OVER
        MOVLW  	0x10                       
        MOVWF  	TMR0C    
        ;BSF    	TIMER_IF,SMP_EN                        
        ;BSF    	TIMER_IF,STATUS_SEN
TMR0_OVER:
        BCF    	INTCON,TMR0IF
INT_RECOVER: 	
		MOVF	FSRSAVE,W						;恢复中断前状态
		MOVWF	FSR
        BCF    	INTCON,RBIF
        MOVF   	PCLATHSAVE,W
        MOVWF  	PCLATH
        SWAPF  	STATUSSAVE,W            
        MOVWF  	STATUS           
        SWAPF  	WSAVE,0x1                    
        SWAPF  	WSAVE,W             
        RETFIE  
;===================================================================================================================================
;===============================================================主程序===============================================================
;===================================================================================================================================
START:           
        CLRF   	STATUS
        CLRF   	PCLATH	
        CALL   	INI_DATA_REG 
		CALL	INI_COM
        CALL   	INI_CNTL_REG
        CALL   	INI_LED	  		                            
        BSF    	INTCON,GIE   
		;主程序循环,完成传感器采集,状态发送,并检测控制输入,处理串口数据
MAIN_LOOP:  
		CLRWDT 
		;传感器采集
        CALL   	AD_SAMPLE
		CLRWDT
		;发送状态	         
		CALL	PAGE0
     	CALL   	SEND_AD_VALUE      
		;检测输入控制
		CLRWDT
        CALL   	JUDGE_PZ12VBIT_JC12V               
		;处理串口数据
		CALL	PAGE0
		CLRWDT
		CALL	SAVE_JYMK
		CLRWDT
		CALL	PAGE0
     	CALL	PROCESS_UART
		CALL	PAGE0
        GOTO   	MAIN_LOOP
;===================================================================================================================================
;==================================================初始LED显示,加电 灭 亮===========================================================
;===================================================================================================================================
INI_LED:
        BCF    	PORTC,LED                   
        CALL   	DELAY1
        CLRWDT    
        BSF    	PORTC,LED                 
        CALL   	DELAY1                
        CLRWDT                                              
        BCF    	PORTC,LED                      
		RETURN

DELAY1:	MOVLW  	0xFE                  
        CALL   	DELAY2 	               
        MOVLW  	0xFE                  
        CALL   	DELAY2		                
        MOVLW  	0xFE                  
        CALL   	DELAY2		                
        RETURN               
DELAY2:	
		MOVWF  	DELAY2_REGA                        
        CLRF   	DELAY2_REGB                        
DELAY2_LOOP1:
        CLRWDT                             
        DECFSZ 	DELAY2_REGB,0x1                   
        GOTO   	DELAY2_LOOP1                 
        NOP                                
        DECFSZ  DELAY2_REGA,0x1                 
        GOTO   	DELAY2_LOOP1              
		RETURN
;===================================================================================================================================
;================================================初始化数据寄存器=====================================================================
;===================================================================================================================================
INI_DATA_REG:
        CLRWDT
		CLRF   	TIMER_IF       
        CLRF   	PZREG				
        MOVLW  	0x1                
        MOVWF  	ZKYL                    
        MOVWF  	RQYL                   
        MOVWF  	QYCG                      
        MOVWF  	HYCG   
        MOVWF  	PQYC    
		MOVWF	PYMK   
        CLRF  	JCREG      	
		CLRF	UART_DATA8
		CLRF	UART_DATA9
		CLRF	UART_DATAA
		CLRF	UART_DATAB
		CLRF	UART_DATAC
		CLRF	UART_DATAD
		CLRF	UART_DATAE
		CLRF	UART_DATAF
		
		CLRF   	PQREG        
        CLRF  	PORTB           		                                               			
        CLRF    TIMER_IF   
		CLRF	PY_PERIOD     
		CALL	PAGE1
		MOVLW	0xB0
		MOVWF	FSR
		MOVLW	0x40
		MOVWF	JYMK_CNT
CLEAR_FLAG_LOOP:
		CLRF	INDF
		INCF	FSR		
		DECFSZ  JYMK_CNT,0x01
		GOTO	CLEAR_FLAG_LOOP
		CALL	PAGE0		            
        RETURN    
;====================================================================================================================================
;================================================初始化控制寄存器======================================================================
;====================================================================================================================================
INI_CNTL_REG:            
		;页面1
		CALL	PAGE1
		;定时器0:内部指令周期时钟Fosc/4,下降沿触发,有预分频 1/4,以Fosc/8=8MHz/8=1MHz计数
        BCF   	OPTION_REG,T0CS 	;inner instruction cycle     	
        BCF    	OPTION_REG,INTEDG   ;falling edlge conversion	
        BCF    	OPTION_REG,PSA      ;rescaler is assigned to the Timer0 module
        BCF    	OPTION_REG,PS2 		;Fcommandcycle/2
        BCF    	OPTION_REG,PS1   
        BCF    	OPTION_REG,PS0        
		;BSF		OPTION_REG,PS0        
    	;初始PORTA[3:0]为输入引脚,为四路A/D输入
        BSF    	TRISA,0x0		;真空压力输入
        BSF    	TRISA,0x1   	;燃气压力输入          
        BSF    	TRISA,0x2   	;前氧传感器输入                
        BSF    	TRISA,0x3   	;后氧传感器出入                         
        BSF    	TRISA,KEYIN		;钥匙12V电压输入
        BSF    	TRISA,PZ12VIN	;喷嘴12V电压输入
        ;初始化PORTB	
        BCF    	TRISB,PQ3
        BCF    	TRISB,PQ2  
        BCF    	TRISB,PQ1                           
        BCF    	TRISB,PQ0     
		BSF		TRISB,PZ0IN
		BSF		TRISB,PZ1IN
		BSF		TRISB,PZ2IN
		BSF		TRISB,PZ3IN

		;初始化PORTC
        BSF    	TRISC,RXD                 
        ;BSF    	TRISC,TXD     
		BCF		TRISC,TXD
		BSF		TRISC,PZ4IN
		BSF		TRISC,PZ5IN
;		BCF		TRISC,PQ4  
		BCF     TRISC,LED
		BSF		TRISC,QF12VIN
		BSF		TRISC,JC12VIN
		
		BSF		PIE1,RCIE  

		CALL 	PAGE0
        CLRF   	INTCON          ;禁止所有中断
        CLRF   	PIR1                       
        CLRF   	PIR1           	;清除外设中断标志两次
        
        MOVLW  	0xA5          	;计数器初始值是0xA5              
        MOVWF  	TMR0           	;90个指令周期发生一次定时器中断
    
        MOVLW  	0xFA          	;R[32]一级中断计数器,0xFA*90个指令周期中断一次
        MOVWF  	TMR0A          	;R[32]=0xFA  
            
        MOVLW  	0x4          	;R[33]2级中断计数器,0x04*0xFA*90个指令周期中断一次              
        MOVWF  	TMR0B          	;R[33]=0x04 
             
        MOVLW  	0x8           	;R[34]3级中断计数器,0x08*0x04*0xFA*90个指令周期中断一次              
        MOVWF  	TMR0C          	;R[34]=0x08
 
		CLRF	REC_FLAG
        BSF    	ADCON0,ADCS1                
        BSF    	ADCON0,ADCS0   	;AD采样时钟是内部RC振荡器  

        BSF    	INTCON,TMR0IE   ;使能TIMER0中断    
		BSF		INTCON,PEIE 
       	BSF    	INTCON,GIE      ;打开所有中断   

		CALL 	PAGE0           
        RETURN                    

;===================================================================================================================================
;================定时发送 真空压力,燃气压力,前氧传感,后氧传感,喷油脉宽,喷气延迟,喷油周期状态=====================================================
;===================================================================================================================================
SEND_AD_VALUE:
		;检测是否状态发送使能
		BTFSS  TIMER_IF,STATUS_SEN                 
		RETURN
		CLRWDT 
        BCF    TIMER_IF,STATUS_SEN
        
        ;送当前状态
        MOVLW	0x0F
        ANDWF	REC_FLAG,0
        IORLW	0xA0
		CALL	UART_SEND	
        
		BTFSS	REC_FLAG,RD_EN
		RETURN
		
	
		
   		;发送真空压力		
		MOVLW	AD_ADDR			;调入状态首地址
		MOVWF	FSR				;到文件选择寄存器
		MOVLW	0x80			;加载状态地址头
		MOVWF	CNT				;	到计数器
STATUS_LOOP:
		CLRWDT
		
		MOVF	INDF,W			;真空压力
		ANDLW	0x0F
		IORLW	0x60
		CALL	UART_SEND

		SWAPF	INDF,0x0
		ANDLW	0x0F
		IORLW	0x70
		CALL	UART_SEND

		MOVF	CNT,W
		CALL	UART_SEND

		INCF	CNT,0x1
		INCF	FSR,0x1
		MOVF	CNT,W
		XORLW	0x8E
		BTFSS	STATUS,Z
		GOTO	STATUS_LOOP
		RETURN
;===================================================================================================================================
;=============================================================串口处理程序============================================================
;======表格读命令================================================================	
;				0		0		AD7		AD6		x		x		x		x
;				0		1		AD5		AD4		AD3		AD2		AD1		AD0
;======表格写命令================================================================
;				0		0		AD7		AD6		DATA7	DATA6	DATA5	DATA4
;				1		0		AD5		AD4		AD3		AD2		AD1		AD0
;				1		1		x		x		DATA3	DATA2	DATA1	DATA0
;======表格回送字================================================================
;				0		0		AD7		AD6		DATA7	DATA6	DATA5	DATA4
;				0		1		AD5		AD4		AD3		AD2		AD1		AD0
;				1		1		0		0		DATA3	DATA2	DATA1	DATA0
;===================================================================================================================================
PROCESS_UART:
		;计算标志位
		MOVF	UART_DATA9,w
		XORLW	0x91
		BTFSS	STATUS,Z
		GOTO	JUDGE_UART_WRITE_EEP

		BTFSS	REC_FLAG,RD_EN
		RETURN
UART_READ_EEP:
		MOVLW	0xF0				;写命令无效
		MOVWF	UART_DATA9

		MOVF	UART_DATA0,W		;EEP地址低四位
		ANDLW	0x0F
		CALL	PAGE2
		MOVWF	EEADR

		CALL	PAGE0
		SWAPF	UART_DATA1,0x0		;EEP地址高四位
		ANDLW	0xF0
		CALL	PAGE2
		IORWF	EEADR,0x1
		
		CALL	PAGE0
		MOVF	UART_DATA2,W		;EEP地址最高四位
		ANDLW	0x0F
		CALL	PAGE2
		MOVWF	EEADRH
		
;		BCF    	INTCON,GIE 			;关中断

		BSF 	STATUS, RP0 		;读取EEP数据
		BSF 	EECON1, EEPGD 
		BSF 	EECON1, RD
		NOP
		NOP 
		BCF 	STATUS, RP0 ;	
;		BSF		INTCON,GIE			;开中断	

		MOVF	EEDATA,W
		ANDLW	0x0F
		IORLW	0x30
		CALL	PAGE0
		CALL 	UART_SEND

		CALL	PAGE2
		SWAPF	EEDATA,0x0
		ANDLW	0x0F
		IORLW	0x40
		CALL	PAGE0
		CALL	UART_SEND		

		MOVLW	0x91
		CALL	UART_SEND

		RETURN
;=============================================================
;=============================写串口数据到EEP===================
;=============================================================
JUDGE_UART_WRITE_EEP:
		MOVF	UART_DATA9,w
		XORLW	0x92
		BTFSS	STATUS,Z
		RETURN
		MOVLW	0x90
		MOVWF	UART_DATA9
UART_WR_EEP:
		CLRWDT
		BTFSS	REC_FLAG,WR_EN				;判断写使能
		GOTO	UART_WR_OVER

		CALL	PAGE2
		MOVF	UART_DATA0,W		;EEP地址低四位
		ANDLW	0x0F
		MOVWF	EEP_ADDRL


		SWAPF	UART_DATA1,0x0		;EEP地址高四位
		ANDLW	0xF0
		IORWF	EEP_ADDRL,0x1
		
		MOVF	EEP_ADDRL,W
		ANDLW	0xFC
		MOVWF	EEADR				
		MOVF	UART_DATA2,W		;EEP地址最高四位
		ANDLW	0x0F
		MOVWF	EEP_ADDRH
		MOVWF	EEADRH
		
		
		MOVF	UART_DATA3,W
		ANDLW	0xF
		MOVWF	EEP_DATAL
		
		SWAPF	UART_DATA4,W
		ANDLW	0xF0
		IORWF	EEP_DATAL,0x1


		MOVLW	EEP_DATAH0		;保存数据保存地址
		MOVWF	FSR

⌨️ 快捷键说明

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