Bạn xem lại chương trình mà bạn đã tham khảo, ở phần đọc dữ liệu từ DS1307, trong một loạt lệnh i2c_read(), chỉ có lệnh cuối là dùng i2c_read(0), còn những lệnh trước đó là i2c_read(), tức là tương đương với i2c_read(1). Đoạn code trong hàm ds1307_init() của bạn có 2 lệnh gọi i2c_read(0) ở phần đầu, đây chính là chỗ không ổn. Trong một loạt lệnh read từ I2C, mỗi lệnh đều phải ACK trừ lệnh sau cùng, để báo cho slave biết là master không muốn đọc nữa.
Bạn đọc thêm về I2C ở đây:
https://www2.hcmut.edu.vn/~nqnam/Commu.php#i2c
Và tham khảo thêm tập tin nguồn "Vidu4-4.c" trong tutorial 4 dành cho dsPIC của tôi, tôi đã chú thích thứ tự những thao tác cần thực hiện khi giao tiếp với DS1307.
Thân,