DS1307 RTC Modülü ile Gerçek Zaman Saati Uygulaması
Merhaba arkadaşlar, bu yazımızda Trudyo Geliştirme Kartı ile DS1307 RTC (Gerçek Zaman Saati) Modülünün kullanımından bahsedeceğiz. DS1307 RTC modülünden okuduğumuz tarih ve saat verilerini 2×16 LCD ekrana yazdıracağız. Dilerseniz uygulamamıza başlamadan önce, daha önce yayımlanan 2×16 LCD Kullanımı hakkındaki yazımızı okuyabilirsiniz.
DS1307 Hakkında Kısa Bir Bilgi
Bu entegre, DS1307 kodlu bir RTC (Gerçek Zaman Saati) entegresidir. Tarih ve saate bağlı işlemlerin yapılacağı uygulamalarda sıklıkla tercih edilmektedir. Batarya giriş pinine sahiptir. Bu sayede, haricen bir pil bağlanabilmektedir. Bir pil ile beraber kullanıldığında, devre enerjisi kesilmiş olsa bile gerçek zamanı saymaya devam edebilmektedir.
Pin No | İsim | Açıklama |
1 | DS | Data Select Pini (Sadece DS1307 uygulaması için herhangi bir bağlantı gerekmez. Ancak DS1307 ile birlikte modül üzerinde bulunan EEPROM ile haberleşmek gerektiğinde kullanılmalıdır.) |
2 | SCL | I2C Seri Saat Sinyali Giriş Pini |
3 | SDA | I2C Seri Veri Giriş Pini |
4 | VCC | +5V Bağlantı Pini |
5 | GND | GND Bağlantı Pini |
DS1307 & LCD ve Trudyo Geliştirme Kartı Bağlantısı
Yukarıda görüldüğü üzere 2×16 Karakter LCD Ekran, Trudyo Geliştirme Kartı‘nın D Portuna bağlanmıştır. Ayrıca haricen eklenmiş bir 10K Ohm değerinde bir Potansiyometre ile LCD ekranın kontrast ayarı yapılmaktadır. Bununla birlikte, DS1307 RTC Modülü B portunda B6 ve B7 pinlerine bağlanmıştır.
Bu Uygulamada Kullanılan Malzemeler
Trudyo Geliştirme Kartı
Başlamadan Önce
2×16 LCD Ekran Kullanımı
2×16 karakter LCD ekran kullanımı hakkında ayrıntılı bilgi ve örnek uygulamayı incelemek için daha önce yayınlanan “2×16 LCD Ekran Kullanımı” yazımızı okuyabilirsiniz.
Trudyo Konfigürasyon Ayarları
Trudyo Geliştirme Kartı ile programlama yapabilmek için kartınızın konfigürasyon ayarlarını yapmanız gerekmektedir. Gerekli konfigürasyon ayarlarını yapmak için “Trudyo Konfigürasyon Ayarları” yazımızı okuyabilirsiniz.
DS1307 RTC Uygulama Kodları
// Connections
sbit LED at LATA4_bit;
// LCD module connections
sbit LCD_RS at LATD0_bit;
sbit LCD_EN at LATD1_bit;
sbit LCD_D4 at LATD2_bit;
sbit LCD_D5 at LATD3_bit;
sbit LCD_D6 at LATD4_bit;
sbit LCD_D7 at LATD5_bit;
sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISD1_bit;
sbit LCD_D7_Direction at TRISD2_bit;
sbit LCD_D6_Direction at TRISD3_bit;
sbit LCD_D5_Direction at TRISD4_bit;
sbit LCD_D4_Direction at TRISD5_bit;
// DS1307 I2C Connections
sbit Soft_I2C_Scl at RB6_bit;
sbit Soft_I2C_Sda at RB7_bit;
sbit Soft_I2C_Scl_Direction at TRISB6_bit;
sbit Soft_I2C_Sda_Direction at TRISB7_bit;
// Global Variables
unsigned short second;
unsigned short minute;
unsigned short hour;
unsigned short dayOfWeek;
unsigned short day;
unsigned short month;
unsigned short year;
unsigned short lastSecond=0;
void SetDateTime(unsigned short second, unsigned short minute, unsigned short hour, unsigned short dayOfWeek, unsigned short day, unsigned short month, unsigned short year){
Soft_I2C_Start();
Soft_I2C_Write(0xD0);
Soft_I2C_Write(0x00);
Soft_I2C_Write(second);
Soft_I2C_Write(minute);
Soft_I2C_Write(hour);
Soft_I2C_Write(dayOfWeek);
Soft_I2C_Write(day);
Soft_I2C_Write(month);
Soft_I2C_Write(year);
Soft_I2C_Stop();
}
void GetDateTime(unsigned short *second, unsigned short *minute, unsigned short *hour, unsigned short *dayOfWeek, unsigned short *day, unsigned short *month, unsigned short *year){
Soft_I2C_Start();
Soft_I2C_Write(0xD0);
Soft_I2C_Write(0);
Soft_I2C_Start();
Soft_I2C_Write(0xD1);
*second = Soft_I2C_Read(1);
*minute = Soft_I2C_Read(1);
*hour = Soft_I2C_Read(1);
*dayOfWeek = Soft_I2C_Read(1);
*day = Soft_I2C_Read(1);
*month = Soft_I2C_Read(1);
*year = Soft_I2C_Read(0);
Soft_I2C_Stop();
*second = ((*second & 0xF0)>>4)*10 + (*second & 0x0F);
*minute = ((*minute & 0xF0)>>4)*10 + (*minute & 0x0F);
*hour = ((*hour & 0xF0)>>4)*10 + (*hour & 0x0F);
*day = ((*day & 0x30)>>4)*10 + (*day & 0x0F);
*month = ((*month & 0x10)>>4)*10 + (*month & 0x0F);
*year = ((*year & 0xF0)>>4)*10 + (*year & 0x0F);
}
void Display_Time() {
unsigned short i;
char date[16];
char time[16];
date[ 0]='T';
date[ 1]='a';
date[ 2]='r';
date[ 3]='i';
date[ 4]='h';
date[ 5]=':';
date[ 6]=day/10+48;
date[ 7]=day%10+48;
date[ 8]='/';
date[ 9]=month/10+48;
date[10]=month%10+48;
date[11]='/';
date[12]='2';
date[13]='0';
date[14]=year/10+48;
date[15]=year%10+48;
time[ 0]='S';
time[ 1]='a';
time[ 2]='a';
time[ 3]='t';
time[ 4]=' ';
time[ 5]=':';
time[ 6]=' ';
time[ 7]=' ';
time[ 8]=hour/10+48;
time[ 9]=hour%10+48;
time[10]='.';
time[11]=minute/10+48;
time[12]=minute%10+48;
time[13]='.';
time[14]=second/10+48;
time[15]=second%10+48;
if(lastSecond != second){
Lcd_Out(1,1,date);
Lcd_Out(2,1,time);
lastSecond=second;
}
}
void main() {
TRISA=0b00000000;// [][][][LED][][][][]
TRISB=0b00000000;// [][][][][][][][]
TRISC=0b00000000;// [][][][][][][][]
TRISD=0b00000000;// [][][LCD_D7][LCD_D6][LCD_D5][LCD_D4][LCD_EN][LCD_RS]
TRISE=0b00000000;// [][][][][][][][]
LATA=0x00;
LATB=0x00;
LATC=0x00;
LATD=0x00;
LATE=0x00;
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);
Soft_I2C_Init();
SetDateTime(0x00,0x42,0x01,0x06,0x28,0x09,0x22);
while(1){
GetDateTime(&second, &minute, &hour, &dayOfWeek, &day, &month, &year);
Display_Time();
delay_ms(100);
LED=!LED;
}
}
Uygulamaya ait dosyaları buraya tıklayarak indirebilirsiniz. Merak ettiğiniz ve aklınıza takılan soruları aşağıda 👇 yorum olarak bize iletebilirsiniz. İyi çalışmalar. 🙂 #geliştirmeyebaşla
Yorum yapmak için giriş yapmalısınız.