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

📄 bell.a51

📁 89c51 schematics 89c51 schematics
💻 A51
📖 第 1 页 / 共 2 页
字号:
	MOV A,#0AAH 			; WRITE BYTE TO ENTIRE RAM SPACE
	LCALL SEND_BYTE 
	LCALL SEND_STOP 		; SEND 2WIRE STOP CONTION


	
	LCALL SEND_START 		; SEND 2WIRE START CONDITION
	MOV A,#DS1307W 			; LOAD DS1307 WRITE COMMAND
	LCALL SEND_BYTE 		; SEND WRITE COMMAND
	MOV A,#01H 			; SET DS1307 DATA POINTER TO BEGINNING
	LCALL SEND_BYTE 		; OF 00H
	MOV A,NUMB4 			; SET DS1307 DATA POINTER TO BEGINNING
	LCALL SEND_BYTE 		; OF 00H
	MOV A,NUMB2
	CLR ACC.6
	LCALL SEND_BYTE 		
	LCALL SEND_STOP 		; SEND 2WIRE STOP CONTION

;*******************************************************************************
;		MAIN PROGRAM
;*******************************************************************************
START_PROGRAM: 
	CALL READ_CLOCK
	MOV R1,#25H			;GET MIN AND DISPLAY
	MOV A,@R1
	ANL A,#0FH
	MOV VALUE_4,A
	MOV R1,#25H
	MOV A,@R1
	ANL A,#0F0H
	SWAP A
	MOV VALUE_3,A
	MOV R1,#26H			;GET HOUR AND DISPLAY
	MOV A,@R1
	
	CLR C
	SUBB A,#12H
	JNC CCX 
	MOV A,@R1	
CCX:	
	CJNE A,#00H,HHGH
	MOV A,#12H
HHGH:
	ANL A,#0FH
	MOV VALUE_2,A
	MOV R1,#26H
	MOV A,@R1
	
	CLR C
	SUBB A,#12H
	JNC CCX1
	MOV A,@R1	
CCX1:	
	CJNE A,#00H,HHGH1
	MOV A,#12H	
HHGH1:
	ANL A,#0F0H
	SWAP A
	MOV VALUE_1,A
	CALL LOAD_ALRM
			
	CLR ROW4
	SETB COL2
	JB COL2,NEXT1
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;		EMERGENCY BELL
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
	SETB RELAY
	JNB COL2,$
	CLR RELAY
	AJMP START_PROGRAM
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
NEXT1:	CLR ROW4
	SETB COL3
	JB COL3,START_PROGRAM
	CALL SQW_CONTROL_32KHZ
	MOV NUMBER1,#01H
	SETB CANCEL
	SETB CANCEL1
	MOV DPTR,#0001H

START_PROG:
	ORL  WMCON, #EEMEN		 ; enable EEPROM accesses
	MOVX A,@DPTR
	CJNE A,#0FFH,TFT1
	MOV VALUE_1,#16H
	MOV VALUE_2,#16H
	AJMP TFT3
TFT1:	MOV R1,A			;GET MIN AND DISPLAY
	ANL A,#0FH
	MOV VALUE_2,A			
	MOV A,R1
	ANL A,#0F0H
	SWAP A
	MOV VALUE_1,A
TFT3:	INC DPTR
	MOVX A,@DPTR
	CJNE A,#0FFH,TFT2
	XRL WMCON, #EEMEN		 ; disable EEPROM accesses
	MOV VALUE_3,#16H
	MOV VALUE_4,#16H
	JMP KEYBOARD
TFT2:	
	MOV R1,A	
	ANL A,#0FH
	MOV VALUE_4,A
	MOV A,R1
	ANL A,#0F0H
	SWAP A
	MOV VALUE_3,A
	JMP KEYBOARD

START_PM:
	CLR ROW4
	SETB COL3
	JNB COL3,$
	CALL DEC_DPTR			;store the count of timings	
	CALL DEC_DPTR
	MOV A,DPL
	MOV DPTR,#0100H
	MOV WMCON,#18H
	MOVX @DPTR,A
CZTHD:	
	MOV A,WMCON		;Check for eeprom finished or not
	JNB ACC.1,CZTHD		
	MOV WMCON,#08H	
	CALL SQW_CONTROL_1HZ
	AJMP START_PROGRAM
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
;		CHECK FOR TIME IS EQUAL
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((

LOAD_ALRM:
	MOV DPTR,#0100H	
	ORL  WMCON, #EEMEN		 ; enable EEPROM accesses
	MOVX A,@DPTR
	MOV B,#02H
	DIV AB
	MOV R5,A
	MOV DPTR,#0001H

REPEAT:
	MOVX A,@DPTR
	MOV ALM_HOUR,A
	INC DPTR
	MOVX A,@DPTR
	MOV ALM_MIN,A
	INC DPTR
	MOV A,HRS
	CJNE A,ALM_HOUR,CHKK
	MOV A,MINS
	CJNE A,ALM_MIN,CHKK
	MOV A,SECS
	ANL A,#01111111B
	MOV SECS,A
	MOV A,#00H
	CJNE A,SECS,CHKK
					;Time Is Equal
	JB ALARM,CHKK
	ORL TMOD,#10H		;ENABLE TIMER 0
	MOV TL1,#08H
	MOV TH1,#01H
	SETB ET1
	MOV TIM,#100
	SETB TR1
	SETB RELAY
	SETB ALARM
CHKK:	DJNZ R5,REPEAT
	XRL WMCON, #EEMEN		 ; disable EEPROM accesses
	RET



;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
KB_RET:  
	MOV A,KEY
	CJNE A,#10H,CAXCX0	;Key to Erase last dislled NUMBER1
	JB CANCEL,START_PM1
	MOV KEY,#00H
	MOV NUMBER1,#01H
	MOV VALUE_1,#15H
	MOV VALUE_2,#15H
	MOV VALUE_3,#15H
	MOV VALUE_4,#15H
	SETB CANCEL
	CLR CANCEL1
	AJMP KEYBOARD
START_PM1:
	AJMP START_PM
CAXCX0:	
	CJNE A,#12H,CAXX5
	CLR CANCEL
	AJMP CAXCX5
CAXX5:
	MOV A,NUMBER1
	CJNE A,#01H,CAXCX1
	MOV A,KEY
	CLR C
	SUBB A,#03H			; Chk Key Pressed 0,1,2
	JNC CAXCX5
	MOV A,KEY
	INC NUMBER1
	MOV NUMB1,KEY
	MOV VALUE_1,KEY
	CLR CANCEL
	AJMP KEYBOARD
CAXCX1:	CJNE A,#02H,CAXCX2

	MOV A,NUMB1
	CJNE A,#02,JAKJL
	MOV A,KEY
	CLR C
	SUBB A,#04H			; Chk Key Pressed 0,1,2,3
	JNC CAXCX5
JAKJL:	MOV A,KEY
	CLR C
	SUBB A,#10H			; Chk Key Pressed 0,1...8,9
	JNC CAXCX5
	INC NUMBER1
	MOV NUMB2,KEY
	MOV VALUE_2,KEY
	CLR CANCEL
	AJMP KEYBOARD
CAXCX2:	CJNE A,#03H,CAXCX3
	MOV A,KEY
	CLR C
	SUBB A,#06H			; Chk Key Pressed 0,1...,5
	JNC CAXCX5
	INC NUMBER1
	MOV NUMB3,KEY
	MOV VALUE_3,KEY
	CLR CANCEL
	AJMP KEYBOARD
CAXCX3:	CJNE A,#04H,CAXCX4
	MOV A,KEY
	CLR C
	SUBB A,#10H			; Chk Key Pressed 0,1,....,8,9
	JNC CAXCX5
	INC NUMBER1
	MOV NUMB4,KEY
	MOV VALUE_4,KEY
	CLR CANCEL
	SETB CANCEL1
CAXCX4:
	AJMP KEYBOARD
CAXCX5:
	JNB CANCEL1,CAXCX4

	CALL DEC_DPTR
	MOV A,VALUE_1
	SWAP A
	ORL A,VALUE_2
	MOV NUMB2,A
	MOV A,VALUE_3
	SWAP A
	ORL A,VALUE_4
	MOV NUMB4,A


	MOV WMCON,#18H
	MOV A,NUMB2
	MOVX @DPTR,A
CTHD:	MOV A,WMCON		;Check for eeprom finished or not
	JNB ACC.1,CTHD		
	INC DPTR
	MOV A,NUMB4
	MOVX @DPTR,A
CTTHD:	MOV A,WMCON		;Check for eeprom finished or not
	JNB ACC.1,CTTHD		
	INC DPTR
	MOV WMCON,#08H		 ; DISable EEPROM WRITE
	


	AJMP START_PROG

;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
DEALAY:
	PUSH ACC
	MOV R1,#20
REPP2:  MOV         A,#0A6H
MD_OLP:
         INC         A
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         JNZ         MD_OLP
         NOP
       	DJNZ R1,REPP2
	POP ACC
	RET
;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((		
DEC_DPTR:
    XCH     A,DPL               ;Exchange A for DPL
    DEC     A                   ;Decrement A (which is DPL)
    CJNE    A,#0FFh,_dec_dptr2  ;If A (DPL) is not #0FFh, continue normally
    DEC     DPH                 ;If A=FFh, we need to decrement DPH
_dec_dptr2:
    XCH     A,DPL               ;Exchange A for DPL (thus saving DPL and restoring A)
    RET

; **********************************************************
;		DELAY TIMER FOR BELL
; **********************************************************
RELAY_TIMER:
	
	DJNZ TIM,GAHJ
	CLR TR1
	CLR RELAY
	CLR ALARM
	RETI
GAHJ:	MOV TL1,#08H
	MOV TH1,#01H
	SETB TR1
	RETI

; **********************************************************
; 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 + -