Giới thiệu về IC thời gian thực DS1307   là một sản phẩm của Dallas Semiconductor, DS1307 là chip đồng hồ thời gian thực (RTC : Real-time clock), IC này có 7 thanh ghi 8-bit chứa thời gian là: giây, phút, giờ, thứ (trong tuần), ngày, tháng, năm. Ngoài ra DS1307 còn có 1 thanh ghi điều khiển ngõ ra phụ và 56 thanh ghi trống có thể dùng như RAM.

RTC-DS1307

Đặc tính kỹ thuật của DS1307 :

Nguồn cung cấp: 5VDC

- Ghép nối với vi điều khiển thông qua giao tiếp I2C.

- Lưu trữ và cung cấp các thông tin thời gian thực: ngày, tháng, năm, giờ, phút, giây,…

- Có pin backup duy trì thời gian trong trường hợp không cấp nguồn.

- Có 8 chân với các chức năng như sau :

     X1 và X2 là đầu vào dao động cho DS1307, thông thường gắn với thạch anh 32.768Khz.
     Vbat là nguồn nuôi cho chip. Nguồn này thường là PIN 3V. Đây là nguồn cho chip hoạt động liên tục khi không có nguồn Vcc mà DS1307 vẫn hoạt động.
     Vcc là nguồn cho giao tiếp I2C. Điện áp cung cấp là 5V. Nếu Vcc không có mà Vbat có thì DS1307 vẫn hoạt động bình thường nhưng không ghi và đọc được dữ liệu.
    GND là nguồn Mass chung cho cả Vcc và Vbat

    SQW/OUT là một ngõ ra phụ tạo xung dao động (xung vuông). 
    SCL và SDA là hai bus dữ liệu của DS1307. Thông tin truyền và ghi đều được truyền qua 2 đường truyền này theo chuẩn I2C

Giao tiếp DS1307 với vi điều khiển PIC 16F877A :

Như đã trình bày ở trên thì DS1307 được giao tiếp với vi điều khiển thông qua chuẩn I2C, các bạn có thể tham khảo bài  Giao tiếp I2C hướng dẫn học lập trình vi điều khiển PIC để biết thêm về giao tiếp I2C. Trong trường hợp này vi điều khiển PIC 16F877A đóng vai trò là Master còn DS1307 đóng vai trò là Slave.

Các thanh ghi của DS1307 có địa chỉ từ 00h -06h là các thanh ghi lần lượt là : Giây, Phút, Giờ, Thứ, Ngày, Tháng, Năm thanh ghi 07h là thanh ghi điều khiển ghi.

Chú ý DS1307 mã hóa BCD vì vậy khi ghi vào thì phải chuyển sang BCD và khi đọc ra thì đổi từ BCD sang binary

VD khi ghi giá trị vào DS1307 :

i2c_start();
i2c_write(0xD0);
i2c_write(0x00);
i2c_write(bin2bcd(sec));
i2c_write(bin2bcd(min));
i2c_write(bin2bcd(hr));
i2c_write(bin2bcd(dow));
i2c_write(bin2bcd(day));
i2c_write(bin2bcd(mth));
i2c_write(bin2bcd(year));
i2c_write(0x80);
i2c_stop();

Khi đọc giá trị từ DS1307

i2c_start();
i2c_write(0xD0);
i2c_write(0x03);
i2c_start();
i2c_write(0xD1);
dow = bcd2bin(i2c_read() & 0x7f);
day = bcd2bin(i2c_read() & 0x3f);
mth = bcd2bin(i2c_read() & 0x1f);
year = bcd2bin(i2c_read(0)); 
i2c_stop();

Các bạn vào Proteus ve mạch như hình bên dưới hoặc có thể download về từ link ở cuối bài

ds1307_schematic

Ở bài này mình cho cài đặt thời gian trong phần code CCS, trong thực tế các bạn có thể dùng nút bấm để cài đặt thời gian xem bài  Nút bấm - push button dữ liệu ngày, tháng, năm, thứ, giờ, phút , giây được hiển thị ra LCD các bạn có thể xem lại bài Hiển thi LCD

Các linh kiện chính trong bài :

- PIC 16F877A 

- DS1307 kết nối với vi điều khiển qua 2 chân SCL - RC3, SDA-RC4 có điện trở treo trên đường truyền.

- LCD 16x2

Kết bài : IC thời gian thực DS1307 có ứng dụng rất nhiều trong các thiết kế có dùng đồng hồ thời gian thực như lịch vạn niên, đồng hồ, ghi đo dữ liệu thời gian thực...bài tập này giúp các bạn sử dụng được IC này khi lập trình vi điều khiển PIC 16F877A.

Download bài tập IC thời gian thực DS1307 học lập trình vi điều khiển PIC

Xem video mô phỏng

Nếu bạn thấy hay hãy đăng ký , chia sẻ giúp tôi nhé chúng tôi sẽ thường xuyên cập nhật kiến thức mới về vi điều khiển PIC tại đây