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

📄 idreader.asm

📁 ID卡读写 (51的汇编程序)
💻 ASM
字号:
;------------------------------------------
;本方法采用一种新的方法读ID卡
;本方法对工频干扰有较好的效果
;读出数据程序

;晶振11.059 2MHz
;RF=125khz

;==========================常数定义=====================================
;TLL EQU 28H		;半周期时间基准min
;TLH EQU 41H		;半周期时间基准max
;------------------------------------------
;THL EQU 55H		;整周期时间基准min
;THH EQU 78H		;整周期时间基准max

;TLL EQU 28H		;半周期时间基准min
;TLH EQU 41H		;半周期时间基准max
;------------------------------------------
;THL EQU 55H		;整周期时间基准min
;THH EQU 80H		;整周期时间基准max

;TLL EQU 2fH		;半周期时间基准min
;TLH EQU 49H		;半周期时间基准max
;------------------------------------------
;THL EQU 5eH		;整周期时间基准min
;THH EQU 93H		;整周期时间基准max


TLL  EQU 10H
TLH  EQU 11H
THL  EQU 12H
THH  EQU 13H

;==========================缓冲区定义===================================
kBuffer   equ 40h
Buffer    EQU 50H 	;读出数据帧缓存,长度11个字节
IDBuffer  EQU 60H   ;存放ID数据,5字节
;=======================================================================

HeadOK  BIT 79H     ;数据头搜索标志
DataIn  BIT P1.2    ;数据输入端口
CFE     BIT P1.3    ;载波使能
;=======================================================================
;
;=======================================================================
	ORG 0000H
	LJMP Begin
	ORG 0050H
Begin:
	MOV	SP,#68H
	MOV	P1,#0FFH
	LCALL	InitUart

	mov   TLL,#28h
	mov   TLH,#41h
	mov   THL,#58h
	mov   THH,#88h

	
MainLoop:
	lcall	kReciveData
	LCALL	CheckOut
	JC		MainLoop
	LCALL BinToBcd

	MOV		R0,#kBuffer
	MOV		R7,#05H
	LCALL  SendData
;	SJMP	 MainLoop
CplData:
   acall  CplBuffer
	acall  CheckOut
	jc     MainLoop
	LCALL BinToBcd

	MOV		R0,#kBuffer
	MOV		R7,#05H
	LCALL  SendData
	SJMP	 MainLoop

;===================================================================
;校验\输出数据
;===================================================================

CheckOut:
	
	MOV	R0,#IDBuffer
	MOV 	R1,#kBuffer
	MOV 	R7,#05H
ChkLoop:
	MOV		A,@R1
	ANL		A,#01FH
	JB       PSW.0,ChkError   ;奇校验	
	CLR 	C
	RRC		A
	SWAP	A
	MOV		B,A
	INC		R1
	MOV		A,@R1
	ANL		A,#1FH
	JB      PSW.0,ChkError   ;奇校验	
	CLR 	C
	RRC		A
	ADD		A,B
	MOV		@R0,A
	INC		R1
	INC		R0
	DJNZ	R7,ChkLoop
;列校验		
	MOV		R0,#kBuffer
	MOV		A,@R0
	INC		R0
	MOV		R7,#0aH
VChkLoop:
	XRL		A,@R0
	INC		R0
	DJNZ	R7,VChkLoop
	ANL		A,#1EH
	JNZ		ChkError	
	
	CLR		C
	RET

ChkError:
	SETB	C
	RET	


tCheckOut:
	
	MOV	R0,#IDBuffer
	MOV 	R1,#kBuffer
	MOV 	R7,#05H
tChkLoop:
	MOV		A,@R1
	ANL		A,#01FH
	;JB       PSW.0,tChkError   ;奇校验	
	CLR 	C
	RRC		A
	SWAP	A
	MOV		B,A
	INC		R1
	MOV		A,@R1
	ANL		A,#1FH
	;JB      PSW.0,tChkError   ;奇校验	
	CLR 	C
	RRC		A
	ADD		A,B
	MOV		@R0,A
	INC		R1
	INC		R0
	DJNZ	R7,tChkLoop
;列校验		
	MOV		R0,#kBuffer
	MOV		A,@R0
	INC		R0
	MOV		R7,#0aH
tVChkLoop:
	XRL		A,@R0
	INC		R0
	DJNZ	R7,tVChkLoop
	ANL		A,#1EH
	JNZ		tChkError	
	
	CLR		C
	RET

tChkError:
	SETB	C
	RET	


;======================================================================
;串口初始化,BAUD RATE=9600
;======================================================================
InitUart:
	MOV		IE,  #00H
	MOV		TMOD,#20H
	MOV		SCON,#50H
	ORL		PCON,#080H
	MOV		TH1, #0FAH
	MOV		TL1, #0FAH
	;MOV      TH1,#0FFH
	;MOV      TL1,#0FFH
	SETB 	TR1
	RET
;======================================================================
;发送一个字节数据到串口
;======================================================================
;A=BYTE
PutChar:
	CLR		TI
	MOV		SBUF,A
	JNB		TI,$
	RET
;======================================================================
;发送数据
;======================================================================	
;R0=BUFFER POINT
;R7=COUNT
SendData:
	MOV		A,#0BBH   ;发送数据头标志
	LCALL	PutChar
SendLoop:
	MOV		A,@R0
	INC		R0
	LCALL	PutChar
	DJNZ	R7,SendLoop
	RET
;==============================================================
;自动测定TLL TLH THH THL
;
;
;==============================================================
GetCycle:
	jb      DataIn, gHigh
gLow:
   mov		dptr,#0
gLowLoop:
	inc 		dptr
	jnb		DataIn,gLowLoop
	mov 		a,dpl
	mov      r2,a
	mov      dptr,#0
gLowHighLoop:
	inc		dptr
	jb			DataIn,gLowHighLoop
	mov      a,dpl
	mov      r3,a
	sjmp     gCycle	
gHigh:
   mov		dptr,#0
gHighLoop:
	inc 		dptr
	jb			DataIn,gHighLoop
	mov 		a,dpl
	mov      r3,a	
gHighLowLoop:
	inc		dptr
	jnb		DataIn,gHighLowLoop
	mov      a,dpl
	mov      r2,a
gCycle:
	mov      a,r2
	clr      c
	subb     a,r3
 	jc       gCycle0
	cpl      a
gCycle0:
	clr      c
	subb     a,#16
	jc       GetCycle
	mov      a,r2
	add      a,r3
	mov      b,a
	add      a,#20
	jc       GetCycle
	mov      THH,a
	mov      a,b
	clr      c
	subb     a,#20
	mov      THL,a
	mov      a,b
	clr      c
	rrc      a
	mov      b,a
	add      a,#10
	mov      TLH,a
	mov      a,b
	clr      c
	subb     a,#10
	mov      TLL,a
	ret
	



;==============================================================
;接收64bit数据,存入Buffer
;
;==============================================================
kReciveData:
	;acall    GetCycle
	mov		r0,#Buffer
 	mov		r6,#08h

kNextByte:
	clr		a
	mov		@r0,a

	mov		r7,#08h

kNextBit:
	jb      DataIn, kHigh
kLow:
   mov		dptr,#0
kLowLoop:
	inc 		dptr
	jnb		DataIn,kLowLoop
	mov 		a,dpl		;IF DPL<TLL THEN research head
	;CLR C
	;subb		a,TLL

	;jc			kReciveData
	;mov		a,dpl
	clr		c
	;subb 		a,TLH
	subb     a,THL

	jnc		kLowShfitBit ;if DPL>TLH then shift bit
kLowNullLoop:
	inc		dptr
	jb			DataIn,kLowNullLoop
kLowShfitBit:
	mov		a,dpl
	clr		c
	subb		a,THL

	jc			kReciveData  ;if DPL<THL then research head
	mov		a,dpl
	clr		c
	subb		a,THH
	jnc		kReciveData  ;if DPL>THL then research head
	mov		c,DataIn
	cpl		c
	mov		a,@r0
	rlc		a
	mov		@r0,a
	djnz		r7,kNextBit
	sjmp		kSaveByte
		
kHigh:
   mov		dptr,#0
kHighLoop:
	inc 		dptr
	jb			DataIn,kHighLoop
	mov 		a,dpl		;IF DPL<TLL THEN research head
	;CLR C
	;subb		a,TLL

	;jc			kReciveData
	;mov		a,dpl
	clr		c
	;subb		a,TLH
	subb     a,THL
	jnc		kHighShfitBit ;if DPL>TLH then shift bit
kHighNullLoop:
	inc		dptr
	jnb		DataIn,kHighNullLoop
kHighShfitBit:
	mov		a,dpl
	clr		c
	subb	a,THL
	jc		kReciveData  ;if DPL<THL then research head
	mov		a,dpl
	clr		c
	subb	a,THH
	jnc		kReciveData  ;if DPL>THL then research head
	mov		c,DataIn
	cpl		c
	mov		a,@r0
	rlc		a
	mov		@r0,a
	djnz	r7,kNextBit
kSaveByte:
	inc		 r0
	djnz	 r6,kNextByte

	acall    kShiftData
	jc       kReciveData
	ret
;================================================================
;8BYTE数据循环移位
;R0=POINT
;R2=Counter
;================================================================



kRLC8Byte:
   mov      a,r0
	push     acc

kRLC8ByteLoop:
	pop      acc
	push     acc
	mov      r0,a
	mov      a,@r0
	mov      b,a
	mov      a,r0
	add      a,#7
	mov      r0,a
	mov      a,b
	rlc      a
	mov		r3,#8	
kRLC8ByteShift:
	mov      a,@r0
	rlc      a
	mov      @r0,a
	dec      r0
	djnz     r3,kRLC8ByteShift
	djnz     r2,kRLC8ByteLoop
	pop      acc
	mov      r0,a
	ret
;=============================================================
;位对齐,解出数据和校验位
;返回:解码数据仍存入BUFFER
;=============================================================


kShiftData:
	
	mov      r6,#64
kShiftDataLoopM: 
	mov      r0,#Buffer+7
	mov      a,@r0
	jb       acc.0,kShiftLoop1
	mov      r0,#buffer+1
	mov      a,@r0
	jnb      acc.7,kShiftLoop1

	dec      r0
	mov      a,@r0
	cjne     a,#0ffh,kShiftLoop1
	sjmp     kShiftTrimOK
kShiftLoop1:
	mov      r0,#Buffer
	mov      a,@r0
	rlc      a
	mov      r0,#Buffer+7
	mov		r7,#8	
kShiftDataLoop:
	mov      a,@r0
	rlc      a
	mov      @r0,a
	dec      r0
	djnz     r7,kShiftDataLoop
	djnz     r6,kShiftDataLoopM
	setb     c
	ret
kShiftTrimOK:
   mov       r0,#buffer
	mov      r2,#6
	acall    kRLC8Byte
	mov      r7,#0bh
	mov      r1,#kBuffer
kTrimFrame: 
	mov      a,@r0
	anl      a,#1fh
	mov      @r1,a
	inc      r1
	mov      r2,#5
	acall    kRLC8Byte
	djnz     r7,kTrimFrame

;	mov      r0,#kBuffer
;	mov      r1,#Buffer
;	mov      r7,#0bh
;kMoveData:
;	mov      a,@r0
;	mov      @r1,a
;	inc      r0
;	inc      r1
;	djnz     r7,kMoveData
	clr      c
	ret
;==================================================================
CplBuffer:
   mov    r0,#buffer
	mov    r7,#8
CplBufferLoop:
   mov    a,@r0
	cpl    a
	mov    @r0,a
	djnz   r7,CplBufferLoop
	acall  kShiftData
	ret


;==================================================================
;32位整数除10求余
;r0=[余数][被除数]
;结果  [余数][被除数]=[余数][商]
;==================================================================
;
Mod32By10:
	clr     a
	mov     @r0,a
	mov     a,r0
	mov     r2,a
   mov     r7,#32
	clr     F0
ModLoop:
	mov     a,r2
	add     a,#4
	mov     r0,a
	mov     r3,#5
	mov     c,F0
ModShift:
   mov     a,@r0
   rlc     a
	mov     @r0,a
	dec     r0
	djnz    r3,ModShift	
	mov     a,r2
	mov     r0,a
	mov     a,@r0
	clr     c
	subb    a,#10
	cpl     c
	mov     F0,c
	jnc     $+3
	mov     @r0,a
	djnz    r7,ModLoop
   mov     a,r2
	add     a,#4
	mov     r0,a
	mov     r3,#4
	mov     c,F0
ModShift0:
	mov     a,@r0
	rlc     a
	mov     @r0,a
	dec     r0
	djnz    r3,ModShift0
   mov     a,r2
	mov     r0,a
	mov     a,@r0
	ret
;=================================================================
;32位二进制整数转换为BCD
;R1=[1BYTE]LONG
;R0=BCD缓冲区
;=================================================================
BinToBcd:
   mov     r0,#IDBuffer
	mov     r1,#kBuffer+4
	mov     r6,#5;
BinToBcdLoop:
   acall   Mod32By10
	mov     b,a
	acall	  Mod32By10
	swap    a
	add     a,b
	mov     @r1,a
	dec     r1
	djnz    r6,BinToBcdLoop
	ret

;======================================================================		
	END

⌨️ 快捷键说明

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