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

📄 pw48akmbrf5.asm

📁 这是电动自行车控制程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
#include <P16F73.inc>
;***** VARIABLE DEFINITIONS**************************************
W_TEMP			EQU	0X20	;variable used for context saving
STATUS_TEMP		EQU	0X21	;variable used for context saving
;----------------------------------------------------------------
SPBUF			EQU	0X22	;use in ADJUST subroution
SPBUF1			EQU	0X23	;pre-buffer of speed
ADBUFSPV		EQU	0X24	;result of A/D(speed)  
;----------------------------------------------------------------
ASPD			EQU	0X25	;assist value
ASPD0			EQU	0X26	;old state of ASPD
TEMP_T3			EQU	0X27	;initial value of TIMER3
TIMER3			EQU	0X28	;sensor speed counter
T_BASE			EQU	0X29	;timer base counter
T_V_COM			EQU	0X2A	;timer base counter compare
;----------------------------------------------------------------
ROTACHAN		EQU	0X30	;rotate A/D
ADBUF36V		EQU 	0X31	;result of voltage A/D
PWMHL			EQU	0X32 
;----------------------------------------------------------------
DATAI1			EQU	0X35	;old state 
DATAI2			EQU	0X36
IBUF			EQU	0X37	;after filter
ILIMIT			EQU	0X38	;current limit
ADBUFI			EQU	0X39	;Current A/D result
;---------------------------------------------------------------
V36H			EQU	0X3A	;used in voltage display
V36M			EQU 	0X3B
V36L			EQU 	0X3C
V36UV			EQU	0X3D
;----------------------------------------------------------------
PWMSPL			EQU	0X3E	;speed limit
PWMXZ			EQU	0X3F	;PWM limit
DEAT			EQU	0X40	;used in time delay
TEMP_H			EQU	0X41	;T1H temporary buffer
TEMP_L			EQU	0X42	;T1L temporary buffer
PWM_TEMP		EQU	0X43	;the large of SPBUF and ASPD temporary buffer
PWM_TEMP0		EQU	0X44	;the old state of PWM_TEMP
PWM_LM			EQU	0X45	;PWM_TEMP low limit
PWMC			EQU	0X46	;PWM out put value
PWM_V			EQU	0X47	;under voltage process
PWMSP			EQU	0X48
PC_TEMP			EQU	0X49	;PORTC temporary value(hull singal)
PC_TEMP1		EQU	0X4A	;old state of PC_TEMP
PC_TEMP2		EQU	0X4B
TW			EQU	0X4C	;T0 counter L
TW1			EQU	0X4D	;T0 counter H
COM			EQU	0X4E	;old state of TW
COM1			EQU	0X4F	;old state of TW1
CCPR1L_TEMP		EQU	0X50
;----------------------------------------------------------------
PROPOR			EQU	0X51	
INTERG0			EQU	0X52
L_INTERG		EQU	0X53	;limit INTERG
E			EQU	0X54
Y			EQU	0X55
;----------------------------------------------------------------
D1			EQU	0X56	;used in delay
D2			EQU	0X57
D3			EQU	0X58
COUNTER1		EQU	0X59	;used in break	
COUNTER2		EQU	0X5A	;used in wl	
COUNTER3		EQU	0X5B	
COUNTER4		EQU	0X5C	
COUNTER5		EQU	0X5D
COUNTER6		EQU	0X5E
COUNTERB0		EQU	0X5F
COUNTERB1		EQU	0X60
SAMCOUNT		EQU	0X61	;convert phase	
C_FUN1			EQU	0X62	;used in function convert
COUNTERDZ		EQU	0X63
COUNTERDZ1		EQU	0X64
COU_TEMP		EQU	0X65
COU_TEMP1		EQU	0X66
COUPASE			EQU	0X67
PCOUNTER		EQU	0X68
PCOUNTER1		EQU	0X69
COUNTERBK0		EQU	0X6A
COUNTERBK1		EQU	0X6B
COUNTERREA		EQU	0X6C
;----------------------------------------------------------------
DISPR			EQU	0X6D
DAS			EQU	0	;display electric
DEL			EQU	1	;display assist
DSC			EQU	2	;display scurise
DVHH			EQU	3
DVH			EQU	4
DVM			EQU	5
DVL			EQU	6
DVU			EQU	7
;----------------------------------------------------------------
FLAG0			EQU	0X6E	;A/D and normal flag
SPV			EQU	0	;speed voltage a/d detect
V36			EQU 	1	;power voltage a/d detect
I			EQU	2	;current a/d detect
WL			EQU	3	;stabilify current flag
FI			EQU	4	;INTERG P/N flag
FY			EQU	5	;PI out P/N flag
ZD			EQU	6
SPL			EQU	7
;----------------------------------------------------------------
FLAG1			EQU	0X6F
AE			EQU 	0	;AE=1,assist;AE=0,electric
FUN			EQU 	1
FUNCON			EQU	2
FC			EQU	3
BK			EQU	4	;break flag
T_OV			EQU	5	;T_BASE	counter over flag
HX1			EQU	6
FZ			EQU	7
;----------------------------------------------------------------
FLAG2			EQU	0X70	;ALARM
ASPV			EQU	0
ABK			EQU	1
ABUTTON			EQU	2
AASSIST			EQU	3
ADZ			EQU	4
DZIN			EQU	5
RC			EQU	6 	;REA  YIN1.10	
VHC 			EQU	7	;voltage stagnant flag
;----------------------------------------------------------------
COUNTV36HN		EQU	0X71
COUNTV36MN		EQU	0X72
COUNTV36LN		EQU	0X73
COUNTV36UN		EQU	0X74
COUNTV36UL		EQU	0X75
COUNTV36UV		EQU	0X76
COUNCBK			EQU	0X77
;****************************************************************
		ORG	0X0000		; processor reset vector                                                                             
		clrf	PCLATH		; ensure page bits are cleared
  		goto	MAIN		; go to beginning of program
		nop
		goto	EOR
;****************************************************************
		ORG	0X0004		; interrupt vector location
		movwf	W_TEMP		; save W regist		
		swapf	STATUS,W	; save STATUS regist
		clrf	STATUS
		movwf	STATUS_TEMP
;----------------------------------------------------------------
;judge interrupt
		btfsc	INTCON,RBIF	;YIN1.11
		goto	INT_RB
		btfsc	INTCON,INTF
		goto	INT_SER		;goto external interrupt routing
		btfsc	INTCON,T0IF
		goto	TMR0_INT	;goto TIMER0 interrupt routing
		btfsc	PIR1,TMR1IF
		goto	TMR1_INT	;goto TIMER1 interrupt routing
		btfsc	PIR1,ADIF
		goto	AD_INT_SER	;goto A/D interrupt routing
		btfsc	PIR1,TMR2IF
		goto	TMR2_INT	;goto TIMER2 interrupt routing
EOR		bcf	STATUS,RP0
		bcf	INTCON,GIE
		movlw	0X54
		movwf	PORTB
		movlw	0XFF
		movwf	CCPR1L
		clrf	CCPR2L
		clrwdt
		goto	EOR
;****************************************************************
		org	0X30
MAIN
;****************************************************************
;initializing ports
		bsf	STATUS,RP0	;select bank 1
		movlw	0X1F		;configure RA pins direction
		movwf	TRISA		;set RA2 output,othes input
		movlw	0X81
		movwf	TRISB		;set RB0 and RB7 input,othes output
		movlw	0X39
		movwf	TRISC
		bcf	STATUS,RP0	;select bank0
		clrf	PORTA
		movlw	0X54
		movwf	PORTB
		bsf	PORTC,2
;*****************************************************************
;initializing usart
		bsf	STATUS,RP0
		movlw	0XB4
		movwf	TXSTA
		movlw	0X04
		movwf	SPBRG
		bcf	STATUS,RP0
		movlw	0XA0
		movwf	RCSTA
		movlw	0XFF
		movwf	TXREG
;****************************************************************
;initializing  interrupt
		bcf	STATUS,RP0	;select band0
		clrf    INTCON		;close all interrupt,mask INTE,RBIE
		bsf	STATUS,RP0	;select bank1
		clrf	PIE1
		clrf	PIE2
;*****************************************************************
;initializing  timer
		bsf	STATUS,RP0
		movlw	0X84		;Prescaler is assigned to the T0 and rate is 1:16
		movwf	OPTION_REG	;interrupt on rising edge of RB0 pin
		bcf	STATUS,RP0	;increment T0 when low-to-high transition on RA4 pin
		clrf	T1CON		;internal clock(Fosc/4)	
		clrf	T2CON		;T2 prescale is 1:1
		clrf	TMR1L
		clrf	TMR1H
;****************************************************************
;initializing  a/d convert
		bsf	STATUS,RP0
		movlw	0X00		;a/d port configuration	
		movwf	ADCON1		;RA0(A) RA1(A) RA2(A) RA3(A) Vref=Vdd
		bcf	STATUS,RP0
		movlw	0X81		;configuration a/d modle
		movwf	ADCON0		;Conversion clock=Fosc/32 select channel0(36V)		
		movlw	0X03
		movwf	ROTACHAN
		clrf	ADRES		;clear A/D result Reg
;*****************************************************************
;initializing  pwm
		bsf	STATUS,RP0
		movlw	0XB3		
		movwf	PR2	
		bcf	STATUS,RP0
		movlw	0X0C
		movwf	CCP1CON		;Set CCP module to PWM mode
		movwf	CCP2CON
		clrf	TMR2		;clear Timer2
		movlw	0XFF
		movwf	CCPR1L
		movwf	CCPR1H
		movwf	CCPR1L_TEMP
		clrf	CCPR2L
;*****************************************************************
;initializing regist
		bcf	STATUS,RP0
		movlw	0XA5		;YIN1.14 initializing  power voltage reference point
		movwf	V36H		;0XA5-51V	0X7B-38V
		movlw	0X9B		;0X9B-48V	0X74-36V
		movwf	V36M
		movlw	0X91		;0X91-45V	0X6D-34V	
		movwf	V36L
		movlw	0X86		;0X86-41.5V	0X64-31.5V
		movwf	V36UV
		movlw	0X4B
		movwf	PWM_LM
		movlw	0X60
		movwf	ILIMIT
		movlw	0X05
		movwf	L_INTERG
		movlw	0X02
		movwf	PCOUNTER
		movwf	PCOUNTER1
		movlw	0X0C
		movwf	COUPASE
		movlw	0X01
		movwf	COUNTERDZ
		movwf	COU_TEMP
		movlw	0X4B
		movwf	SPBUF
		movlw	0X10
		movwf	TEMP_L
		movwf	TEMP_H
		clrf	PWM_V
		clrf	FLAG0
		clrf	FLAG1
		clrf	FLAG2
		clrf	TIMER3
		clrf	ASPD
		clrf	ASPD0
		clrf	COUNTER1
		clrf	COUNTER2
		clrf	COUNTER3
		clrf	COUNTER6
		clrf	COUNTERB0
		clrf	COUNTERB1
		clrf	SAMCOUNT
		clrf	DATAI1
		clrf	COUNTERBK0
		clrf	COUNTERBK1
		clrf	COUNTERREA
		clrf	COUNTV36HN
		clrf	COUNTV36MN
		clrf	COUNTV36LN
		clrf	COUNTV36UN
		clrf	COUNTV36UL
		clrf	COUNTV36UV
		movlw	0XFF
		movwf	TXREG
		movwf	DISPR
		movlw	0XE0
		movwf   COUNCBK	
;******************************************************************
;Power on  initial detect
DETECT
		bsf	STATUS,RP0
		movlw	0X41
		movwf	PIE1		;mask T2,openT1 and A/D	
		bcf	STATUS,RP0
		bsf	INTCON,T0IE
		bsf	INTCON,PEIE
		bsf	INTCON,INTE	;open INT interrupt
		clrf	PIR1		;clear a/d flag
		clrf	PIR2		;clear a/d flag
		bcf	INTCON,T0IF
		bcf	INTCON,INTF
		bcf	INTCON,RBIF
		bsf	INTCON,GIE	;Open the globe interrupt enable
		bsf	INTCON,RBIE	;YIN1.11
		movlw	0XFF
		movwf	CCPR1L 		;PWM duty cycle register
		movwf	CCPR1H
		movlw	0X5A
		movwf	CCPR2L
		bsf	T2CON,TMR2ON	;turn on Timer2
		bsf	T1CON,TMR1ON
		call	DELAY
;****************************************************************************
BK_DETECT	btfsc	PORTC,0
		goto	BKOVER
		incf	C_FUN1
		movlw	0X30
		subwf	C_FUN1,0
		btfss	STATUS,Z
		goto	BK_DETECT
		bsf	FLAG2,ABK
BKOVER		clrf	C_FUN1
SP_DETECT	btfss	FLAG0,SPV	;Judge speed adjust voltage sample flag
		goto	$-1
		bcf	FLAG0,SPV
		movf	ADBUFSPV,0
		movwf	SPBUF1		;Read speed adjust value to SPBUF1
		movlw	0X50		;If speed voltage is high than 1.5V,than alarm
		subwf	SPBUF1,0		
		btfsc	STATUS,C
		bsf	FLAG2,ASPV
BUTTON		btfsc	PORTA,4
		goto	ASSIST
		incf	C_FUN1
		movlw	0X30
		subwf	C_FUN1,0
		btfss	STATUS,Z
		goto	BUTTON
		bsf	FLAG2,ABUTTON
ASSIST		movf	ASPD,0
		btfss	STATUS,Z
		goto	SETA
		goto	RESETA
SETA		bsf	FLAG2,AASSIST
		goto	A_OUT
RESETA		bcf	FLAG2,AASSIST
A_OUT		clrf	C_FUN1
		movf	FLAG2,0
		btfsc	STATUS,Z
		goto	START

;------------------------------------------------------------------
		movlw	0XFF
		movwf	COUNTER3
		movlw	0X10
		movwf	COUNTER4
DILVER0		movf	DISPR,0
		movwf	TXREG
SP_DISPLAY	movlw	0X4C		;If speed voltage is high than 1.5V,than alarm
		subwf	ADBUFSPV,0		
		btfsc	STATUS,C
		goto	RIGHT
		bsf	DISPR,DVH
		goto	SPOVER
RIGHT		decfsz	COUNTER2
		goto	SPOVER
		incf	SPBUF1
		btfss	STATUS,Z
		goto	SPOVER
		movf	ADBUFSPV,0
		movwf	SPBUF1		;Read speed adjust value to SPBUF1
		btfsc	DISPR,DVH
		goto	INV_DVH
		bsf	DISPR,DVH
		movf	DISPR,0
		movwf	TXREG
		goto	SPOVER
INV_DVH		bcf	DISPR,DVH
		movf	DISPR,0
		movwf	TXREG
SPOVER
;------------------------------------------------------------------
BK_DISPLAY	btfss	PORTC,0		;break detect
		goto	SETB
		btfss	DISPR,DEL
		goto	DILVER1
		goto	BT_DISPLAY
DILVER1		bsf	DISPR,DEL
		movf	DISPR,0
		movwf	TXREG
		goto	BT_DISPLAY
SETB		btfsc	DISPR,DEL
		goto	DILVER2
		goto	BT_DISPLAY
DILVER2		bcf	DISPR,DEL
		movf	DISPR,0
		movwf	TXREG
;------------------------------------------------------------------
BT_DISPLAY	btfss	PORTA,4		;button detect
		goto	SETB1
		btfss	DISPR,DSC
		goto	DILVER3
		goto	AS_DISPLAY
DILVER3		bsf	DISPR,DSC
		movf	DISPR,0
		movwf	TXREG
		goto	AS_DISPLAY
SETB1		btfsc	DISPR,DSC
		goto	DILVER4
		goto	AS_DISPLAY
DILVER4		bcf	DISPR,DSC
		movf	DISPR,0
		movwf	TXREG
;------------------------------------------------------------------
AS_DISPLAY	
;		clrwdt			;YIN1.13
		btfss	PORTB,0		;assist detect
		goto	SETB2
		btfss	DISPR,DAS
		goto	DILVER5
		goto	DLY
DILVER5		bsf	DISPR,DAS
		movf	DISPR,0
		movwf	TXREG
		goto	DLY
SETB2		btfsc	DISPR,DAS
		goto	DILVER6
		goto	DLY
DILVER6		bcf	DISPR,DAS
		movf	DISPR,0
		movwf	TXREG
DLY		decfsz	COUNTER1
		goto	SP_DISPLAY
		decfsz	COUNTER3
		goto	DILVER1
		decfsz	COUNTER4
		goto	SP_DISPLAY
;******************************************************************
START		clrf	PWMC 
		clrf	PWM_TEMP
		clrf	PWMSP
		clrf	ASPD
		clrf	ASPD0
		clrf	SAMCOUNT
		bsf	FLAG1,FZ
DIGIN0		movf	PORTC,0		;read PORTC to W
		andlw	0X38
		xorwf	PC_TEMP
		btfss	STATUS,Z
		goto	NSAME0
		movwf	PC_TEMP
		incf	SAMCOUNT
		movlw	0X03
		subwf	SAMCOUNT,0
		btfsc	STATUS,Z
		goto	FIND0
		goto	DIGIN0
NSAME0		movwf	PC_TEMP
		clrf	SAMCOUNT
		goto	DIGIN0
FIND0		movf	PC_TEMP,0
		movwf	PC_TEMP2
;******************************************************************
PRO_UV		btfss	FLAG0,V36	;Test power source sample flag
		goto	VEND				
		bcf	FLAG0,V36
;------------------------------------------------------------------
		movf	V36UV,0		;Compare now source voltage with reference voltage
		subwf	ADBUF36V,0
		btfss	STATUS,C
		goto	LNEXT1		;Now under voltage reference
		goto	LNEXT2		;Now not under voltage reference
;------------------------------------------------------------------
LNEXT1		
;		incf	COUNTV36UL	;zhj
;		clrf	COUNTV36UV	;zhj
;		movlw	0X10		;zhj
;		subwf	COUNTV36UL,0	;zhj	
;		btfss	STATUS,C	;zhj
;		goto	ZHJBZ1		;zhj
;		clrf	COUNTV36UL	;zhj
		bcf	DISPR,DVU	;Turn on under voltage LED
		bsf	DISPR,DVL
ZHJBZ1		movlw	0XB4
		subwf	PWM_V,0
		btfss	STATUS,Z	;YIN1.16	;PWM_V<0XB4
		incf	PWM_V
		goto	UVOVER
LNEXT2
;		incf	COUNTV36UV	;zhj
;		clrf	COUNTV36UL	;zhj
;		movlw	0X10		;zhj
;		subwf	COUNTV36UV,0	;zhj	
;		btfss	STATUS,C	;zhj
;		goto	ZHJBZ2		;zhj
;		clrf	COUNTV36UV	;zhj
		bsf	DISPR,DVU	;Turn off under voltage LED
		bcf	DISPR,DVL
ZHJBZ2		movf	PWM_V,0
		btfss	STATUS,Z	;PWM_V>=0
		decf	PWM_V
UVOVER
;********************************************************************************
VOLT_DISP
		movf	DISPR,0
		movwf	TXREG
		movf	V36H,0
		subwf	ADBUF36V,0
		btfss	STATUS,C
		goto	VOLMID
VOLHIG					;voltage greate then 38V
;		incf	COUNTV36HN	;zhj
;		clrf	COUNTV36MN	;zhj
;		clrf	COUNTV36LN	;zhj
;		clrf	COUNTV36UN	;zhj
;		movlw	0X10		;zhj
;		subwf	COUNTV36HN,0	;zhj	
;		btfss	STATUS,C	;zhj
;		goto	ZHJBZ3		;zhj
;		clrf	COUNTV36HN	;zhj
		bcf	DISPR,DVHH
		bcf	DISPR,DVH
		bcf	DISPR,DVM
ZHJBZ3		movlw	0XD2		;75%
		movwf	TEMP_T3
		movlw	0X1B		
		movwf	T_V_COM
		movlw	0XD0
		movwf	TEMP_H
		movlw	0X43
		movwf	TEMP_L
		goto	VEND
VOLMID					;voltage greate then 36V
	
		movf	V36M,0
		subwf	ADBUF36V,0
		btfss	STATUS,C
		goto	VOLLOW
;		incf	COUNTV36MN	;zhj
;		clrf	COUNTV36HN	;zhj
;		clrf	COUNTV36LN	;zhj
;		clrf	COUNTV36UN	;zhj
;		movlw	0X10		;zhj
;		subwf	COUNTV36MN,0	;zhj	
;		btfss	STATUS,C	;zhj
;		goto	ZHJBZ4		;zhj
;		clrf	COUNTV36MN	;zhj
		bsf	DISPR,DVHH
		bcf	DISPR,DVH
		bcf	DISPR,DVM
ZHJBZ4		movlw	0XDB		;80%
		movwf	TEMP_T3
		movlw	0X1D		
		movwf	T_V_COM
		movlw	0XD3
		movwf	TEMP_H
		movlw	0X4F
		movwf	TEMP_L
		goto	VEND
VOLLOW					;voltage greate then 34V
		movf	V36L,0
		subwf	ADBUF36V,0
		btfss	STATUS,C
		goto	UNDER
;		incf	COUNTV36LN	;zhj
;		clrf	COUNTV36HN	;zhj
;		clrf	COUNTV36MN	;zhj
;		clrf	COUNTV36UN	;zhj
;		movlw	0X10		;zhj
;		subwf	COUNTV36LN,0	;zhj	
;		btfss	STATUS,C	;zhj
;		goto	ZHJBZ5		;zhj
;		clrf	COUNTV36LN	;zhj
		bsf	DISPR,DVHH
		bsf	DISPR,DVH
		bcf	DISPR,DVM
ZHJBZ5		movlw	0XE4		;85%
		movwf	TEMP_T3
		movlw	0X1F		
		movwf	T_V_COM
		movlw	0XD5
		movwf	TEMP_H
		movlw	0XFF
		movwf	TEMP_L
		goto	VEND
UNDER					;voltage great  then 32V
;		incf	COUNTV36UN	;zhj
;		clrf	COUNTV36HN	;zhj
;		clrf	COUNTV36MN	;zhj
;		clrf	COUNTV36LN	;zhj
;		movlw	0X10		;zhj
;		subwf	COUNTV36UN,0	;zhj	
;		btfss	STATUS,C	;zhj
;		goto	ZHJBZ6		;zhj
;		clrf	COUNTV36UN	;zhj
		bsf	DISPR,DVHH
		bsf	DISPR,DVH
		bsf	DISPR,DVM
ZHJBZ6		movlw	0XE4		;85%
		movwf	TEMP_T3
		movlw	0X1F		
		movwf	T_V_COM
		movlw	0XD5
		movwf	TEMP_H
		movlw	0XFF
		movwf	TEMP_L
VEND
;*****************************************************************
BREAK
		btfss	PORTC,0		;Pull PORTC<0>,breaker
		goto	C0_LOW
C0_HIGH		movf	COUNTER1,0
		btfss	STATUS,Z
		decf	COUNTER1
		btfss	FLAG1,BK
		goto	BK_END
		movlw	0X01		;zhaojun
		addwf	COUNCBK,1 	;zhaojun
		btfsc	STATUS,C	;zhaojun
		goto	CLFLAGBK	;zhaojun 溢出
		goto	CBK_BAOCHI08	;zhaojun 管子开通占空比逐渐减小
CLFLAGBK	btfss	FLAG1,BK
		goto	BK_END
		bcf	FLAG1,BK	;COUNTER1=0,abrogate break state
		movlw	0XFF
		movwf	CCPR1L
		clrf	COUNTERBK0
		clrf	COUNTERBK1
		clrf	PWMC 		;ELECTRICIZE
		clrf	PWM_TEMP
		clrf	PWMSP		;ELECTRICIZE
		clrf	COUNTERDZ	;YIN1.13	
		bcf	FLAG2,ADZ	;YIN1.13
		movlw	0X54		;YIN1.13
		movwf	PORTB		;YIN1.13
		movlw	0XE0		;zhj
		movwf	COUNCBK		;zhj
		bcf	PORTA,5		;zhj
		goto	BK_END		;zhj
C0_LOW		movlw	0X30
		subwf	COUNTER1,0
		btfss	STATUS,Z
		goto	BNEXT2
		btfsc	FLAG1,BK
		goto	CBK
		bcf	FLAG2,ADZ

⌨️ 快捷键说明

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