Dalam proyek ini, kami akan mendemonstrasikan pembuatan Jam RTC menggunakan mikrokontroler 8051. Jika Anda ingin melakukan proyek ini dengan Arduino, periksa jam digital ini menggunakan Arduino. Komponen utama dari proyek ini adalah DS1307 yang merupakan IC jam digital waktu nyata. Mari ketahui tentang IC ini secara detail.
RTC DS1307:
Serial real-time clock (RTC) DS1307 adalah jam / kalender berdaya rendah, penuh kode biner (BCD), ditambah 56 byte NV SRAM. Chip ini bekerja pada protokol I²C. Jam / kalender menyediakan informasi detik, menit, jam, hari, tanggal, bulan, dan tahun. Tanggal akhir bulan secara otomatis disesuaikan untuk bulan yang kurang dari 31 hari, termasuk koreksi untuk tahun kabisat. Jam beroperasi dalam format 24 jam atau 12 jam dengan indikator AM / PM. DS1307 memiliki sirkuit sensor daya internal yang mendeteksi kegagalan daya dan secara otomatis beralih ke catu daya cadangan. Operasi penunjuk waktu berlanjut saat suku cadang beroperasi dari suplai cadangan. Chip DS1307 dapat terus berjalan hingga 10 tahun.
Jam real time berbasis 8051 merupakan jam digital untuk menampilkan secara real time menggunakan RTC DS1307 yang bekerja pada protokol I2C. Jam waktu nyata berarti ia bekerja bahkan setelah listrik mati. Saat daya disambungkan kembali, ini akan menampilkan waktu nyata terlepas dari waktu dan durasi saat tidak aktif. Pada proyek ini kami menggunakan modul LCD 16x2 untuk menampilkan waktu dalam format - (jam, menit, detik, tanggal, bulan dan tahun). Jam waktu nyata biasanya digunakan di komputer, rumah, kantor, dan perangkat elektronik kami untuk menjaganya agar tetap diperbarui secara waktu nyata.
Protokol I2C adalah metode untuk menghubungkan dua atau lebih perangkat menggunakan dua kabel ke satu sistem, sehingga protokol ini juga disebut sebagai protokol dua kabel. Ini dapat digunakan untuk mengkomunikasikan 127 perangkat ke satu perangkat atau prosesor. Sebagian besar perangkat I2C berjalan pada frekuensi 100Khz.
Langkah-langkah untuk master penulisan data ke slave (mode penerima slave)
- Mengirim kondisi MULAI ke budak.
- Mengirim alamat budak ke budak.
- Kirim bit tulis (0) ke budak.
- Menerima bit ACK dari budak
- Mengirimkan kata-kata alamat ke budak.
- Menerima bit ACK dari budak
- Mengirim data ke budak.
- Menerima bit ACK dari budak.
- Dan terakhir mengirimkan kondisi STOP ke budak.
Langkah-langkah untuk membaca data dari slave ke master (mode transmisi slave)
- Mengirim kondisi MULAI ke budak.
- Mengirim alamat budak ke budak.
- Kirim bit baca (1) ke budak.
- Menerima bit ACK dari budak
- Menerima data dari budak
- Menerima bit ACK dari budak.
- Mengirim kondisi STOP ke budak.
Diagram Sirkuit dan Deskripsi
Di sirkuit kami telah menggunakan 3 sebagian besar komponen DS1307, AT89S52 dan LCD. Disini AT89S52 digunakan untuk membaca waktu dari DS1307 dan menampilkannya pada layar LCD 16x2. DS1307 mengirimkan waktu / tanggal menggunakan 2 baris ke mikrokontroler.
Koneksi sirkuit mudah dipahami dan ditunjukkan pada diagram di atas. Pin chip DS1307 SDA dan SCL dihubungkan ke pin P2.1 dan P2.0 mikrokontroler 89S52 dengan resistor pull up yang memiliki nilai default HIGH pada jalur data dan clock. Dan osilator kristal 32.768KHz dihubungkan dengan DS1307chip untuk menghasilkan penundaan 1 detik yang tepat. Dan baterai 3 volt juga dihubungkan ke pin 3 rd (BAT) dari DS1307 yang menjaga waktu tetap berjalan setelah listrik mati. LCD 16x2 terhubung dengan 8051 dalam mode 4-bit. Pin kontrol RS, RW dan En terhubung langsung ke 89S52 pin P1.0, GND dan P1.1. Dan data pin D0-D7 dihubungkan ke P1.4-P1.7 dari 89S52.
Tiga tombol yaitu SET, INC / CHANGE dan Next digunakan untuk mengatur waktu jam ke pin P2.4, P2.3 dan P2.2 dari 89S52 (active low). Ketika kita menekan SET, mode set waktu aktif dan sekarang kita perlu mengatur waktu dengan menggunakan tombol INC / CHANGE dan tombol Next digunakan untuk pindah ke digit. Setelah pengaturan jam waktu berjalan terus menerus.
Deskripsi Program
Dalam kode kami telah menyertakan 8.051 perpustakaan keluarga dan perpustakaan keluaran input standar. Dan menentukan pin yang telah kami gunakan, dan mengambil beberapa variabel untuk perhitungan.
#include
Dan fungsi yang diberikan digunakan untuk menggerakkan LCD.
batal daten () {rs = 1; en = 1; penundaan (1); en = 0; } void lcddata (unsigned char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } kosong cmden (kosong) {rs = 0; en = 1; penundaan (1); en = 0; } void lcdcmd (unsigned char ch)
Fungsi ini digunakan untuk menginisialisasi RTC dan membaca waktu dan tanggal dari IC RTC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); detik = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); jam = BCDToDecimal (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); tanggal = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); tahun = BCDToDecimal (I2CRead (1)); I2CStop (); waktu pertunjukan(); // tampilkan penundaan waktu / tanggal / hari (1);
Fungsi-fungsi ini digunakan untuk mengubah desimal menjadi BCD dan BCD menjadi Desimal.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; kembali Desember; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; kembali bcd; }
Fungsi yang diberikan di bawah ini digunakan untuk Komunikasi I2C.
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // Fungsi "start" untuk berkomunikasi dengan ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // "stop" berfungsi untuk berkomunikasi dengan ds1307 RTC unsigned char I2CSend (unsigned char Data) // kirim data ke ds1307 {char i; char ack_bit; untuk (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; lain SDA = 0; SCL = 1; Data << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; kembali ack_bit; } unsigned char I2CRead (char ack) // menerima data dari ds1307 {unsigned char i, Data = 0; SDA = 1; untuk (i = 0; i <8; i ++) {Data << = 1; lakukan {SCL = 1;} saat (SCL == 0); jika (SDA) Data- = 1; SCL = 0; } jika (ack) SDA = 0; lain SDA = 1; SCL = 1; SCL = 0; SDA = 1; mengembalikan Data; }
Fungsi set_time digunakan untuk mengatur waktu dalam jam dan fungsi show_time di bawah ini digunakan untuk menampilkan waktu pada LCD.
void show_time () // berfungsi untuk menampilkan waktu / tanggal / hari pada LCD {char var; lcdcmd (0x80); lcdprint ("Tanggal:"); sprintf (var, "% d", tanggal); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", tahun + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("Waktu:"); sprintf (var, "% d", jam); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sec); lcdprint (var); lcdprint (""); // hari (hari1); lcdprint (""); }