📄 idreader.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 + -