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

📄 escort_95.asm

📁 通过AT89C51的串行口通讯,能够读取Escort_95系列的数字式表头的电压和电流等信号.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
			MOV	v_send,#'C'
			ACALL	SendByte
			AJMP	_HyperTerDisplay_End
			
_HyperTerDisplay_4b:	CJNE	A,#2,_HyperTerDisplay_4c
			MOV	v_send,#'u'
			ACALL	SendByte
			MOV	v_send,#'A'
			ACALL	SendByte
			MOV	v_send,#' '
			ACALL	SendByte
			MOV	v_send,#'D'
			ACALL	SendByte
			MOV	v_send,#'C'
			ACALL	SendByte
			AJMP	_HyperTerDisplay_End
			
_HyperTerDisplay_4c:	CJNE	A,#3,_HyperTerDisplay_4d
			MOV	v_send,#'m'
			ACALL	SendByte
			MOV	v_send,#'A'
			ACALL	SendByte
			MOV	v_send,#' '
			ACALL	SendByte
			MOV	v_send,#'A'
			ACALL	SendByte
			MOV	v_send,#'C'
			ACALL	SendByte
			AJMP	_HyperTerDisplay_End
			
_HyperTerDisplay_4d:	CJNE	A,#4,_HyperTerDisplay_4e
			MOV	v_send,#'m'
			ACALL	SendByte
			MOV	v_send,#'A'
			ACALL	SendByte
			MOV	v_send,#' '
			ACALL	SendByte
			MOV	v_send,#'D'
			ACALL	SendByte
			MOV	v_send,#'C'
			ACALL	SendByte
			AJMP	_HyperTerDisplay_End
			
_HyperTerDisplay_4e:	CJNE	A,#5,_HyperTerDisplay_4f
			MOV	v_send,#'V'
			ACALL	SendByte
			MOV	v_send,#' '
			ACALL	SendByte
			MOV	v_send,#'A'
			ACALL	SendByte
			MOV	v_send,#'C'
			ACALL	SendByte
			AJMP	_HyperTerDisplay_End
			
_HyperTerDisplay_4f:	CJNE	A,#6,_HyperTerDisplay_4g
			MOV	v_send,#'V'
			ACALL	SendByte
			MOV	v_send,#' '
			ACALL	SendByte
			MOV	v_send,#'D'
			ACALL	SendByte
			MOV	v_send,#'C'
			ACALL	SendByte
			AJMP	_HyperTerDisplay_End
			
_HyperTerDisplay_4g:	CJNE	A,#7,_HyperTerDisplay_4h
			MOV	v_send,#'m'
			ACALL	SendByte
			MOV	v_send,#'V'
			ACALL	SendByte
			MOV	v_send,#' '
			ACALL	SendByte
			MOV	v_send,#'A'
			ACALL	SendByte
			MOV	v_send,#'C'
			ACALL	SendByte
			AJMP	_HyperTerDisplay_End
			
_HyperTerDisplay_4h:	CJNE	A,#8,_HyperTerDisplay_End
			MOV	v_send,#'m'
			ACALL	SendByte
			MOV	v_send,#'V'
			ACALL	SendByte
			MOV	v_send,#' '
			ACALL	SendByte
			MOV	v_send,#'D'
			ACALL	SendByte
			MOV	v_send,#'C'
			ACALL	SendByte
			AJMP	_HyperTerDisplay_End
			
			
			
			
			
					
_HyperTerDisplay_End:	MOV	v_send,#13
			ACALL	SendByte
			MOV	v_send,#10
			ACALL	SendByte
			
_HyperTerDisplay_End2:	POP	7
			POP	6
			POP	5
			POP	4
			POP	3
			POP	2
			POP	0
			POP	ACC
			RET
			
			
			
			
			
			
; *************************
; ***** Maths Routine *****
; *************************

; Range Routine ( Ver 1.0 , 2003-11-28 )
;   * v_in3 , v_in4 = Lower Limit
;     v_in5 , v_in6 = Upper Limit
;
;   * around 27us
;
;   -----------[----------------------]-----------------> Number Line
;          Lower Limit            Upper Limit
Range:
			PUSH	ACC
			MOV	A,v_in1
			CJNE	A,v_in3,RangeLow
			MOV	A,v_in2
			CJNE	A,v_in4,RangeLow
RangeLow:		JC	RangeOut
			MOV	A,v_in5
			CJNE	A,v_in1,RangeHigh
			MOV	A,v_in6
			CJNE	A,v_in2,RangeHigh
RangeHigh:		JC	RangeOut

; Range Pass Function
RangeIn:		POP	ACC
			RET

; Range Fail Function
RangeOut:		SETB	v_recverr
			POP	ACC
			RET
			
			
			
			
; **************************
; ***** Serial Routine *****
; **************************

; Send String Routine
SendString:
			PUSH	ACC
			PUSH	0
			PUSH	2
			MOV	A,#0
			MOV	R2,#2
		
_SendStringStart:
			MOV	v_addr,#60H		; Start Address of the Data
			MOV	v_cnt,#7		; Number of Data
			ACALL	SerialInitial
		
			MOV	v_send,#255		; "255,1" = Start
			ACALL	SendByte
			MOV	v_send,#1
			ACALL	SendByte
			MOV	v_send,#7		; The third byte = "Number of Data"
			ACALL	SendByte
			MOV	R0,v_addr
		
_SendStringLoop:
			CJNE	@R0,#255,_SendStringOnce
			MOV	v_send,@R0		; If Data = 255 , send twice
			ACALL	SendByte
_SendStringOnce:	MOV	v_send,@R0
			ACALL	SendByte
			INC	R0
			DJNZ	v_cnt,_SendStringLoop
		
			MOV	v_send,#255		; "255,2" = End
			ACALL	SendByte
			MOV	v_send,#2
			ACALL	SendByte
		
			ACALL	ReceiveByte
			MOV	A,v_recv
			CJNE	A,#1,_SendStringError
			SJMP	_SendStringEnd
		
_SendStringError:	DJNZ	R2,_SendStringStart
		
_SendStringEnd:		POP	2
			POP	0
			POP	ACC
			RET
		       
; Serial Initial Routine : 9600 8-N-1
SerialInitial:
			PUSH	ACC
			PUSH	0
			PUSH	2
		
			CLR	IE.3			; Disable Timer 1 for Timing of Serial
			CLR	IE.4			; Disable Serial IRQ when changing the setting
			
			MOV	A,TMOD			; Timer 1 Mode 2
			SWAP	A                       ;
			MOV	R0,#2                   ;
			MOV	R2,#00000010B           ;
			XCHD	A,@R0                   ;
			SWAP	A                       ;
			MOV	TMOD,A			;
			
			;MOV	A,#00000000B		; MOV  PCON,#0XXXXXXX
			;ANL	PCON,A			;
			
			MOV	A,#10000000B		; MOV  PCON,#0XXXXXXX
			ORL	PCON,A			;
		
			MOV	TH1,#0F3H		; Timer 1 Buad Rate = 9600
			MOV	TL1,#0F3H		;
			SETB	TR1			; Start Timer 0 with no interrupt
		
			MOV	SCON,#01010000B		; Serial Mode 1 and Enable REN
			CLR	TI			; Clear Transmit Indicator
			CLR	RI			; Clear Receive Indicator
		
			CLR	v_ti
			CLR	v_ri
			MOV	v_send,#0
			MOV	v_recv,#02
		
			SETB	IE.4
		
			POP	2
			POP	0
			POP	ACC
			RET

; Send Sub Routine
SendByte:
			SETB	v_ti
			MOV	SBUF,v_send
			JB	v_ti,$
			ACALL	Delay50ms   
			RET

; Receive Sub Routine
ReceiveByte:
			CLR	v_ri
			RET

; SerialIRQ
SerialIRQ:
			JB	TI,_SerialTransmit	; I don't know is it possible for both TI and RI = 1...
			JB	RI,_SerialReceive
_SerialTransmit:
			CLR	TI
			CLR	v_ti
			RETI
_SerialReceive:
			CLR	RI
			SETB	v_ri
			MOV	v_recv,SBUF
			RETI

; Serial End
SerialEnd:
			CLR	IE.4
			CLR	TR1
			RET
			
			
			
			
			
; *******************************
; ***** MCU Initial Routine *****
; *******************************

; MCU Initial Routine ,
; 1. Clear RAM from @10H to @7FH
; 2. Initial Port 0 to Port 3
; 3. Initial all MCU Variables
MCUInitial:
			MOV	A,#0
			MOV	PSW,#0
			MOV	R0,#010H
			MOV	R2,#070H
_MCUInitialLoop:	MOV	@R0,A
			INC	R0
			DJNZ	R2,_MCUInitialLoop
			MOV	R0,#0
			MOV	R1,#0
			MOV	R2,#0
			MOV	R3,#0
			MOV	R4,#0
			MOV	R5,#0
			MOV	R6,#0
			MOV	R7,#0
			MOV	B,#0
			MOV	P0,#0FFH
			MOV	P1,#000H
			MOV	P2,#0FFH
			MOV	P3,#0FFH
			MOV	DPTR,#0
			MOV	PCON,#0
			MOV	TCON,#0
			MOV	TMOD,#0
			MOV	TL0,#0
			MOV	TL1,#0
			MOV	TH0,#0
			MOV	TH1,#0
			MOV	SCON,#0
			MOV	IE,#080H
			MOV	IP,#0
			RET

; IRQ Initial Routine
IRQInitial:
			MOV	IE,#10011111B
			NOP
			NOP
			MOV	IE,#10000000B
			RET

; RAM Clear Routine
RamClear:
			PUSH	0
			PUSH	2
			MOV	R0,#010H		; Clear RAM from 20H to 7FH (60 Bytes RAM)
			MOV	R2,#070H
_RamClearLoop:		MOV	@R0,#0
			INC	R0
			DJNZ	R2,_RamClearLoop
			POP	2
			POP	0
			RET
			
; Ext Ram Clear Routine
ExtRamClear:
			PUSH	ACC
			PUSH	DPH
			PUSH	DPL
			PUSH	2
			PUSH	3
			
			MOV	R2,#0
			MOV	R3,#0
			MOV	A,#0
			MOV	DPTR,#0
			
_ExtRamClearLoop:	MOVX	@DPTR,A
			INC	DPTR
			DJNZ	R2,_ExtRamClearLoop
			DJNZ	R3,_ExtRamClearLoop
			
			POP	3
			POP	2
			POP	DPL
			POP	DPH
			POP	ACC
			RET
			
			
; *****************************
; ***** Delay Sub-Routine *****
; *****************************

; Delay Routine Loop Structure 1 ( Delay = R2 x 2 Cycles ) :
;
;     _DelayLoop1:	DJNZ	R2,_Delay100msLoop1
;

; Delay Routine Loop Structure 2 ( Delay = R3 x 500 Cycles ) :
;
;     _DelayLoop2:	DJNZ	R2,_DelayLoop2
;			NOP
;			MOV	R2,#248
;			DJNZ	R3,_DelayLoop2
;

; Delay Routine Loop Structure 3 ( Delay = R4 x 106500 Cycles ) :
;
;     _DelayLoop3:	DJNZ	R2,DelayLoop3
;			NOP
;			MOV	R2,#254
;			DJNZ	R3,DelayLoop3
;			NOP
;			MOV	R3,#208
;			DJNZ	R4,DelayLoop3
;

; Delay50ms ( Ver 1.O , 2003-11-28 )
;   * Delay = 50ms 0us 0ns , 50000 Cycles
;   * Error = 0% 
Delay50ms:
			PUSH	2
			PUSH	3
			MOV	R2,#248
			MOV	R3,#99			; 8
_Delay50msLoop2:	DJNZ	R2,_Delay50msLoop2
			NOP
			MOV	R2,#248
			DJNZ	R3,_Delay50msLoop2	; 500 x R3 = 49500
			MOV	R2,#242			; 1
_Delay50msLoop1:	DJNZ	R2,_Delay50msLoop1	; 2 x R2 = 484
			NOP
			POP	3
			POP	2
			RET				; 7

; Delay100ms ( Ver 1.O , 2003-11-28 )
;   * Delay = 100ms 0us 0ns , 100000 Cycles
;   * Error = 0% 
Delay100ms:
			PUSH	2
			PUSH	3
			MOV	R2,#248
			MOV	R3,#199			; 8
_Delay100msLoop2:	DJNZ	R2,_Delay100msLoop2
			NOP
			MOV	R2,#248
			DJNZ	R3,_Delay100msLoop2	; 500 x R3 = 99500
			MOV	R2,#242			; 1
_Delay100msLoop1:	DJNZ	R2,_Delay100msLoop1	; 2 x R2 = 484
			NOP
			POP	3
			POP	2
			RET				; 7

; Delay200ms ( Ver 1.O , 2003-11-28 )
;   * Delay = 200ms 0us 0ns , 200000 Cycles
;   * Error = 0% 
Delay200ms:
			PUSH	2
			PUSH	3
			PUSH	4
			MOV	R2,#254
			MOV	R3,#208
			MOV	R4,#1			; 11
_Delay200msLoop3:	DJNZ	R2,_Delay200msLoop3
			NOP
			MOV	R2,#254
			DJNZ	R3,_Delay200msLoop3
			NOP
			MOV	R3,#208
			DJNZ	R4,_Delay200msLoop3	; 106500 x R4 = 106500
			MOV	R2,#248
			MOV	R3,#186			; 2
_Delay200msLoop2:	DJNZ	R2,_Delay200msLoop2
			NOP
			MOV	R2,#248
			DJNZ	R3,_Delay200msLoop2	; 500 x R3 = 93000
			MOV	R2,#239			; 1
_Delay200msLoop1:	DJNZ	R2,_Delay200msLoop1	; 2 x R2 = 478
			POP	4
			POP	3
			POP	2
			RET				; 8

; Delay300ms ( Ver 1.O , 2003-11-28 )
;   * Delay = 300ms 0us 0ns , 300000 Cycles
;   * Error = 0% 
Delay300ms:
			PUSH	2
			PUSH	3
			PUSH	4
			MOV	R2,#254
			MOV	R3,#208
			MOV	R4,#2			; 11
_Delay300msLoop3:	DJNZ	R2,_Delay300msLoop3
			NOP
			MOV	R2,#254
			DJNZ	R3,_Delay300msLoop3
			NOP
			MOV	R3,#208
			DJNZ	R4,_Delay300msLoop3	; 106500 x R4 = 213000
			MOV	R2,#248
			MOV	R3,#173			; 2
_Delay300msLoop2:	DJNZ	R2,_Delay300msLoop2
			NOP
			MOV	R2,#248
			DJNZ	R3,_Delay300msLoop2	; 500 x R3 = 86500
			MOV	R2,#239			; 1
_Delay300msLoop1:	DJNZ	R2,_Delay300msLoop1	; 2 x R2 = 478
			POP	4
			POP	3
			POP	2
			RET				; 8

; Delay1s ( Ver 1.O , 2003-11-28 )
;   * Delay = 1s 0ms 0us 0ns , 1000000 Cycles
;   * Error = 0% 
Delay1s:
			PUSH	2
			PUSH	3
			PUSH	4
			MOV	R2,#254
			MOV	R3,#208
			MOV	R4,#9			; 11
_Delay1sLoop3:		DJNZ	R2,_Delay1sLoop3
			NOP
			MOV	R2,#254
			DJNZ	R3,_Delay1sLoop3
			NOP
			MOV	R3,#208
			DJNZ	R4,_Delay1sLoop3	; 106500 x R4 = 958500
			MOV	R2,#248
			MOV	R3,#82			; 2
_Delay1sLoop2:		DJNZ	R2,_Delay1sLoop2
			NOP
			MOV	R2,#248
			DJNZ	R3,_Delay1sLoop2	; 500 x R3 = 41000
			MOV	R2,#239			; 1
_Delay1sLoop1:		DJNZ	R2,_Delay1sLoop1	; 2 x R2 = 478
			POP	4
			POP	3
			POP	2
			RET				; 8
			
			END

⌨️ 快捷键说明

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