Using the DS87C530/DS5250 Real

[09-13 17:03:26]   来源:http://www.88dzw.com  控制技术   阅读:8357

文章摘要:Program Example: RTC InterfaceThe following program is a general purpose interface routine to set the RTC and display its status. The program communicates through serial port 0, and allows the user to set the time and date, set the alarm registers, and indicates when an alarm has occurred. For the s

Using the DS87C530/DS5250 Real,标签:计算机控制技术,工厂电气控制技术,http://www.88dzw.com

Program Example: RTC Interface

The following program is a general purpose interface routine to set the RTC and display its status. The program communicates through serial port 0, and allows the user to set the time and date, set the alarm registers, and indicates when an alarm has occurred. For the sake of simplicity, the program inputs decimal values of time and outputs hexadecimal values.

;***************************************************************************
;Program RTC_UTIL.ASM
;
;This program responds to commands received over the serial port to set
;and read the date, time and alarm information in the DS87C530 Real-time Clock.
;The program initializes the serial port for operation at 28800 baud with an
;11.0592MHz clock.
;***************************************************************************
;Register equate table
SP equ 81h ;Stack Pointer
DPL equ 82h ;Data pointer low register
DPH equ 83h ;Data pointer high register
PCON equ 87h ;Power Control Register
TCON equ 88h ;Timer Control Register
TMOD equ 89h ;Timer Mode Register
TH1 equ 8Dh ;Timer 1 MSB
EXIF equ 91h ;External Interrupt Flag Register
SCON0 equ 98h ;Serial Port 0 Control Register
SBUF0 equ 99h ;Serial Port 0 Data Buffer
P3 equ 0B0h ;Port 3
TA equ 0C7h ;Timed Access Register
ACC equ 0E0h ;Accumulator
B equ 0F0h ;B Register
RTASS equ 0F2h ;Real-time Alarm Subsecond Register
RTAS equ 0F3h ;Real-time Alarm Second Register
RTAM equ 0F4h ;Real-time Alarm Minute Register
RTAH equ 0F5h ;Real-time Alarm Hour Register
EIP equ 0F8h ;Extended Interrupt Priority Register
RTCC equ 0F9h ;Real-time Clock Control
RTCSS equ 0FAh ;Real-time Clock Subsecond register
RTCS equ 0FBh ;Real-time Clock Second
RTCM equ 0FCh ;Real-time Clock Minute
RTCH equ 0FDh ;Real-time Clock Hour
RTCD0 equ 0FEh ;Real-time Clock Day Register 0
RTCD1 equ 0FFh ;Real-time Clock Day Register 1

;Bit equate table
RI0 equ 98h ;Serial Port 0 Receiver Interrupt Flag
TI0 equ 99h ;Serial Port 0 Transmitter Interrupt Flag
EA EQU 0AFh ;Global Interrupt Enable.
ERTCI equ 0EDh ;Real-time Clock Interrupt Enable.

;Constant equate table
CR equ 0Dh
LF equ 0Ah
cseg at 0 ;Reset vector.
LJMP START
cseg at 6BH ;Real-time clock Interrupt vector.
LJMP RTC_INT
cseg at 100H ;Beginning of code segment.

;Data & string tables.
HEX_TABLE: DB '0123456789ABCDEF'
NEW_LINE: DB CR, LF, 0
YES: DB 'Y ', 0
N DB 'N ', 0
COMPARE: DB CR, LF, 'Compare enabled: ', 0
COMPARE_Q: DB ' Enable compare (Y/N)? ', 0
ALARM_MSG: DB CR, LF, 'Alarm: ', 0
TT_BANNER: DB CR, LF, CR, LF, 'DS87C530 RTC UTILITY'
DB CR, LF, ' A - Set Alarm, T -Set Time'
DB CR, LF, ' any other key to show registers'
DB CR, LF, CR, LF, 'RTC registers: ', 0
ALM_BANNER: DB CR, LF, 'Alarm register: ', 0
NEW_BANNER: DB CR, LF, CR, LF, 'Enter new alarm register settings:',0
SET_BANNER: DB CR, LF, 'Enter new time:', 0
SS_BANNER: DB CR, LF, 'Subsecond: ', 0
S_BANNER: DB CR, LF, 'Second: ', 0
M_BANNER: DB CR, LF, 'Minute: ', 0
H_BANNER: DB CR, LF, 'Hour: ', 0
DW_BANNER: DB CR, LF, 'Day of Week: ', 0
DC_BANNER: DB CR, LF, 'Day Count: ', 0
DW_STRING: DB 'Disabled ',0,'Sunday ',0,'Monday ',0,'Tuesday ', 0
DB 'Wednesday',0,'Thursday ',0,'Friday ',0,'Saturday ', 0

;Initialize part.
START: MOV SP, #80h ;Set up stack pointer.

MOV P3, #0Bh ;Set RXD0, TXD0 & INT1 as inputs.
MOV RTAM, #00h ;Initialize alarm registers to known values.
MOV RTAS, #00h
MOV RTASS, #00h

MOV TA, #0AAh ;Timed access write to enable RTC.
MOV TA, #55h
MOV RTCC, #01h
MOV SCON0, #050h ;Set serial port 0 for Mode 1, divide by 12.
MOV TH1, #0FEh ;Timer 1 value for 28800 baud at 11.0592MHz.
MOV TMOD, #20h ;Set timer 1 to 8-bit auto reload and start it.
MOV TCON, #40h
ORL PCON, #80h ;Set SMOD bit to get 28800 baud.

SETB ERTCI ;Enable RTC interrupts.
SETB EA
LJMP TELL_TIME ;Display the time.

;***************************************************************************
;This is the main program loop. It waits for a character on serial port 0,
;and then takes the appropriate action.
;***************************************************************************
CHAR_TEST: JNB RI0, $ ;Wait for incoming command character.
CLR RI0
MOV A, SBUF0 ;Test to see what to do.
CHECKT: CJNE A, #'T', CHECKA ;T - set time.
LJMP SET_TIME
CHECKA: CJNE A, #'A', TT_JUMP ;A - set alarm.
LJMP SET_ALARM
TT_JUMP: LJMP TELL_TIME ;else display time.

;***************************************************************************
;SET_TIME sets the current time.
;***************************************************************************
SET_TIME: MOV DPTR, #SET_BANNER ;Display set time banner.
CALL OUT_STRING
MOV DPTR, #H_BANNER ;Get hour & save temp copy.
CALL OUT_STRING
CALL IN_TIME
ANL A, #1Fh ;Make sure day of week bits are 0.
MOV R4, A
MOV DPTR, #M_BANNER ;Get minute & save temp copy.
CALL OUT_STRING
CALL IN_TIME
MOV R5, A
MOV DPTR, #S_BANNER ;Get second & save temp copy.
CALL OUT_STRING
CALL IN_TIME
MOV R6, A
MOV DPTR, #DC_BANNER ;Get day count(2 bytes) & save temp copies.
CALL OUT_STRING
CALL IN_TIME
MOV R2, A
CALL IN_TIME
MOV R3, A
MOV DPTR, #DW_BANNER ;Get day of week value and add it on to
CALL OUT_STRING ; the upper 3 bits of the hour register.
CALL IN_TIME
SWAP A
RL A
ANL A, #0E0h
ORL A, R4
XCH A, R4
MOV DPTR, #NEW_LINE ;Add a blank line for esthetics.
CALL OUT_STRING
MOV TA, #0AAh ;We have all the values, now save them.
MOV TA, #055h ;Perform a timed access to write to
ORL RTCC, #04h ; set new time & date.
CJNE A, ACC, $ ;Delay 4 machine cycles.
MOV RTCSS, R7
MOV RTCS, R6
MOV RTCM, R5
MOV RTCH, R4
MOV RTCD0, R3
MOV RTCD1, R2
MOV TA, #0AAh ;Clear RTCWE bit to prevent accidental
MOV TA, #055h ; changes to time registers.
ANL RTCC, #0FBh

LJMP CHAR_TEST ;Return and wait for another event.
;***************************************************************************
;TELL_TIME displays the current time, alarm registers, and alarm status.
;***************************************************************************
TELL_TIME: MOV DPTR, #TT_BANNER ;Display current time.
CALL OUT_STRING
CALL OUT_TIME

MOV DPTR, #ALM_BANNER;Display alarm registers.
CALL OUT_STRING
MOV R7, RTASS
MOV R6, RTAS
MOV R5, RTAM
MOV R4, RTAH
CALL DISP_TIME

MOV DPTR, #COMPARE ;Now display the compare bits.
CALL OUT_STRING
MOV A, RTCC

CALL DISP_COMP ;Display Hour compare bit.
RR A
CALL DISP_COMP ;Display Minute compare bit.
RR A
CALL DISP_COMP ;Display Second compare bit.
RR A
CALL DISP_COMP ;Display Subsecond compare bit.

ORL RTCC, #08h ;Set the read bit to stop RTC update.
CJNE A, ACC, $ ;Delay 4 machine cycles.
MOV R4, RTCH ;Read the hour register.
MOV R3, RTCD0 ;Read the day count registers.
MOV R2, RTCD1
ANL RTCC, #0F7h ;Clear the read bit to restart RTC.
MOV DPTR, #DW_BANNER ;Output Day of Week banner.
CALL OUT_STRING ; the upper 3 bits of the hour register.
MOV A, R4 ;Day of week is stored in upper 3 bits
SWAP A ; of hour register. Move it to bits 2-0
RR A ; and multiply by 10 to get location
ANL A, #07h ; within day of week table to start.
MOV B, #0Ah
MUL AB
MOV DPTR, #DW_STRING ;Now add offset to starting address
ADD A, DPL ; of data table to calculate new
JNC NO_INC ; data pointer location.
INC DPH
NO_INC: MOV DPL, A
CALL OUT_STRING

MOV DPTR, #DC_BANNER ;Output day count banner.
CALL OUT_STRING
MOV A, R2 ;Send both registers of day count.
CALL OUT_DIGIT
MOV A, R3
CALL OUT_DIGIT
MOV DPTR, #NEW_LINE ;Add a blank line for aesthetics.
CALL OUT_STRING

LJMP CHAR_TEST ;Return and wait for another event.

;This routine displays the status of the compare enable bit.
DISP_COMP: JNB ACC.4, NO_COMP ;Display the hour compare bit.
MOV DPTR, #YES
JMP OUT_COMP
NO_COMP: MOV DPTR, #NO
OUT_COMP: CALL OUT_STRING
RET

;This routine outputs the current time.
OUT_TIME: ORL RTCC, #08h ;Set the read bit to stop RTC update.
CJNE A, ACC, $ ;Delay 4 machine cycles.
MOV R7, RTCSS ;Grab the current time / date and store
MOV R6, RTCS ; them temporarily in working registers.
MOV R5, RTCM
MOV R4, RTCH
ANL RTCC, #0F7h ;Clear the read bit to restart RTC.

DISP_TIME: MOV A, R4 ;Output hour.
ANL A, #01Fh ;Mask off day of week bits.
CALL OUT_DIGIT

MOV A, R5 ;Output Minute.
CALL OUT_CDIGIT

MOV A, R6 ;Output second.
CALL OUT_CDIGIT

MOV A, R7 ;Output subsecond.
CALL OUT_CDIGIT
RET

;***************************************************************************
;SET_ALARM sets the alarm registers.
;***************************************************************************
SET_ALARM: CLR ERTCI ;Disable RTC interrupt and clear flag
ANL RTCC, #0Fh ; during this section so that alarms will
; not be called while enables are changing.
MOV DPTR, #NEW_BANNER
CALL OUT_STRING
MOV DPTR, #H_BANNER
CALL OUT_STRING
CALL IN_TIME ;Get hour & save temp copy.
MOV R4, A
CALL QUERY
JNC ASK_M
ORL RTCC, #10h ;Enable hour compare

ASK_M: MOV DPTR, #M_BANNER
CALL OUT_STRING
CALL IN_TIME ;Get minute & save temp copy.
MOV R5, A
CALL QUERY
JNC ASK_S
ORL RTCC, #20h ;Enable minute compare

ASK_S: MOV DPTR, #S_BANNER
CALL OUT_STRING
CALL IN_TIME ;Get second & save temp copy.
MOV R6, A
CALL QUERY
JNC ASK_SS
ORL RTCC, #40h ;Enable second compare

ASK_SS: MOV DPTR, #SS_BANNER
CALL OUT_STRING
CALL IN_TIME ;Get subsecond & save temp copy.
MOV R7, A
CALL QUERY
JNC ASK_X
ORL RTCC, #80h ;Enable subsecond compare.

ASK_X: MOV DPTR, #NEW_LINE
CALL OUT_STRING
MOV RTASS, R7 ;Save new alarm values.
MOV RTAS, R6
MOV RTAM, R5
MOV RTAH, R4
ANL RTCC, #0FDh ;Clear the RTCI flag in case it was
; accidentally set while we were
; manipulating compare bits.
SETB ERTCI ;Reenable RTC interrupt.
LJMP CHAR_TEST

QUERY: MOV DPTR, #COMPARE_Q
CALL OUT_STRING
JNB RI0, $
CLR RI0
MOV A, SBUF0
CALL OUT_CHAR ;Echo it.
CJNE A, #'Y', NO_ENABLE ;If user wants compare, set flag.
SETB C
RET
NO_ENABLE: CLR C ;User does not want compare, clear flag.
RET

;******************************************************************
;Output routines.
;******************************************************************
;This subroutine outputs an ASCII string. The starting point of the string
;is in DPTR, and the terminating character is '0'.
OUT_STRING: PUSH ACC ;Save accumulator.
CHAR_LOOP: CLR A ;Clear accumulator for next instruction.
MOVC A, @A + DPTR Get the next character from the
JNZ NXT_CHAR ; string, and if 0, exit.
POP ACC ;Restore accumulator.
RET
NXT_CHAR: CALL OUT_CHAR ;Next character is valid, so transmit
INC DPTR ; it. Increment the data pointer
JMP CHAR_LOOP ; to the next position and loop
; back to send character.

;This subroutine outputs a leading colon for the minute, second, and subsecond
; when displaying the time. When done, it falls through to OUT_DIGIT.
OUT_CDIGIT: MOV SBUF0, #':' ;Display a colon.
JNB TI0, $
CLR TI0

;This subroutine outputs a hex number in ASCII format through serial port 0.
OUT_DIGIT: MOV DPTR, #HEX_TABLE
MOV R0, A ;Make another copy of value
SWAP A ;Do high nibble fist
ANL A, #0Fh ;Clear unused nibble
MOVC A, @A+DPTR ;Get character from table
CALL OUT_CHAR ;Transmit the character.

MOV A, R0 ;Now do low nibble.
ANL A, #0Fh ;Clear unused nibble
MOVC A, @A+DPTR ;Get character from table
CALL OUT_CHAR ;Transmit the character.
RET ;Done

OUT_CHAR: MOV SBUF0, A ;Transmit the character out the serial
JNB TI0, $ ; port and wait until complete.
CLR TI0
RET

;******************************************************************
;Input routines.
;******************************************************************
;IN_TIME takes two decimal characters from the serial port, and formats them
; as a hexadecimal number.
IN_TIME: CALL IN_CHAR ;Get tens digit.
MOV B, #0Ah ;Multiply first digit by 10 and save to
MUL AB ; add to ones digit.
XCH A, B
CALL IN_CHAR ;Get ones digit and add it.
ADD A, B ;Acc now has hex value of 2 decimal digit
RET ; number. Exit.
IN_CHAR: JNB RI0, $ ;Wait for character.
CLR RI0
MOV A, SBUF0
CALL OUT_CHAR ;Echo character back.
PUSH ACC ;Save copy of A.
ANL A, #0F0h ;If bits 7-4 are not 3h, then character
CJNE A, #30h, IN_CHAR ; is not 0-9. Get another character.
POP ACC ;Restore A.
ANL A, #0Fh ;Acc now contains 0-9
RET
;***************************************************************************
;RTC_INT - This ISR notifies the user that an alarm has occurred, and gives
; the time of the alarm.
;***************************************************************************
RTC_INT: ANL RTCC, #0FDh ;Clear RTC Interrupt flag.
MOV DPTR, #ALARM_MSG ;Display alarm message and time of alarm.
CALL OUT_STRING
CALL OUT_TIME
RETI ;Return

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  下一页


Tag:控制技术计算机控制技术,工厂电气控制技术控制技术

《Using the DS87C530/DS5250 Real》相关文章