Mình dùng 89c51 ghi váo rtc gía trị giờ phút giây.rồi đọc lại và xuất giá trị giây ra port3 để hiển thị lên led 7 đoạn thôi.MÀ KHI ĐỌC RA THÌ KHÔNG ĐÚNG VỚI THỜI GIAN THỰC.MÀ NÓ CÓ NHẢY VÀI SỐ BẬY BẠ RỒI TOÀN SỐ 0 LUÔN
Scl bit p1.0
sda bit p1.1
ds_1307w equ 0d0h
ds_1307r equ 0d1h
giay equ 58h ;58 giay
phut equ 58h ;58 phut
gio equ 8h ;8 gio
;---------------------------------------------
org 00h
ljmp main
;--------------------------------------------
org 30h
main:
Lcall start_bit ; gui bit start
mov a,#ds_1307w ; gui dia chi ra rtc +w=0
mov r7,#8
lcall gui_ra_rtc ;
lcall nhan_ack ;nhan ack tu rtc gui lai khi gui du mot byte
;--------ghi gia tri con tro cho ds1307-------------------------------
mov a,#00h ; gui gia tri con tro cho ds1307
mov r7,#8
lcall gui_ra_rtc
lcall nhan_ack
;--------ghi gia tri 8h vao thanh ghi giay -------------------------------
mov a,#giay ;gui byte du lieu dau tien
mov r7,# 8
lcall gui_ra_rtc
lcall nhan_ack
;--------ghi gia tri phut-------------------------------
mov a,#phut ;gui byte du lieu tiep theo
mov r7,#08
lcall gui_ra_rtc
lcall nhan_ack
;---------ghi gia tri gio---------------------------
mov a,#gio ;gui byte du lieu tiep theo
mov r7,#08
lcall gui_ra_rtc
lcall nhan_ack
lcall stop_bit
;----******doc lai du lieu da ghi vao ds1307******
lcall start_bit
mov a,#ds_1307w ;dia chi rtc + w=0
mov r7,#08
lcall gui_ra_rtc ;
lcall nhan_ack ;nhan ack tu rtc tra ve khi gui du mot byte
mov a,#00h ; gia tri con tro cho ds1307
mov r7,#8
lcall gui_ra_rtc
lcall nhan_ack
lcall stop_bit
;------------------------------------------------
doc_rtc: Mov r0,#20h ;ghi du lieu vao 8051 trong ram bat dau tu dia chi 20h
lcall start_bit
mov a,#ds_1307r ;dia chi rtc + r=1
mov r7,#08
lcall gui_ra_rtc ;
lcall nhan_ack ;nhan ack tu rtc tra ve khi gui du mot byte
mov r6,#02 ;doc 3 thanh ghi giay ,phut, gio
next: Lcall read_rtc ; doc mot byte du lieu
mov @r0,a ;chuyen du lieu vao dia chi ram
inc r0
djnz r6,doc_tiep
sjmp stop
doc_tiep: Lcall gui_ack ;nhan ack tu rtc khi nhan du mot byte
sjmp next ;
stop: Lcall no_ack ;gui no_ack khi doc xong du lieu
lcall stop_bit ;ket thuc doc
mov p2,20h
mov p3,21h
lcall delay_100ms ;
ljmp doc_rtc
;-------start bit
start_bit: Setb scl
nop
setb sda
nop
clr sda
nop
clr scl
ret
;-------stop bit
stop_bit:
Clr sda
nop
setb scl
nop
setb sda
nop
nop
clr scl
ret
;------- nhan_ack
nhan_ack:
Setb sda
nop
setb scl ;tao xung clock nhan no
nop
clr scl
ret
;------gui_ack
gui_ack: Clr sda
nop
setb scl
nop
clr scl
ret
; ------gui no_ack
no_ack: Setb sda
nop
setb scl
nop
clr scl
ret
;-------gui du lieu ra rtc
gui_ra_rtc:
Rlc a
mov sda,c
setb scl
nop
clr scl
djnz r7,gui_ra_rtc
ret
;------doc du lieu tu rtc gui ve
read_rtc: Mov r7,#8
read_byte: Setb scl
nop
mov c,sda
clr scl
nop
rrc a
djnz r7,read_byte
ret
;------ hien thi len led 7 doan
hien_thi: Mov p3,#20h
ret
;------delay_100ms
delay_100ms:
Mov r2,#1
loop_delay2: Mov r3,#200
loop_delay1: Mov r4,#250
djnz r4,$
djnz r3,loop_delay1
djnz r2,loop_delay2
ret
end
Scl bit p1.0
sda bit p1.1
ds_1307w equ 0d0h
ds_1307r equ 0d1h
giay equ 58h ;58 giay
phut equ 58h ;58 phut
gio equ 8h ;8 gio
;---------------------------------------------
org 00h
ljmp main
;--------------------------------------------
org 30h
main:
Lcall start_bit ; gui bit start
mov a,#ds_1307w ; gui dia chi ra rtc +w=0
mov r7,#8
lcall gui_ra_rtc ;
lcall nhan_ack ;nhan ack tu rtc gui lai khi gui du mot byte
;--------ghi gia tri con tro cho ds1307-------------------------------
mov a,#00h ; gui gia tri con tro cho ds1307
mov r7,#8
lcall gui_ra_rtc
lcall nhan_ack
;--------ghi gia tri 8h vao thanh ghi giay -------------------------------
mov a,#giay ;gui byte du lieu dau tien
mov r7,# 8
lcall gui_ra_rtc
lcall nhan_ack
;--------ghi gia tri phut-------------------------------
mov a,#phut ;gui byte du lieu tiep theo
mov r7,#08
lcall gui_ra_rtc
lcall nhan_ack
;---------ghi gia tri gio---------------------------
mov a,#gio ;gui byte du lieu tiep theo
mov r7,#08
lcall gui_ra_rtc
lcall nhan_ack
lcall stop_bit
;----******doc lai du lieu da ghi vao ds1307******
lcall start_bit
mov a,#ds_1307w ;dia chi rtc + w=0
mov r7,#08
lcall gui_ra_rtc ;
lcall nhan_ack ;nhan ack tu rtc tra ve khi gui du mot byte
mov a,#00h ; gia tri con tro cho ds1307
mov r7,#8
lcall gui_ra_rtc
lcall nhan_ack
lcall stop_bit
;------------------------------------------------
doc_rtc: Mov r0,#20h ;ghi du lieu vao 8051 trong ram bat dau tu dia chi 20h
lcall start_bit
mov a,#ds_1307r ;dia chi rtc + r=1
mov r7,#08
lcall gui_ra_rtc ;
lcall nhan_ack ;nhan ack tu rtc tra ve khi gui du mot byte
mov r6,#02 ;doc 3 thanh ghi giay ,phut, gio
next: Lcall read_rtc ; doc mot byte du lieu
mov @r0,a ;chuyen du lieu vao dia chi ram
inc r0
djnz r6,doc_tiep
sjmp stop
doc_tiep: Lcall gui_ack ;nhan ack tu rtc khi nhan du mot byte
sjmp next ;
stop: Lcall no_ack ;gui no_ack khi doc xong du lieu
lcall stop_bit ;ket thuc doc
mov p2,20h
mov p3,21h
lcall delay_100ms ;
ljmp doc_rtc
;-------start bit
start_bit: Setb scl
nop
setb sda
nop
clr sda
nop
clr scl
ret
;-------stop bit
stop_bit:
Clr sda
nop
setb scl
nop
setb sda
nop
nop
clr scl
ret
;------- nhan_ack
nhan_ack:
Setb sda
nop
setb scl ;tao xung clock nhan no
nop
clr scl
ret
;------gui_ack
gui_ack: Clr sda
nop
setb scl
nop
clr scl
ret
; ------gui no_ack
no_ack: Setb sda
nop
setb scl
nop
clr scl
ret
;-------gui du lieu ra rtc
gui_ra_rtc:
Rlc a
mov sda,c
setb scl
nop
clr scl
djnz r7,gui_ra_rtc
ret
;------doc du lieu tu rtc gui ve
read_rtc: Mov r7,#8
read_byte: Setb scl
nop
mov c,sda
clr scl
nop
rrc a
djnz r7,read_byte
ret
;------ hien thi len led 7 doan
hien_thi: Mov p3,#20h
ret
;------delay_100ms
delay_100ms:
Mov r2,#1
loop_delay2: Mov r3,#200
loop_delay1: Mov r4,#250
djnz r4,$
djnz r3,loop_delay1
djnz r2,loop_delay2
ret
end