ds1307 này có 3 chế độ tạo xung ở ngõ ra ở chân số 7 FT/OUT với 3 mức xung:
1Hz
4.096kHz
8.192kHz
32.768kHz
cho nên ta cần một con thạch anh 32.768kHz (bé gần bằng 1 con điện trở), trong sơ đồ mạch của mình nối 1 con led ở chân FT/OUT này để nó tạo xung nhấp nháy đúng 1s.
Việc đọc ghi giá trị từ ds1307 chỉ có một cái khó đó là việc chuyển đổi dữ liệu ở 2 mã BIN và BCD qua lại với nhau giữa con PIC6F877A (MASTER) và DS1307 (SLAVE) trên 2 đường BUS I2C là SDA và SCL.
Cụ thể: Khi ta GHI giá trị ngày 15 vào ds1307 thì số 15 này sẽ bị đổi thành 0x15 ngay khi vào thanh khi ds1307 !. Còn khi ta muốn ĐỌC giá trị từ DS1307 gửi về thì ds gửi về giá trị ngày 15 là: 0x15 !, tức là PIC nhận được giá trị 0x15 = 21 !.
Vậy ta phải làm sao để có được công thức chuyển đổi dữ liệu giữa 2 mã BIN và BCD:
0xAB -> AB và AB -> 0xAB. Sau đây mình xin viết ra công thức chuyền đổi của mình: (các bạn có thể viết a bằng cách khác mình cũng được):
Đổi dữ liệu mã BCD -> BIN:
Code:
int write(int data) // MASTER -> DS1307.
{ // x -> y.
int x,y; //vd: 7 -> 7 = 0x07.
x = data; //vd: 12 -> 18 = 0x12.
if(x<10)
{
y = x;
}
else if(x>=10)
{
y = (x/10 * 6) + x; //vd: 29 -> 41 = 0x29.
}
return(y); //vd: 35 -> 53 = 0x35.
}
Đổi dữ liệu mã BCD -> BIN:
Code:
int read(int data)
{ // MASTER <- DS1307.
int x,y,z; // x <- y.
y = data; //vd: 5 <- 5 = 0x05.
i=0; //vd: 10 <- 16 = 0x10.
if(y<10) //vd: 20 <- 32 = 0x20.
{ //vd: 30 <- 48 = 0x30.
x = y; //vd: 40 <- 64 = 0x40.
z = x; //vd: 50 <- 80 = 0x50.
} //.....
else if(y>=10)
{
do {
x = y - (6 * i);
z = (x/10 * 6) + x;
i++;
}
while(z!=y);
}
return(x);
}
Code đổi dữ liệu ở trên mình viết kiểu nội suy tam suất (hơi cùi bắp nhỉ !), nhưng mình đã thử lại kiểm chứng thấy đúng và dữ liệu hiển thị lên màn hình LCD là chính xác.