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

📄 rfid.a51

📁 一个使用8051单片机开发的rfid 系统
💻 A51
📖 第 1 页 / 共 2 页
字号:
			MOV R6,#16						;NUMBER OF BYTES
			CALL READ_EEPROM
			CALL NAME1
			CALL DISP_NAME		
			AJMP GAN2

GAN6:			;check 2 card  
			MOV R1,#BYTES					;GET DATA IN BYTES(RAM)
			MOV R4,#0C0H						;MASTER ADDRESS
			MOV R6,#10						;NUMBER OF BYTES
			CALL READ_EEPROM
			CLR MAS		
			CALL COMPARE
			JNB MAS,GAN7
			MOV R1,#NAMES					;GET DATA IN BYTES(RAM)
			MOV R4,#0D0H						;MASTER ADDRESS
			MOV R6,#16						;NUMBER OF BYTES
			CALL READ_EEPROM
			CALL NAME1
			CALL DISP_NAME		
			AJMP GAN2

GAN7:			;check 2 card  
			MOV R1,#BYTES					;GET DATA IN BYTES(RAM)
			MOV R4,#0E0H						;MASTER ADDRESS
			MOV R6,#10						;NUMBER OF BYTES
			CALL READ_EEPROM
			CLR MAS		
			CALL COMPARE
			JNB MAS,GAN8
			MOV R1,#NAMES					;GET DATA IN BYTES(RAM)
			MOV R4,#0F0H						;MASTER ADDRESS
			MOV R6,#16						;NUMBER OF BYTES
			CALL READ_EEPROM
			CALL NAME1
			CALL DISP_NAME		
			AJMP GAN2

GAN8:		;check 2 card  
			MOV R1,#BYTES					;GET DATA IN BYTES(RAM)
			MOV R4,#30H						;MASTER ADDRESS
			MOV R6,#10						;NUMBER OF BYTES
			CALL READ_EEPROM
			CLR MAS		
			CALL COMPARE
			JNB MAS,GAN9
			MOV R1,#NAMES					;GET DATA IN BYTES(RAM)
			MOV R4,#40H						;MASTER ADDRESS
			MOV R6,#16						;NUMBER OF BYTES
			CALL READ_EEPROM
			CALL NAME1
			CALL DISP_NAME		
			AJMP GAN2
			
GAN9:
			CALL CARD_ERROR			
GAN2:		SETB ES 		
			CALL DELAYS
			CALL DELAYS
			AJMP TOP
			
;##########################################################
;		DISPLAY ROUTINES
;##########################################################
TITLES:
	MOV DPTR,#MSAG
	CALL LCD_MSG
	RET
MSAG:
	DB 1H,81H,'RFID Based',0C0H,'Attendance Sys',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TITLE1:
	MOV DPTR,#MSAG1
	CALL LCD_MSG
	RET
MSAG1:
	DB 1H,81H,'RFID Data:',0C0H,00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~	
DISPLAY:
	MOV DPTR,#MSAG2
	CALL LCD_MSG
	RET
MSAG2:
	DB 1H,80H,'Master Card',0C0H,'Detected...',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPLAY1:
	MOV DPTR,#MSAG3
	CALL LCD_MSG
	RET
MSAG3:
	DB 1H,80H,'Press Enter...',0C0H,'*** ADD TAG ***',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPLAY2:
	MOV DPTR,#MSAG4
	CALL LCD_MSG
	RET
MSAG4:
	DB 1H,80H,'Press Enter...',0C1H,'** EDIT TAG **',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPLAY3:
	MOV DPTR,#MSAG5
	CALL LCD_MSG
	RET
MSAG5:
	DB 1H,80H,'Please show the',0C3H,'** TAG **',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPLAY4:
	MOV DPTR,#MSAG6
	CALL LCD_MSG
	RET
MSAG6:
	DB 1H,0FH,80H,'Plz enter Name',0C0H,00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPLAY5:
	MOV DPTR,#MSAG7
	CALL LCD_MSG
	RET
MSAG7:
	DB 1H,80H,'Press enter EDIT',0C0H,00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISP1:
	MOV DPTR,#MSG1
	CALL LCD_MSG
	RET
MSG1:
	DB 1H,84H,'Keyboard',0C3H,'* Not Ok *', 00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DATE_DISP:
	MOV DPTR,#MSG2
	CALL LCD_MSG
	RET
MSG2:
	DB 1H,80H,'Enter Date',0C0H,'(01-31):',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MON_DISP:
	MOV DPTR,#MSG3
	CALL LCD_MSG
	RET
MSG3:
	DB 1H,80H,'Enter Month',0C0H,'(01-12):',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
YR_DISP:
	MOV DPTR,#MSG4
	CALL LCD_MSG
	RET
MSG4:
	DB 1H,80H,'Enter Year',0C0H,'(00-99):',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HR_DISP:
	MOV DPTR,#MSG5
	CALL LCD_MSG
	RET
MSG5:
	DB 1H,80H,'Enter Hour',0C0H,'(01-12):',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MIN_DISP:
	MOV DPTR,#MSG6
	CALL LCD_MSG
	RET
MSG6:
	DB 1H,80H,'Enter Minutes',0C0H,'(00-59):',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DAY_DISP:
	MOV DPTR,#MSG7
	CALL LCD_MSG
	RET
MSG7:
	DB 1H,80H,'Enter Day',0C0H,'(0-7):',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AMS_DISP:
	MOV DPTR,#MSG8
	CALL LCD_MSG
	RET
MSG8:
	DB 1H,80H,'Enter AM/PM',0C0H,'AM=0,PM=1:',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AM_DISP:
	MOV DPTR,#MSG9
	CALL LCD_MSG
	RET
MSG9:
	DB 1H,80H,'Enter AM/PM',0C0H,'AM=0,PM=1: AM',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PM_DISP:
	MOV DPTR,#MSG10
	CALL LCD_MSG
	RET
MSG10:
	DB 1H,80H,'Enter AM/PM',0C0H,'AM=0,PM=1: PM',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PRESS_ENTER:
	MOV DPTR,#MSG11
	CALL LCD_MSG
	RET
MSG11:
	DB 1H,82H,'Press Enter',0C4H,'to Save',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ID_SAVED:
	MOV DPTR,#MSG12
	CALL LCD_MSG
	RET
MSG12:
	DB 1H,83H,'TAG Saved',0C2H,'Sucessfully',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NAME1:
	MOV DPTR,#MSG13
	CALL LCD_MSG
	RET
MSG13:
	DB 1H,82H,'* Welcome *',0C0H,00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CARD_ERROR:
	MOV DPTR,#MSG14
	CALL LCD_MSG
	RET
MSG14:
	DB 1H,84H,'Card Not',0C3H,,'Programmed',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NO_CARD:
	MOV DPTR,#MSG15
	CALL LCD_MSG
	RET
MSG15:
	DB 1H,84H,'No card',0C3H,,'Programmed',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;			COMPARE WITH MASTER CARD
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
COMPARE:
			MOV A,BYTES
			CJNE A,BYTE,FGG
			MOV A,BYTES+1
			CJNE A,BYTE+1,FGG
			MOV A,BYTES+2
			CJNE A,BYTE+2,FGG
			MOV A,BYTES+3
			CJNE A,BYTE+3,FGG
			MOV A,BYTES+4
			CJNE A,BYTE+4,FGG
			MOV A,BYTES+5
			CJNE A,BYTE+5,FGG
			MOV A,BYTES+6
			CJNE A,BYTE+6,FGG
			MOV A,BYTES+7
			CJNE A,BYTE+7,FGG
			MOV A,BYTES+8
			CJNE A,BYTE+8,FGG
			MOV A,BYTES+9
			CJNE A,BYTE+9,FGG
			SETB MAS
FGG:		RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DELAY:
		MOV R1,#0FFH
RE1:	MOV R2,#0FFH
RE:	NOP
		DJNZ R2,RE
		DJNZ R1,RE1
		RET
;**********************************************************		
DELAYS:                       ;One second delay routine
     	MOV R0,#05H
RS3: 	MOV R1,#0FFH
RA1:	MOV R2,#0FFH
RS2:	NOP
		DJNZ R2,RS2
		DJNZ R1,RA1  
		DJNZ R0,RS3  
  RET
;---------==========----------==========---------=========---------
SERIAL:		
		PUSH   PSW           ; save current registerset
	 	MOV    PSW,#RB1
      PUSH   ACC
		JB TI,TRANS
		MOV A,SBUF
		CJNE A,#0AH,DOWNW
		MOV COUNTER,#01H 
		AJMP DDWN
DOWNW:CJNE A,#0DH,DOWN2 
		MOV COUNTER,#01H 
		AJMP DDWN		
DOWN2:
		MOV R1,COUNTER
		CJNE R1,#01H,YH1
		MOV BYTE,A
		AJMP DOWN1
YH1:	CJNE R1,#02H,YH2
		MOV BYTE+1,A
		AJMP DOWN1
YH2:	CJNE R1,#03H,YH3
		MOV BYTE+2,A
		AJMP DOWN1
YH3:	CJNE R1,#04H,YH4
		MOV BYTE+3,A
		AJMP DOWN1
YH4:	CJNE R1,#05H,YH5
		MOV BYTE+4,A
		AJMP DOWN1
YH5:	CJNE R1,#06H,YH6
		MOV BYTE+5,A
		AJMP DOWN1
YH6:	CJNE R1,#07H,YH7
		MOV BYTE+6,A
		AJMP DOWN1
YH7:	CJNE R1,#08H,YH8
		MOV BYTE+7,A
		AJMP DOWN1
YH8:	CJNE R1,#09H,YH9
		MOV BYTE+8,A
		AJMP DOWN1
YH9:	CJNE R1,#0AH,DOWN1
		MOV BYTE+9,A
		SETB RECEIVED
		AJMP DOWN1
DOWN1:INC COUNTER

DDWN:	CLR RI
		POP    ACC
   	POP    PSW 
		RETI
		
TRANS: CLR TI
		POP    ACC
   	POP    PSW 
		RETI
;**********************************************************
; INITIALIZE THE LCD 4-BIT MODE                                                                                   
;**********************************************************
INITLCD4:
         CLR         LCD_RS     ; LCD REGISTER SELECT LINE
         CLR         LCD_E      ; ENABLE LINE
         MOV         R4, #CONFIG; FUNCTION SET - DATA BITS,
                                ; LINES, FONTS
         CALL       WRLCDCOM4
         MOV         R4, #ONDSP ; DISPLAY ON
         CALL       WRLCDCOM4
         MOV         R4, #ENTRYMODE ; SET ENTRY MODE
         CALL       WRLCDCOM4  ; INCREMENT CURSOR RIGHT, NO SHIFT
         MOV         R4, #CLRDSP; CLEAR DISPLAY, HOME CURSOR
         CALL       WRLCDCOM4
         RET


; **********************************************************
; SOFTWARE VERSION OF THE POWER ON RESET
; **********************************************************
RESETLCD4:
         CLR         LCD_RS     ; LCD REGISTER SELECT LINE
         CLR         LCD_E      ; ENABLE LINE
         CLR         LCD_DB7    ; SET BIT PATTERN FOR...
         CLR         LCD_DB6    ; ... POWER-ON-RESET
         SETB        LCD_DB5
         SETB        LCD_DB4
         SETB        LCD_E      ; START ENABLE PULSE
         CLR         LCD_E      ; END ENABLE PULSE
         MOV         A, #4      ; DELAY 4 MILLISECONDS
         CALL       MDELAY
         SETB        LCD_E      ; START ENABLE PULSE
         CLR         LCD_E      ; END ENABLE PULSE
         MOV         A, #1      ; DELAY 1 MILLISECOND
         CALL       MDELAY
         SETB        LCD_E      ; START ENABLE PULSE
         CLR         LCD_E      ; END ENABLE PULSE
         MOV         A, #1      ; DELAY 1 MILLISECOND
         CALL       MDELAY
         CLR         LCD_DB4    ; SPECIFY 4-BIT OPERATION
         SETB        LCD_E      ; START ENABLE PULSE
         CLR         LCD_E      ; END ENABLE PULSE
         MOV         A, #1      ; DELAY 1 MILLISECOND
         CALL       MDELAY
         MOV         R4, #CONFIG; FUNCTION SET
         CALL       WRLCDCOM4
         MOV         R4, #08H   ; DISPLAY OFF
         CALL       WRLCDCOM4
         MOV         R4, #1     ; CLEAR DISPLAY, HOME CURSOR
         CALL       WRLCDCOM4
         MOV         R4,#ENTRYMODE  ; SET ENTRY MODE
         ACALL       WRLCDCOM4
 	   JMP INITLCD4

; **********************************************************
; SUB WRITES A COMMAND WORD TO THE LCD
; COMMAND MUST BE PLACED IN R4 BY CALLING PROGRAM
; **********************************************************
WRLCDCOM4:
         CLR         LCD_E
         CLR         LCD_RS     ; SELECT SEND COMMAND
         PUSH        ACC        ; SAVE ACCUMULATOR
         MOV         A, R4      ; PUT DATA BYTE IN ACC
         MOV         C, ACC.4   ; LOAD HIGH NIBBLE ON DATA BUS
         MOV         LCD_DB4, C ; ONE BIT AT A TIME USING...
         MOV         C, ACC.5   ; BIT MOVE OPERATOINS
         MOV         LCD_DB5, C
         MOV         C, ACC.6
         MOV         LCD_DB6, C
         MOV         C, ACC.7
         MOV         LCD_DB7, C
         SETB        LCD_E      ; PULSE THE ENABLE LINE
         CLR         LCD_E
         MOV         C, ACC.0   ; SIMILARLY, LOAD LOW NIBBLE
         MOV         LCD_DB4, C
         MOV         C, ACC.1
         MOV         LCD_DB5, C
         MOV         C, ACC.2
         MOV         LCD_DB6, C
         MOV         C, ACC.3
         MOV         LCD_DB7, C
         CLR         LCD_E
         SETB        LCD_E      ; PULSE THE ENABLE LINE
         CLR         LCD_E
         CALL MADELAY
         POP         ACC
         RET
; **********************************************************
; SUB TO WRITE A DATA WORD TO THE LCD
; DATA MUST BE PLACED IN R4 BY CALLING PROGRAM
; **********************************************************
WRLCDDATA:
         CLR         LCD_E
         SETB        LCD_RS     ; SELECT SEND DATA
             PUSH        ACC        ; SAVE ACCUMULATOR
         MOV         A, R4      ; PUT DATA BYTE IN ACC
         MOV         C, ACC.4   ; LOAD HIGH NIBBLE ON DATA BUS
         MOV         LCD_DB4, C ; ONE BIT AT A TIME USING...
         MOV         C, ACC.5   ; BIT MOVE OPERATOINS
         MOV         LCD_DB5, C
         MOV         C, ACC.6
         MOV         LCD_DB6, C
         MOV         C, ACC.7
         MOV         LCD_DB7, C
         SETB        LCD_E      ; PULSE THE ENABLE LINE
         CLR         LCD_E
         MOV         C, ACC.0   ; SIMILARLY, LOAD LOW NIBBLE
         MOV         LCD_DB4, C
         MOV         C, ACC.1
         MOV         LCD_DB5, C
         MOV         C, ACC.2
         MOV         LCD_DB6, C
         MOV         C, ACC.3
         MOV         LCD_DB7, C
         CLR         LCD_E
         SETB        LCD_E      ; PULSE THE ENABLE LINE
         CLR         LCD_E
         NOP
         NOP
         POP         ACC
         RET

; **********************************************************
; SUB TAKES THE STRING IMMEDIATELY FOLLOWING THE CALL AND
; DISPLAYS ON THE LCD. STRING MUST BE TERMINATED WITH A
; NULL (0).
; **********************************************************
LCD_MSG:
	CLR A			; Clear Index 
	MOVC A,@A+DPTR		; Get byte pointed by Dptr 
	INC DPTR			; Point to the next byte 
	JZ LCD_Msg9		; Return if found the zero (end of stringz) 
        CJNE A,#001H,Lcd_Msg1	; Check if is a Clear Command 
	MOV R4,A
	CALL WRLCDCOM4       	;If yes, write it as command to LCD 
	JMP   LCD_MSG          	;Go get next byte from stringz 
                              
Lcd_Msg1: CJNE A,#0FFH,FLL	;Check for displaying full character
	MOV R4,A
	CALL WRLCDDATA
	JMP LCD_MSG
 FLL:	CJNE  A,#080h,$+3      	; Data or Address?  If => 80h then is address. 
	JC    Lcd_Msg_Data     	; Carry will be set if A < 80h (Data) 
	MOV R4,A
	CALL  WRLCDCOM4         ; Carry not set if A=>80, it is address 
	JMP Lcd_Msg          	; Go get next byte from stringz 
                             
Lcd_Msg_Data:                   ; 
	MOV R4,A
	CALL WRLCDDATA        	; It was data, write it to Lcd 
	JMP  Lcd_Msg          		; Go get next byte from stringz 
Lcd_Msg9: 
	
	RET                    	; Return to Caller 



; **********************************************************
; 1 MILLISECOND DELAY ROUTINE
; **********************************************************

MDELAY:
         PUSH        ACC
         MOV         A,#0A6H
MD_OLP:
         INC         A
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         JNZ         MD_OLP
         NOP
         POP         ACC
         RET
MADELAY:
         PUSH        ACC
         MOV         A,#036H
MAD_OLP:
         INC         A
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         JNZ         MAD_OLP
         NOP
         POP         ACC
         RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; **********************************************************
; SUB SETS THE DS1307 OSCILLATOR
; **********************************************************

OSC_CONTROL:
         ACALL       SEND_START ; GENERATE START CONDITION
         MOV         A,#DS1307W ; 1101 0000 ADDRESS + WRITE-BIT
         ACALL       SEND_BYTE  ; SEND BYTE TO 1307
         MOV         A,#00H     ; ADDRESS BYTE TO REGISTER 00H
         ACALL       SEND_BYTE  ; SECONDS REGISTER, ALWAYS LEAVE
         SETB        LASTREAD   ; REG 00H-BIT #7 = 0 (LOW)
         ACALL       SEND_STOP  ; IF REG 00H-BIT #7 = 1 CLOCK
         ACALL       SEND_START ; OSCILLATOR IS OFF.
         MOV         A,#DS1307R ; 1101 0001 ADDRESS + READ-BIT
         ACALL       SEND_BYTE  ;
         ACALL       READ_BYTE  ; READ A BYTE FROM THE 1307
         CLR         ACC.7      ; CLEAR REG 00H-BIT #7 TO ENABLE
OSC_SET:                        ; OSCILLATOR.
         PUSH        ACC        ; SAVE ON STACK
         ACALL       SEND_STOP  ;
         ACALL       SEND_START ;
         MOV         A,#DS1307W ; SETUP TO WRITE
         ACALL       SEND_BYTE  ;
         MOV         A,#00H     ; REGISTER 00H ADDRESS
         ACALL       SEND_BYTE  ;
         POP         ACC        ; GET DATA TO START OSCILLATOR
         ACALL       SEND_BYTE  ; SEND IT
         ACALL       SEND_STOP
        RET 
; **********************************************************	
; THIS SUB CONTROLS THE SQW OUTPUT 1HZ
; **********************************************************	
SQW_CONTROL_1HZ:
	LCALL SEND_START 	; SEND START CONDITION
	MOV A,#DS1307W	 	; SET POINTER TO REG 07H ON
				; DS1307
	LCALL SEND_BYTE
	MOV A,#07H
	LCALL SEND_BYTE
	MOV A,#90H 		; SQW/OUT ON AT 1HZ
	JNB SQW,SQW_SET		 ; JUMP IF SQW BIT IS ACTIVE
	MOV A,#80H 		; TURN SQW/OUT OFF 

⌨️ 快捷键说明

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