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

📄 wg34l.asm

📁 通过51单片机的I/O口模拟WG34信号
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;---------------------------------------------------------------
;		 Reader : ID Tag for TaiWan Linghang
;---------------------------------------------------------------
;	Wiegand 34 Format Out Card COde Number Byte = 4 Bytes
;===============================================================
;	I/O Line/Port Define
		Read_Speed			equ		20h
;		WDI					bit		P1.6
;		Buzer				bit		P3.5
;		RED_LED				bit		P1.0
;		GRN_LED				bit		P3.7	;
;		EEPROM_CS			bit		P1.7
;		EEPROM_SK			bit		P1.6
		EEPROM_IO			bit		P1.4
;		TxD_Enable			bit		P1.3	; RD
;		WGD0				bit		P1.2
;		WGD1				bit		P1.1
;=======================================================
    	WDI					bit		P1.7;P1.7 ;P1.6 ;long;fang
		Buzer				bit		P3.0;P1.0 ;P3.5	; No Use
		RED_LED				bit		P3.7	; Using, Have Card is Off, Normal On
		GRN_LED				bit		P1.1	; No Use
		
		EEPROM_CS			bit		P1.3
		EEPROM_SK			bit		P1.2
		EEPROM_DI			bit		P1.1
		EEPROM_DO			bit		P1.0
		
		TxD_Enable			bit		P3.5	; RD
		
		WGD0				bit		P1.1
		WGD1				bit		P1.2
		WGHD				bit		P1.4

;========
;	SRAM source table, Register define
		CardCodeNumber		equ		04h		; Define Send to Host Card Code Bytes number

		RS_RBuf				equ		3eh		; Receive buffer start address = 3eh (buffer: 3eh -> 51h)
		MAX_SERIAL_BUFFER	equ		14h
		Baud_Rate			equ		0fah	; Fosc = 22.11843MHz, Baud Rate = 9600
		Module_Type			equ		'A'		; 41h
		RS_SOH				equ		's'		;09h
		RS_EOH				equ		'n'		;0dh
		SerialBufPoint		data	52h
		RS_BCC				data	53h
		SerialFlag			data	54h
		RecFlag				data	55h
		
		HaveValidCard		data	25h
		LinkingFlag			data	3bh
		
		LoopTimes			data	29h		; Speed of Read Card parament
		LoopCounterLo		data	28h
		LoopCounterHi		data	27h		; 1000
		
		CardData_Buf		equ		2Ah		; Card Buffer : 2AH(Lowest) -> 2DH(Highest)

		Module_ID			data	08h
		AscHigh				data	0eh
		AscLow				data	0fh
		EEPROM_ADDR			data	38h
		EEPROM_DATA			data	38h
		HexCode				data	39h

;---------------------------------------------------------------
        ORG     0000H
        LJMP    Main

        ORG		0003H
        LJMP    INT0_VCT

        ORG     000BH
        LJMP    Timer0_VCT

        ORG     0013H
        LJMP    INT1_VCT

        ORG     0023H
        reti
;        LJMP    UART_VCT
;---------------------------------------------------------------

;---------------------------------------------------------------
;	Name	: CharToAscii
;	Input	: HexCode(39h)
;	Output	: AscHigh(0EH),AscLow(0FH)
;	Using	: Acc,PSW
		ORG		0026H
CharToAscii:
		MOV     A,39H
        MOV     3AH,A
        SWAP    A
        ANL     A,#0FH
        MOV     0EH,A
        CLR     C
        SUBB    A,#0AH
        JC      CharToAscii1
        MOV     A,0EH
        ADD     A,#37H
        MOV     0EH,A
        SJMP    CharToAscii2
CharToAscii1:
		MOV     A,0EH
        ADD     A,#30H
        MOV     0EH,A
CharToAscii2:
		MOV     A,39H
        MOV     3AH,A
        ANL     A,#0FH
        MOV     0FH,A
        CLR     C
        SUBB    A,#0AH
        JC      CharToAscii3
        MOV     A,0FH
        ADD     A,#37H
        MOV     0FH,A
        RET     
CharToAscii3:
		MOV     A,0FH
        ADD     A,#30H
        MOV     0FH,A
        RET     
;---------------------------------------------------------------
; 	Name	: PutStart
;	Input	: None
;	Output	: None
;	Description : Send Start Char ( SOH,Type,ID,FCMD)
PutStart:
		MOV     IE,#90H
        CLR     TR0
        SETB    TxD_Enable
        MOV     R7,#03H
        LCALL   VariableDelay
        MOV     A,#RS_SOH			; Slave ACK "SOH" Byte
        LCALL   PutChar
        MOV     53H,#00H
        MOV     A,#Module_Type		; Slave ACK Module Type
        LCALL   PutChar
        MOV     A,08h				; Slave ACK ID
        LCALL   PutChar
        MOV     A,40h				; Slave ACK FCMD
        LCALL   PutChar
        
;        MOV     R7,#03H
;        MOV     R0,#3EH
;PutStart1:
;		MOV     A,@R0
;        LCALL   PutChar
;        INC     R0
;        DJNZ    R7,PutStart1
        RET     
;---------------------------------------------------------------
; 	Name	: PutNoFCMDStart
;	Input	: None
;	Output	: None
;	Description : Send Start Char ( SOH,Type,ID, 'U' )
PutNoFCMDStart:
		MOV     IE,#90H
        CLR     TR0
        SETB    TxD_Enable
        MOV     R7,#03H
        LCALL   VariableDelay
        MOV     53H,#00H
        MOV     A,#RS_SOH			; Slave ACK "SOH" Byte
        LCALL   PutChar
        MOV     R7,#02H
        MOV     R0,#3EH
PutNoFCMDStart1:
		MOV     A,@R0
        LCALL   PutChar
        INC     R0
        DJNZ    R7,PutNoFCMDStart1
        mov		A,#'U'
        lcall	PutChar
        RET     
;---------------------------------------------------------------
;	Name	: PutHexCode
;	Input	: Bcc Code save in 39H
;	Output	: None
PutHexCode:
		LCALL   CharToAscii
        MOV     A,0EH
        LCALL   PutChar
        MOV     A,0FH
        LCALL   PutChar
        RET     
;---------------------------------------------------------------
;	Name	: PutStop
;	Input	: None
;	Output	: None
;	Description : Send ("BCCHi BCCLo EOH") to Host
PutStop:
		MOV     39H,53H
        LCALL   PutHexCode
        MOV     A,#RS_EOH
        LCALL   PutChar
        MOV     A,#0dh
        LCALL   PutChar
        MOV     R7,#03H
        LCALL   VariableDelay
        CLR     TxD_Enable
        MOV     IE,#97H
        SETB    TR0
        MOV     24H,#00H
        RET     
;---------------------------------------------------------------
Send_Error:
		lcall	PutNoFCMDStart
		mov		A,#'1'
		lcall	PutChar
		ljmp	PutEnd
;---------------------------------------------------------------
;	Name	: RemoveBcc
;	Description : Calculate BCC in Receive Operation, Remove this bcc code
;RemoveBcc:
;		DEC     52H			; Receive Data Buffer Pointer
;        MOV     A,52H
;        ADD     A,#3EH		; Receive Data Buffer Start Address
;        MOV     R0,A
;        MOV     A,@R0
;        XRL     53H,A
;        RET     
;---------------------------------------------------------------
;	Name	: CheckBCC
;	Input 	: Receive Buffer, RS_BCC
;	Output	: Acc = 0, Check OK; Acc = 1, Check Failed
;CheckBCC:
;		LCALL   RemoveBcc
;        LCALL   RemoveBcc
;        MOV     39H,53H
;        LCALL   CharToAscii
;        MOV     A,52H
;        ADD     A,#3EH
;        MOV     R0,A
;        MOV     A,@R0
;        XRL     A,0EH
;        JNZ     CheckBCC1
;        INC     52H
;        MOV     A,52H
;        ADD     A,#3EH
;        MOV     R0,A
;        MOV     A,@R0
;        XRL     A,0FH
;        JNZ     CheckBCC1
;        MOV     A,#01H
;        RET     
;CheckBCC1:
;		CLR     A
;        RET     
;---------------------------------------------------------------
;	Name	: GetSRAM
;GetSRAM:
;		lcall	PutNoFCMDStart
;		push	00h
;		push	03h
;		mov		R0,#10h
;		mov		R3,#10h
;GetSRAM1:
;		mov		A,@R0
;		MOV     39H,A
;        LCALL   PutHexCode
;		inc		R0
;		djnz	R3,GetSRAM1
;		clr		WDI
;		setb	WDI
;		mov		R0,#56h
;		mov		R3,#(64h-55h)
;GetSRAM2:
;		mov		A,@R0
;		MOV     39H,A
;        LCALL   PutHexCode
;		inc		R0
;		djnz	R3,GetSRAM2
;		pop		03h
;		pop		00h
;		lcall	PutStop
;		ret
;---------------------------------------------------------------
;	Name	: ReadFactoryCode
;	Input	: None
;	Output	: None
;	Description : Host Get This Module Factory Serial Number ACK (FCMD = 'B')
;			Slave ACK : " SOH Type ID FCMD  99001201  BCCHi BCCLo  EOH "
;							   Start        Factory         Stop
ReadFactoryCode:
		LCALL   PutStart
        MOV     R5,#09H
        push	DPL
        push	DPH
        mov		DPTR,#Factory_SNR
ReadFactoryCode1:
        CLR     A
        MOVC    A,@A+DPTR
        LCALL   PutChar
        INC		DPL
        DJNZ	R5,ReadFactoryCode1
        pop		DPH
        pop		DPL
        SJMP    PutEND
;---------------------------------------------------------------
;	Name	: CheckFactoryCode
;	Input	: Factory Code (Save in 41H - 49H)
;	Output	: Acc = 0, Check OK; or not Acc = 1, Check Failed
CheckFactoryCode:
		MOV     R7,#09H
        MOV     R1,#41H
        push	DPL
        push	DPH
        mov		DPTR,#Factory_SNR
CheckFactoryCode1:
        CLR     A
        MOVC    A,@A+DPTR
        XRL     A,@R1
        JNZ     CheckFactoryCode2
        INC     DPL
        INC     R1
        DJNZ    R7,CheckFactoryCode1
        pop		DPH
        pop		DPL
        LCALL   PutStart
        CLR     A
        ret
CheckFactoryCode2:
		pop		DPH
		pop		DPL
		RET     
;---------------------------------------------------------------
;	Name	: HostSetting_ID
;	Input	: None
;	Output	: None
HostSetting_ID:
		LCALL   CheckFactoryCode
        JNZ     HostRead_ID1
        LCALL   EEPROM_WrEnable
        MOV     38H,#00H			; ID address
        MOV     08H,4AH				; New ID
        MOV     R7,08H				; Save New ID
        LCALL   EEPROM_Byte_Write
        LCALL   EEPROM_Disable
        SJMP    PutEND
;---------------------------------------------------------------
;	Name	: HostRead_ID
;	Input	: None
;	Output	: None
HostRead_ID:
		LCALL   CheckFactoryCode
        JNZ     HostRead_ID1
        MOV     A,08H				; Put ID
        LCALL   PutChar
PutEND:
		LCALL   PutStop
HostRead_ID1:
		RET     
;---------------------------------------------------------------
;	Name	: HostGet_CardData
;	Description : if Have Card, then Send Card Data to Host
;		" SOH Type ID FCMD   CardType   Card Code   BccHi BccLo  EOH "
;			 Start 			    '0'		 4 bytes  		Stop
HostGet_CardData:
		LCALL   PutStart
        MOV     A,25H
        MOV     26H,A
        JZ      HostGet_CardData2
        MOV     A,#30H		; Tag Type is '0' [SYRIS 32 bits R/O Card]
        LCALL   PutChar		; '0'
        MOV     R5,#04H
HostGet_CardData1:
		MOV     A,R5
        ADD     A,#29H		; Card data buffer [2AH(Lowest) -> 2DH(Highest)]
        MOV     R0,A
        MOV     39H,@R0
        LCALL   PutHexCode
        DJNZ    R5,HostGet_CardData1
HostGet_CardData2:
		LCALL   PutStop
        MOV     25H,#00H
        MOV     3BH,#01H
        CLR     RED_LED
        SETB    GRN_LED
        RET     
;---------------------------------------------------------------
Init_8052:
        MOV     C,T0
        MOV     TMOD,#25H		; [Gate1 C/T M1 M0   Gate0 C/T M1 M0]
        MOV     TH1,#Baud_Rate	; Fosc = 11.0592MHz, BPS = 9600
        MOV		TL1,#Baud_Rate
        MOV     TCON,#55H		; [TF1 TR1 TF0 TR0   IE1 IT1 IE0 IT0]
        MOV     SCON,#50H		; [SM0 SM1 SM2 REN   TB8 RB8 TI RI]
        MOV     PCON,#00h		; SMOD = 0, Double Baud Rate Bit Disable
        MOV     IP,#10H			; [- - - PS   PT1 PX1 PT0 PX0]
        CLR     TxD_Enable
        CLR     EEPROM_CS
        SETB    WDI					; WatchDOG
        LCALL   GreenLed_ON
        MOV     R7,#0C8H
        LCALL   VariableDelay
        LCALL   GreenLed_ON
        CLR     WDI
		MOV     08H,#'1'		; if [Module ID Number] < 1 or [Module ID Number] > 9, Then [Module ID Number] = 1
		MOV     IE,#80H			; [EA - - ES  ET1 EX1 ET0 EX0]
		ret
;---------------------------------------------------------------
;	Main Program Start
;---------------------------------------------------------------
Main:
		MOV     SP,#64H
		setb	WGD0
		setb	WGD1			; init Wiegand DATA line
		lcall	Init_8052
        clr		A
        MOV     3BH,A			; LinkingFlag = 0
        MOV     25H,A			; CardIsValidFlag = 0
        MOV     24H,A
        MOV     09H,A
Main_Loop:
;	{  // Check LoopCounter -> [(27H)(28H)] > 1000
		MOV     R6,27H
        INC     28H
        MOV     A,28H
        JNZ     Main3
        INC     27H
        	; [(27H)(28H)] + 1
Main3:
		DEC     A				; Judge [(27H)(28H)] < 1000 ?
        SETB    C
        SUBB    A,#0E8H			;
        MOV     A,R6
        SUBB    A,#03H
        JC      Main4			;
        	; [(27H)(28H)] > 1000
        CLR     A
        MOV     27H,A
        MOV     28H,A
        	; [(27H)(28H)] = 0000
;	} // Check LoopTimes -> [(29H)] > 5 ?
        MOV     R7,29H
        INC     29H
        MOV     A,R7
        CLR     C
        SUBB    A,#05H			; (29H) > 5 ?
        JC      Main4
        	; (29H) > 5
        CLR     Buzer
;        setb	Buzer
        MOV     A,R7
        CLR     C
        SUBB    A,#Read_Speed	; Old Value (=20H), Change the Value Read Card Speed can be Fast
        JC      Main4
        	; (29H) > 20H
        CLR     A
        MOV     29H,A
        	; Clear Old Card buffer
        MOV     31H,A
        MOV     32H,A
        MOV     33H,A
        MOV     34H,A
        	; 
        MOV     35H,A
        MOV     0AH,A
Main4:
		MOV     A,24H
        JZ      Main5
        LCALL   S069C		; Check Card Code
        SJMP    SerialProc
Main5:
		MOV     A,3BH
        JZ      Main6
        MOV     A,25H
        DEC     A
        JNZ     Main6
        MOV     A,#01H
        MOV     29H,#00H
        SJMP    Main7
Main6:
		CLR     A
Main7:
		JNZ     SerialProc
        MOV     A,09H
        JZ      Main8
        MOV     24H,#01H
        SJMP    SerialProc
Main8:
		MOV     IE,#87H			; [EA - - ES   ET1 EX1 ET0 EX0]
        SETB    TR0
SerialProc:
		MOV     A,54H			; Check "SerialFlag" wasn't Valid
        JZ      Main9
        lcall	HostAccessedACK
Main9:
		SETB    WDI
        CLR     WDI
        DEC     3DH
        MOV     A,3DH
        JNZ     Main10
        DEC     3CH
        MOV     A,3CH
        JNZ     Main10
;        setb	Buzer
        CLR     Buzer			; Buzer
        MOV     A,3BH			; if LinkingFlag = 1, Then Green Led Don't Care
        JNZ     Main10
        CLR     RED_LED			; LED of RED
        SETB    GRN_LED			; LED of GRN
Main10:
		LJMP    Main_Loop
;---------------------------------------------------------------
;	Name	: HostAccessedACK
;	Description : ACK to Host
HostAccessedACK:
        ;	Receive Buffer Data Format: Type  ID  FCMD  DATA   BCCHi  BCCLo
        ;								3EH  3FH  40H   
;        LCALL   CheckBCC			; Check Bcc of Receive buffer
;        JZ      SerialProcOK

;        MOV     R7,40H			; FCMD = (40H)
;        MOV     A,3FH			; Module_ID
;        XRL     A,08H			; Isn't this Module ID Number?
;        JNZ     SerialProc3
;        MOV     A,R7
;        XRL     A,#'F'			; FCMD = 'F' ?
;        JNZ     SerialProc1
;        LCALL   HostGet_CardData
;        SJMP    SerialProcOK
;SerialProc1:
;		MOV     A,R7
;        XRL     A,#'B'			; FCMD = 'B' ?
;        JNZ     SerialProc30
;        LCALL   ReadFactoryCode
;        SJMP    SerialProcOK
;SerialProc30:
;		lcall	Send_Error
;		sjmp	SerialProcOK
;SerialProc3:
;        MOV     A,3FH			; Module_ID
;        XRL     A,#'0'			; Isn't Comm Module ID Number?
;        JNZ     SerialProcOK
;		MOV     A,R7
;        XRL     A,#'D'			; FCMD = 'D' ?
;        JNZ     SerialProc4
;        LCALL   HostRead_ID
;        SJMP    SerialProcOK
;SerialProc4:
;		MOV     A,R7
;        XRL     A,#'C'			; FCMD = 'C' ?
;        JNZ     SerialProcOK
;        LCALL   HostSetting_ID
;SerialProcOK:
		MOV     54H,#00H		; Set "SerialFlag" is Unvalid
		mov		3EH,#00h
		mov		3FH,#00h
		mov		40H,#00h
		ret
;	Timer0 Vctor Program
;---------------------------------------------------------------
Timer0_VCT:
		PUSH    ACC
        CLR     A
        MOV     TH0,A
        MOV     TL0,A
        MOV     0AH,A
        POP     ACC
        RETI    
;---------------------------------------------------------------
;---------------------------------------------------------------
INT0_VCT:

⌨️ 快捷键说明

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