Dalam projek ini, kita akan menunjukkan pembuatan Jam RTC dengan menggunakan mikrokontroler 8051. Sekiranya anda ingin melakukan projek ini dengan Arduino, periksa jam digital ini menggunakan Arduino. Komponen utama projek ini adalah DS1307 yang merupakan IC jam digital masa nyata. Mari mengetahui mengenai IC ini secara terperinci.
RTC DS1307:
Jam masa nyata bersiri (RTC) DS1307 adalah jam / kalendar perpuluhan berkod binari penuh (BCD) berkuasa rendah dan 56 bait NV SRAM. Cip ini berfungsi pada protokol I²C. Jam / kalendar memberikan maklumat detik, minit, jam, hari, tarikh, bulan, dan tahun. Tarikh akhir bulan diselaraskan secara automatik selama berbulan-bulan dengan kurang dari 31 hari, termasuk pembetulan untuk tahun lompat. Jam beroperasi dalam format 24 jam atau 12 jam dengan penunjuk AM / PM. DS1307 mempunyai litar power-built-in yang mengesan kegagalan kuasa dan secara automatik beralih ke bekalan sandaran. Operasi pencatatan masa berterusan sementara bahagian beroperasi dari bekalan sandaran. Cip DS1307 dapat terus berjalan sehingga 10 tahun.
Jam masa nyata berasaskan 8051 adalah jam digital untuk memaparkan masa nyata menggunakan RTC DS1307, yang berfungsi pada protokol I2C. Jam masa nyata bermaksud ia berjalan walaupun selepas gangguan kuasa. Apabila kuasa disambungkan semula, ia akan memaparkan masa nyata tanpa mengira waktu dan tempohnya dalam keadaan mati. Dalam projek ini, kami telah menggunakan modul LCD 16x2 untuk memaparkan format waktu - (jam, minit, saat, tarikh, bulan dan tahun). Jam masa nyata biasanya digunakan di komputer, rumah, pejabat dan alat elektronik kami untuk memastikannya dikemas kini dengan masa nyata.
Protokol I2C adalah kaedah untuk menghubungkan dua atau lebih peranti menggunakan dua wayar ke satu sistem, dan oleh itu protokol ini juga disebut sebagai protokol dua wayar. Ia dapat digunakan untuk menyampaikan 127 peranti ke satu alat atau pemproses. Sebilangan besar peranti I2C berjalan pada frekuensi 100Khz.
Langkah-langkah untuk menulis data master ke slave (mod penerimaan hamba)
- Menghantar syarat MULAI kepada hamba.
- Menghantar alamat hamba kepada hamba.
- Hantar bit tulis (0) kepada hamba.
- Menerima bit ACK dari hamba
- Menghantar kata-kata alamat kepada hamba.
- Menerima bit ACK dari hamba
- Menghantar data kepada hamba.
- Menerima bit ACK dari hamba.
- Dan terakhir menghantar syarat STOP kepada hamba.
Langkah-langkah untuk membaca data dari hamba ke master (mod penghantaran hamba)
- Menghantar syarat MULAI kepada hamba.
- Menghantar alamat hamba kepada hamba.
- Hantar bit baca (1) kepada hamba.
- Menerima bit ACK dari hamba
- Menerima data dari hamba
- Menerima bit ACK dari hamba.
- Menghantar syarat STOP kepada hamba.
Gambarajah dan Penerangan Litar
Dalam litar kami telah menggunakan 3 komponen yang paling banyak DS1307, AT89S52 dan LCD. Di sini AT89S52 digunakan untuk membaca waktu dari DS1307 dan memaparkannya pada skrin LCD 16x2. DS1307 menghantar masa / tarikh menggunakan 2 baris ke mikrokontroler.
Sambungan litar mudah difahami dan ditunjukkan dalam rajah di atas. Pin cip DS1307 SDA dan SCL disambungkan ke pin P2.1 dan P2.0 dari mikrokontroler 89S52 dengan perintang tarik yang menahan nilai lalai TINGGI pada garis data dan jam. Dan pengayun kristal 32.768KHz disambungkan dengan DS1307chip untuk menghasilkan kelewatan tepat 1 saat. Dan bateri 3 volt juga disambungkan ke pin 3 rd (BAT) DS1307 yang menjadikan masa terus berjalan setelah kerosakan elektrik. LCD 16x2 disambungkan dengan 8051 dalam mod 4-bit. Pin kawalan RS, RW dan En disambungkan secara langsung ke 89S52 pin P1.0, GND dan P1.1. Dan pin data D0-D7 disambungkan ke P1.4-P1.7 dari 89S52.
Tiga butang iaitu SET, INC / CHANGE dan Next digunakan untuk menetapkan waktu jam ke pin P2.4, P2.3 dan P2.2 dari 89S52 (rendah aktif). Apabila kita menekan SET, mod set waktu diaktifkan dan sekarang kita perlu menetapkan waktu dengan menggunakan butang INC / CHANGE dan butang Next digunakan untuk beralih ke digit. Setelah menetapkan jam berjalan terus.
Penerangan Program
Dalam kod kami telah memasukkan 8051 perpustakaan keluarga dan perpustakaan output input standard. Dan pin yang ditentukan yang telah kami gunakan, dan mengambil beberapa pemboleh ubah untuk pengiraan.
#sertakan
Dan fungsi yang diberikan digunakan untuk memandu LCD.
batal daten () {rs = 1; en = 1; kelewatan (1); en = 0; } batal lcddata (tidak ditandatangani char ch) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } batal cmden (kekosongan) {rs = 0; en = 1; kelewatan (1); en = 0; } batal lcdcmd (tidak ditandatangani char ch)
Fungsi ini digunakan untuk menginisialisasi RTC dan dan membaca waktu dan tarikh dari borang RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); jam = BCDToDecimal (I2CRead (1)); hari1 = BCDToDecimal (I2CRead (1)); tarikh = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); tahun = BCDToDecimal (I2CRead (1)); I2CStop (); masa pertunjukan(); // paparan masa / tarikh / hari kelewatan (1);
Fungsi-fungsi ini digunakan untuk menukar perpuluhan menjadi BCD dan BCD ke Perpuluhan.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; pulangan dec; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((perpuluhanBait / 10) << 4); b = (perpuluhanBait% 10); bcd = ab; kembali bcd; }
Fungsi di bawah ini digunakan untuk Komunikasi I2C.
batal I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // "start" fungsi untuk berkomunikasi dengan ds1307 RTC batal I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // fungsi "berhenti" untuk berkomunikasi dengan ds1307 RTC char tidak bertanda I2CSend (data char yang tidak ditandatangani) // hantar data ke ds1307 {char i; char ack_bit; untuk (i = 0; i <8; i ++) {if (Data & 0x80) SDA = 1; SDA lain = 0; SCL = 1; Data << = 1; SCL = 0; } SDA = 1, SCL = 1; ack_bit = SDA; SCL = 0; pulangkan ack_bit; } char I2CRead yang tidak ditandatangani (char ack) // terima data dari ds1307 {char i yang tidak ditandatangani, Data = 0; SDA = 1; untuk (i = 0; i <8; i ++) {Data << = 1; lakukan {SCL = 1;} sambil (SCL == 0); jika (SDA) Data- = 1; SCL = 0; } jika (ack) SDA = 0; SDA lain = 1; SCL = 1; SCL = 0; SDA = 1; mengembalikan Data; }
Fungsi set_time digunakan untuk mengatur waktu dalam jam dan fungsi show_time di bawah digunakan untuk memaparkan waktu pada LCD.
void show_time () // fungsi untuk memaparkan waktu / tarikh / hari pada LCD {char var; lcdcmd (0x80); lcdprint ("Tarikh:"); sprintf (var, "% d", tarikh); capaian lcd (var); sprintf (var, "/% d", mon); capaian lcd (var); sprintf (var, "/% d", tahun + 2000); capaian lcd (var); cetakan lcd (""); lcdcmd (0xc0); lcdprint ("Masa:"); sprintf (var, "% d", jam); capaian lcd (var); sprintf (var, ":% d", min); capaian lcd (var); sprintf (var, ":% d", saat); capaian lcd (var); cetakan lcd (""); // hari (hari1); cetakan lcd (""); }