📄 u2270c.asm
字号:
;*****************************************************************
;本程序用来读取慢码,并通过串口将ID号传入上位机
;工作环境:U2270B.pcb
;*****************************************************************
;define pin for AT89C2051
;-----------------------------------------------------------------
D0 bit p1.1
CFE bit p1.2
beep bit p1.4
LED1 BIT P1.6 ;双色灯(红)高电平亮
LED2 BIT P1.5 ;双色灯(绿)高电平亮
;-----------------------------------------------------------------
quhao_h data 50h
quhao_m data 51h ;QU HAO-M
quhao_l data 52h ;QU HAO-L
card_idh data 53h ;card id high bits
card_idl data 54h ;card id low bits
;-----------------------------------------------------------------
FLAG1 DATA 21H
FLAG2 DATA 22H
P_0 BIT FLAG1.0
p_1 bit flag1.1
p_2 bit flag1.2
p_3 bit flag1.3
parity_flag bit flag1.4
c_parity_flag bit flag1.5
parity_ok bit flag1.6
CHECK BIT FLAG2.0
CARDRD0 BIT FLAG2.1
ST_RD0 BIT FLAG2.2
IN0 BIT FLAG2.3
OKK BIT FLAG2.4
;------------------------------------------------------------------
ORG 0000H
LJMP START
ORG 000BH
LJMP T0_INTR
ORG 0023H
RETI
ORG 0030H
START:
MOV SP,#76H
MOV TMOD,#21H ;单片机初始化
CLR EA
setb PS
mov psw,#00h
MOV SCON,#50H ;IN MODEL1
MOV PCON,#00H
MOV TH1,#0E8H ;9600BITS/S
MOV TL1,#0E8H
setb TR1
CLR ET0
CLR TR0
CLR ST_RD0
CLR CHECK
CLR CARDRD0
CLR PARITY_FLAG
setb beep
setb led1
lcall delay_100ms
clr beep
clr led1
lcall delay_100ms
lcall delay_100ms
setb beep
setb led2
lcall delay_100ms
clr beep
clr led2
lcall delay_100ms
setb led1
SETB CFE
clr p1.0
setb p1.1
setb p1.3
setb ea
setb es
;****************************检测起始9个"1"***********************
MAIN: CLR TR0
MOV TH0,#00H
MOV TL0,#00H ;记时器初始化
mov r5,#08h
MAINL:
JNB P1.1,MAINL
JNB P1.1,MAINL
JNB P1.1,MAINL
JNB P1.1,MAINL
lcall delay_400us
JNB P1.1,MAINL
JNB P1.1,MAINL
MOV R1,#01H
;循环等待稳定低电平
MAIN0: MOV A,#00H
MOV C,P1.1
RLC A
MOV R7,A
XRL A,R1
JNZ MAINM1 ;跳变检测,等待上升沿
AJMP MAIN0
MAINM1: MOV TH0,#00H
MOV TL0,#00H
SETB TR0 ;开始记时,256us
MAINM: MOV B,R7
MOV R1,B ;R1=01H
MAIN1:
MOV A,#00H
MOV C,P1.1
RLC A
MOV R7,A
XRL A,R1
JNZ MAIN2 ;跳变检测,等待下降沿
AJMP MAIN1
MAIN2: MOV B,R7
MOV R1,B ;R1=00H
CLR TR0
mov 21h,TH0
mov 22h,TL0
MOV TH0,#00H
MOV TL0,#00H
SETB TR0
;180uS(b4)<21h,22h<400uS(190)半个周期
mov a,21h
cjne a,#00h,comp_0
mov a,22h
clr c
subb a,#0a0h
jnc right
ajmp error
comp_0:
cjne a,#01h,error
mov a,22h
clr c
subb a,#90h
jc right
error:
ljmp main
RIGHT: ;从新开始记时
MAIN5: MOV A,#00H
MOV C,P1.1
RLC A
MOV R7,A
XRL A,R1
JNZ MAIN6 ;跳变检测,检查低电平宽度
AJMP MAIN5
MAIN6: MOV B,R7
MOV R1,B
CLR TR0
mov 21h,th0
mov 22h,TL0
MOV TH0,#00H
MOV TL0,#00H
SETB TR0
;180uS(b4h)<21h,22h<400uS(190)半个周期
mov a,21h
cjne a,#00h,comp_1
mov a,22h
clr c
subb a,#0a0h
jnc right3
ajmp error1
comp_1:
cjne a,#01h,error1
mov a,22h
clr c
subb a,#90h
jc right3
error1:
ljmp main
right3: djnz r5,right4
clr tr0
ajmp loop
right4: ljmp mainM
;**************************************************************************
;ID卡数据检测程序
;**************************************************************************
LOOP:
MOV R3,#11D
MOV R0,#40H
READ1:
MOV R5,#05H
READ3:
LCALL DELAY_300US
JB P1.1,D0_0
clr C
JNB P1.1,$
AJMP READ2
D0_0: setb C
JB P1.1,$
READ2:
MOV A,@R0
RLC A
MOV @R0,A
DJNZ R5,READ3
CJNE R3,#01H,ROW1
AJMP READ4
ROW1: ;行校验
LCALL row_parity
JB parity_FLAG,read4
LJMP MAIN
READ4:INC R0
DJNZ R3,READ1
;----------------------------------------------------------------------
dec r0
mov a,@r0
rrc a
anl a,#0fh
mov @r0,a
mov r0,#40h ;进行列校验
mov r1,#30h
mov r2,#11d
column1:
mov a,@r0
mov @r1,a
inc r0
inc r1
djnz r2,column1
lcall Column_parity
jb c_parity_flag,ok_2
ljmp main
;**********************************************************************
;ID卡的卡号整理
;**********************************************************************
ok_2:
MOV R0,#40H
MOV R1,#50H
MOV R2,#05H
LOOP3:
MOV A,@R0
SWAP A
INC R0
XCHD A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP3
;*********************************************************************
;将卡号转换为ASCII码,并上传给上位机
;*********************************************************************
lcall hex_bcd
lcall send_ascii
; LCALL SEND_CARD
setb BEEP
clr led1
setb led2
LCALL DELAY_200MS
clr BEEP
clr led2
setb led1
;********************************************************************
;检测ID卡是否取走
;********************************************************************
loop1:
JNB P1.1,LOOP1
LCALL DELAY_100
JNB P1.1,LOOP1
LCALL DELAY_100
JNB P1.1,LOOP1
LCALL DELAY_100
JNB P1.1,LOOP1
LCALL DELAY_100
JNB P1.1,LOOP1
LCALL DELAY_100
JNB P1.1,LOOP1
LCALL DELAY_100
JNB P1.1,LOOP1
LJMP MAIN
;*********************************************************************
;以十进制的方式上传给上位机
;*********************************************************************
Send_CARD:
clr ea
clr es
mov r0,#50h ;61h
mov r1,#05D
loop8:
mov a,@r0
lcall byte_send
inc r0
djnz r1,loop8
setb ea
setb es
ret
;*********************************************************************
;以ASCII码的方式上传给上位机
;*********************************************************************
send_ASCII:
clr ea
clr es
mov r0,#61h
mov r1,#05d
s_a_1:
mov a,@r0
swap a
lcall hex_asc
lcall byte_send
mov a,@r0
lcall hex_asc
lcall byte_send
inc r0
djnz r1,s_a_1
mov a,#0dh
lcall byte_send
mov a,#0ah
lcall byte_send
setb ea
setb es
ret
;*********************************************************************
BYTE_SEND:
CLR TB8
MOV SBUF,A
JNB TI,$
CLR TI
RET
;---------------------------------------------------------------------
ASC_HEX:
CLR C
SUBB A,#30H
PUSH ACC
SUBB A,#0AH
JC A_H_1
POP ACC
SUBB A,#07H
ANL A,#0FH
RET
A_H_1: POP ACC
ANL A,#0FH
RET
;---------------------------------------------------------------------
HEX_ASC:
ANL A,#0FH
PUSH ACC
ADD A,#0F6H
POP ACC
JNC H_A_1
ADD A,#07H
H_A_1: ADD A,#30H
RET
;*********************************************************************
;行校验
;*********************************************************************
row_parity:
mov a,@r0
jb acc.0,row_1
clr p_2 ; PS0=0
AJMP ROW_2
ROW_1:
SETB P_2 ; PS0=1 ,A中“1”的个数为奇数
ROW_2:
rrc a
anl a,#0fh
MOV @r0,A
jb p,ROW_3
JNB P_2,OK
LJMP ERR
ROW_3:
JB P_2,OK
ERR: clr parity_flag
ret
ok: setb parity_flag
ret
;******************************************************************************
;列校验
;******************************************************************************
column_parity:
mov r6,#04h ;4 column
c_p_0:
clr c
mov r2,#08h
mov r3,#02h
mov r0,#30h
mov r1,#23h ;暂存
c_p_1:
mov a,@r0
rrc a
mov @r0,a
mov a,@r1
rlc a
mov @r1,a
inc r0
djnz r2,c_p_1
inc r1
c_p_2:
mov a,@r0
rrc a
mov @r0,a
mov a,@r1
rlc a
mov @r1,a
inc r0
djnz r3,c_p_2
c_p_3: ;进行校验
mov a,@r1
anl a,#03h
jb p,c_p_4
clr p_1
ajmp c_p_5
c_p_4: setb p_1
c_p_5: dec r1
mov a,@r1
jb p,c_p_6
jb p_1,c_p_7
clr p_3
ajmp c_p_9
c_p_6:
jb p_1,c_p_8
c_p_7: setb p_3
ajmp c_p_9
c_p_8: clr p_3
c_p_9: mov a,@r0
rrc a
mov @r0,a
jnc c_p_10
jb p_3,c_ok
ajmp c_err
c_p_10:
jb p_3,c_err
c_ok:
djnz r6,c_p_0
setb c_parity_flag
ret
c_err:
clr c_parity_flag
ret
;******************************************************************************
;添加功能:把卡号转换为十进制输出(十进制数从高到低依次存在61H,62H,63H,64H,65h)
;******************************************************************************
HEX_BCD:
mov r0,#65h
mov r7,#05h
clr a
loop5:
mov @r0,a
dec r0
djnz r7,loop5
mov r7,#32D
loop4: mov r1,#CARD_IDL ;card_idl
mov r6,#04h
clr c
loop2: mov a,@r1
rlc a
mov @r1,a
dec r1
djnz r6,loop2
mov r5,#05h
mov r0,#65h
loop6:
mov a,@r0
addc a,@r0
da a
mov @r0,a
dec r0
djnz r5,loop6
djnz r7,loop4
ret
;--------------------------------------------------------------
T0_INTR:
SETB OK
RETI
delay_180us:
mov r7,#50d
d_180: nop
nop
djnz r7,d_180
ret
DELAY_300US:
MOV R7,#85D
D_300: NOP
NOP
DJNZ R7,D_300
RET
delay_400us:
mov r7,#95d
d_400: nop
nop
djnz r7,d_400
ret
;---------------------------------------------------------------------
DELAY_1MS:
MOV R5,#230D
D_1_1: NOP
NOP
DJNZ R5,D_1_1
RET
;---------------------------------------------------------------------
DELAY_100MS:
MOV R6,#100D
D_1_3: LCALL DELAY_1MS
DJNZ R6,D_1_3
RET
delay_200ms:
mov r6,#200d
d_200: lcall delay_1ms
djnz r6,d_200
ret
DELAY_100:
MOV R5,#25D
D_20:
NOP
NOP
DJNZ R5,D_20
RET
;---------------------------------------------------------------------
DELAY_1S:
MOV R4,#10D
D_1_4: LCALL DELAY_100MS
DJNZ R4,D_1_4
RET
delay:
MOV TH0,#0FEH
MOV TL0,#0EEH
SETB ET0
SETB TR0
JB OKK,$
CLR OK
CLR ET0
CLR TR0
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -