Elektronik / Mikrodenetleyici Projeleri/

8051 RTC DS1302 ile LCD Gösterimli Dijital Saat

Sponsorlu Bağlantılar

Hazırlayan: Aytan ASLAN Emeği geçen Kişilere Teşekkürler

Mikrodenetleyiciler Hakkında Genel Bilgiler

Mikrodenetleyici: Bir yazılım yüklenmeden hiçbir anlam taşımayan bir elektronik elemandır.. Mikrodenetleyiciyi kontrol eden bir yazılım olduğundaysa neredeyse sınırsız bir uygulamaya sahiptir.

Mikrodenetleyicilerin mikroişlemcilere göre üstünlükleri oldukça fazladır. Örneğin mikroişlemcili bir sistem yapıldığında mikroişlemcinin yanı sıra hafızalar (RAM, ROM veya EPROM), I/O birimi ve buna benzer birçok sistem kullanılmaktadır. Bu karışık sistemin hem tasarlanması ve yapımı zordur, hem de maliyeti oldukça yüksektir. Mikrodenetleyicilerde de bir sistemin çalıştırılabilmesi için yalnızca bir mikrodenetleyici ve osilatör devresi yeterli olabilmektedir.Sistemde gerekli olan ön bellek ve I/O birimi mikrodenetleyiciler içinde bir yonga halindedir.

Mikroişlemci: Ön belleğine yazılan programı işleterek istenilen çıkışlara yönlendiren birimdir. Mikroişlemci veya sayısal bilgisayarlar üç temel kısımdan (CPU – Merkezi işlem ünitesi, I/O ve bellek) ve bunlara ek olarak bazı destek devrelerden oluşur. Her bir temel kısım en basitten en karmaşığa kadar çeşitlilik gösterir.

GİRİŞ / ÇIKIŞ (I/O): Sayısal, analog ve özel fonksiyonlardan oluşur. Mikroişlemcinin dış dünya ile ilişkisini sağlar. Mikroişlemciye verilen ve işlemlerden alınan veriler bu hat üzerinden sağlanır.

CPU (Central Proccesing Unit – Merkezi İşlem Birimi): Sistemin kalbidir. Birim hesapları yapmak ve verileri idare etmek için 4, 8 veya 16 bitlik veri formatında çalışır. Bir mikroişlemcide temelde kullanılan üç yol vardır;

1) Veri yolu: Bu yol, işlemci, bellek ve çevre birimleri arasında veri iletmek için kullanılır.

2) Adres yolu: Bu yol, işlemcinin program komutlarına ve veri saklama alanlarına erişimi sağlayan bellek adreslerini, ROM ve RAM belleklerine göndermek için kullanılır.

3) Denetim yolu: Bu yol, RAM belleğine veri yazıldığı veya ondan veri okunduğuna dair bilgi vermek gibi, denetim amaçları için kullanılır. Bu yol aynı zamanda kesmelerin kullanımına olanak tanıyan bağlantıları da içerir. Tipik bir mikroişlemci komutunun yürütülmesi her üç yolunda kullanımını gerektirebilir. Böylelikle kullanılan ek devreler artarak maliyet yükselir ve tasarım çok karmaşık bir hal alır.

İşlemci ilk olarak komuta, komut adresini adres yoluna koyarak erişir. İkili kodlardan oluşan bu adres, buna karşılık gelen bellek konumu tarafından tanınır ve bu konum istenen komutu veri yolundan işlemciye gönderir. Örneğin eğer bu komut, verinin işlemciden gönderilmesini ve bir RAM konumunda saklanmasını gerektiriyorsa işlemci, adres yolunu istenen konumu belirtmek, veri yoluna veriyi iletmek ve denetim yolunu da RAM’e yazıyor olduğunu belirtmek için kullanılır.

Mikrodenetleyici Mimari Özellikleri

Mikrodenetleyici mimarileri iki ayrı sınıfa ayrılmıştır:

  • Bellek Organizasyonu Açısından
  • Komut İşleme Tekniği Açısından

Bellek Organizasyonu Açısından Mimari Yapılar

Mikroişlemci ve denetleyiciler bellek kullanımı açısından Von Neuman ve Harvard olarak adlandırılan iki mimariden biri üzerine tasarlanırlar.Von Neuman mimarisi Princeton Üniversitesi tarafından diğeri de adından anlaşılacağı gibi Harvard Üniversitesi tarafından tasarlanmıştır.

O günkü teknolojiye uygun olan Von Neuman mimarisi tercih edilse de ilerideki yıllarda teknolojinin uygun hale gelmesi sonucu Harvard mimarisi 1970’li yılların sonlarında özellikle mikrodenetleyici tasarımında standart hale gelmiştir.Günümüzde her iki mimari yapının özelliklerini içeren mikrodenetleyiciler (MAXQ ailesi) de bulunmaktadır.Bu mikrodenetleyiciler karma mimariye sahip olup iki mimarinin üstün olan özelliklerini kullanarak performans artışı elde ederler.

8051’ in iç yapısı Harvard mimarisine uygun tasarlanmıştır.Von Neuman mimarisi ise PC olarak bilinen kişisel bilgisayarlar arasında standarttır.

Komut İşleme Tekniği Açısından Mimari Yapılar

Mikrodenetleyici yada mikroişlemciler genellikle komut işleme açısından iki grup mimari altında toplanabilir:

  • CISC: Karmaşık Komut Kümeli Bilgisayar
  • RISK: Azaltılmış Komut Kümeli Bilgisayar

CISC Çekirdekler

Bu mimaride mikroişlemci çok sayıda komut içerir ve her eylem için bir komut tanımlamıştır.Buradaki yaklaşım “donanım her zaman yazılımdan hızlıdır” gerçeğidir.CISC,karmaşık komut kümeli bilgisayarı anlamına gelmektedir.Böylece yüzlerce komutun arasından seçilen komutlarla yazılan bir program daha kısa olabilmektedir.

Her işlem için farklı bir komut kullanmak işlemleri hızlandırır;ancak donanımın yükünü arttırır.CISC mimarisinde oldukça çeşitli olan komutları çalıştırmak için mikro-kod kullanılmaktadır.Farklı uzunlukta olan bu komutların çözümünde oldukça karmaşık devrelere ihtiyaç vardır.

RISC çekirdekler

Hemen hemen hiç kimse bir CISC makinedeki karmaşık assembly dili komutlarının tamamını kullanmamaktadır.Günümüzde programcılar tüm karmaşık komut kümelerini neredeyse hiç kullanmayan yüksek-düzeyli dil derleyicilerini tercih etmektedirler. Bu yüzden daha az,basit ve hızlı komutlar,uzun,karmaşık ve daha yavaş CISC komutlarından daha verimlidir.
RISC mimari,daha basit komutlar kullanarak tümdevre karmaşıklığını azaltmaktadır.

Ancak RISC komutlarının daha kısa olması belirli bir görevin tamamlanabilmesi için daha fazla komuta gereksinim duyulmasına yol açabilir.Ayrıca RISC mimariler için üretilen derleyiciler daha önce CISC mimarisinde bulunan donanım birimlerinin görevini üstlenmek üzere ekstra komutlar kullanmaktadır.

Mikrodenetleyici Seçiminde Dikkat Edilmesi Gerekenler

Bir mikrodenetleyiciyi seçerken göz önünde tutulması gereken öncelikli hususları aşağıdaki gibi sıralayabiliriz.

• Maliyet ve Bulunma Kolaylığı: Ticari amaçlı olarak düşünülecek olursa,istenen öncelikli özellik,seçilecek mikrodenetleyicinin maliyetinin düşük olması ve piyasada yaygın olarak bulunmasıdır.Kullanıcı buna göre öncelikle hangi firmanın ürününü kullanacağını belirler.Daha sonra uygulamasına bağlı olarak aşağıda verilen özellikler göz önünde tutularak o ürünün ilgili serisi belirlenir.

• Mikrodenetleyicinin Çalışma Hızı: Zaman sınırlamalarının etkili olduğu uygulamalarda önemlidir.Mikrodenetleyicinin çalışma hızı,mikrodenetleyicinin çalışma frekansına(kristal frekansı),tek bir komutu işleme süresine (makine çevrimi) ve saklayıcı büyüklüklerine bağlıdır.

• Giriş/Çıkış Port Sayısı: Uygulamaların ihtiyacına göre tercih edilir.

• Bellek Büyüklüğü ve Türü: Uygulama için geliştirilecek olan programın yazımını doğrudan etkiler.Günümüzde program belleği olarak birçok kez yazılıp/silinme özelliğine sahip EEPROM(Electrically Erasable Programmable Read-Only Memory) veya Flash kullanılan denetleyiciler,program geliştirmeye büyük kolaylık sağladığından tercih edilmektedir.Özellikle belleği daha hızlı silinip,yazılabilen Flash belleğe sahip mikrodenetleyiciler öğrenmeye yeni başlayanlar için cazip olma-tadır.

• Zamanlayıcı/Sayıcı Adedi: Belirli aralıklarla yapılması gereken işlemler,harici girişe bağlı olan sinyallerin saydırılması,seri haberleşme veri iletim hızının(baud rate) ayarlanması,PWM sinyalinin üretilmesi vb daha birçok işlerde sıklıkla kullanmak için başvurduğunuz bu birim uygulamalar için oldukça önemlidir.

• Analog/Dijital Dönüştürücü: Artık uygulamaların çoğu analog/dijital dönüştürücüler gerektirmektedir.Bu dönüştürücünün mikrodenetleyici içerisinde ol-ması kolaylık sağlar.A/D çevirici seçiminde dikkat edilmesi gereken iki özellik,ölçüm hassasiyetini gösteren bit sayısı ve kaç farklı sayıda noktadan ölçüm yapabileceğini gösteren kanal sayısıdır.

• Enerji Sarfiyatı: Taşınabilir sistemler için üretilecek bir cihazın enerji sarfiyatının en az düzeyde olması istenir.Seçilecek mikrodenetleyicinin düşük-güç ve uyku modlarına sahip olması,istenilen enerji tasarrufunu sağlamaya yeterli olabilmektedir.

• Geliştirme Araçları: Mikrodenetleyici ile uygulama geliştirirken kullanılan assembler veya C derleyicilerinin kolay bulunması ve maliyetinin düşük olması mik-rodenetleyici seçiminde önemli ölçütler olarak karşımıza çıkmaktadır.

• Müşteri Desteği: Birçok üretici firma,devre ve program örneklerini kullanıcılara sunarak tasarımcıların işlerini önemli ölçüde kolaylaştırmaktadırlar.Bunun yanında üretici firmaların tasarımcıların karşılaşabilecekleri olası sorunlara çözüm üretebilmeleri yine mikrodenetleyici seçiminde önemli bir ölçüt olarak karşımıza çıkmaktadır.

8051 Mikrodenetleyicisinin Genel Yapısı

Günümüzde 8051 tabanlı mikrodenetleyiciler daha düşük güç tüketen CMOS teknolojisi ile ü-retilmektedir ve 80C51 şeklinde adlandırılırlar.8051 mikrodenetleyicisinin standart özellikleri şunlardır:

  • Kontrol uygulamalarına yönelik 8 bit CPU
  • Mantıksal işlemci(tek-bit lojik işlemler)
  • 64 KB program bellek adres alanı
  • 64 KB veri bellek adres alanı
  • 4 K ROM,(0-64K)
  • 128 Byte RAM,(256 Byte çıkabilir)
  • 4 adet 8-bit Giriş/Çıkış portu(32 uç)
  • 2 adet 16 bit-zamanlayıcı/sayıcı
  • Çift yönlü UART

8051 Mikrodenetleyicisinin Uç Fonksiyonları

Çeşitli gereksinimleri karşılamak amacıyla 8051 mikrodenetleyicisinin hem iç hem de dış birimleri birçok amaca hizmet edecek şekilde düzenlenmiştir.

Standart 8051 mikrodenetleyicisinde 8-bitlik dört adet giriş/çıkış portu bulunmaktadır.Aynı şekilde 8051 in harici uçları birkaç fonksiyon gerçekleştirebilecek şekilde tasarlanmıştır.

Örneğin bütün portlardaki uçlar hem giriş hemde çıkış olarak kullanılabilirler.Hatta bunlara ilaveten bazı port uçları adresleme,programlama,kesme,algılama gibi daha birçok işleve sahip olabilirler.Bu esnek yapı sayesinde tasarımcılar endüstriyel uygulamalardaki gereksinimlere kolaylıkla cevap verebilmektedirler.Şimdi bu uçları kısaca anlatılacaktır:

8051 mikrodenetleyicisinin bacak bağlantıları
8051-mikrodenetleyicisinin-bacak-baglantilari

Besleme uçları : 8051 in 40 nolu ucu VDD,20 nolu ucu da VSS’dir.8051 mikrodenetleyicisi 5 voltluk bir kaynaktan beslenir.

Kontrol uçları: Kontrol hatları,mikrodenetleyicinin dışarıdaki bir durumu yada devreyi kontrol etmesini sağlar.

PSEN(Program Store Enable): harici program belleğini yetkilendirmek için kullanılır.
Düşük seviyede (lojik 0) aktif olan bu uç 8051’in 29 nolu ucudur. Genellikle EPROM ‘un okunmasına izin veren output enable (low active) bağlanır.

ALE(Adres Latch Enable): 8051’in 30 nolu ucu olan ALE,P0 portundaki bilginin veri ya da adres olup olmadığı seçimini yapmak için kullanılır.Adres bilgisi P0’a aktarıldığında ALE ucu aktif(lojik ‘1’) olur. ALE ucu adres ve veriyi birbirinden ayırmak için bir tutucu(latch) tümdevresinin kapı ucuna bağlanır.

EA(External Access): EA 8051’in 30 nolu bacağıdır ve düşük seviyede aktiftir.Eğer +5V a bağlanırsa programlar dahili ROM ‘dan, şaseye bağlanırsa sadece harici bellekten çalıştırılır.

RST(Reset): 8051’i yeniden başlatmak için kullanılan en öncelikli kesme işaretidir.

Mikrodenetleyicisinin İç Mimarisi

Aşağıdaki Şekilde 8051 mikrodenetleyicisini oluşturan fonksiyonel birimler ayrıntılı olarak gösterilmiştir.

8051 mikrodenetleyicisinin ayrıntılı blok diyagramı
8051-blok-diagram-ic208051-databook-atmel
[Alıntı:IC20:8051 Data Book,ATMEL]

Özet : Projemde 8051 mikrodenetleyicisini tercih sebebim bu mikrodenetleyicinin tüm dünya tarafından kabul görmüş ve bir endüstri standardı haline gelmiş olmasıdır.Elektronik ve yarı iletken sanayinin devleri olan Intel,Philips,Atmel ve Dallas gibi üreticiler 8051 mikrodenetle-yicisini üreten yirmiden fazla firmadan sadece bir kaçıdır.

8051 standart olarak en az 128 Byte’ı genel amaçlı ve 128 Byte’ı SFR olmak üzere 256 Byte’lık bir dahili RAM bellek birimine sahip olmalıdır.Program belleği için böyle bir varsayım doğru değildir.Endüstriyel kontrol düzeneklerinde sıkça ihtiyaç duyulan zamanlama ve sayma işlemleri için de 8051 ailesi en az iki adet dahili zamanlayıcı/sayıcı birimi bulundurur.

Reset işlemi ve saat darbesinin üretimi yine dahili birimler ile gerçekleştirildiğinden,fazladan harici bellek birimleri ile kullanılırken gerekli olacak arayüz uçlarına da sahiptir ve bu yönüyle,profesyonel tasarımların gerçekleştirilmesinde de kullanılabilir.

8051’in Bellek Organizasyonu

8051 mikrodenetleyicileri Harvard mimarisine uygun olarak tasarlanmıştır.Bu bellek mimarisinde program(kod) ve veri bellekleri fiziksel olarak ayrıdır.Uygulamalarda dahili kod ve veri belleğinin yetersiz kaldığı durumlarda,hariçten bağlanan bellek kullanmak da olasıdır.

Program (Code) Belleği

Program belleği mikrodenetleyicinin çalıştıracağı programın makine kodlarını bulunduran bellek birimidir.Standart 8051 mikrodenetleyicisinde 4 KByte kod bellek bulunmaktadır.Dahili kod belleğinin bulunmadığı yada yetersiz kaldığı durumlarda harici kod bellek kullanmak olasıdır.

Harici ya da dahili kod bellekten hangisinin kullanılacağını 8051 mikrodenetleyicisinin bir ucu olan EA(External Access) belirlemektedir. EA lojik “1” durumunda iken program komutları dahili kod bellekten okunurken bu uç lojik”0” durumunda harici program bellekten okunur.

Veri (Data) Belleği

8051 mikrodenetleyicisi dahili veri bellek birimi içermektedir.Standart 8051de 128 Byte olan bellek birimi bazı 8051 türevlerinde 256 Byte büyüklüğünde olabilmektedir.Dahili veri belleğinin yetmediği durumlarda harici veri belleği kullanmak mümkündür. Aşağıda iki farklı tür veri bellek birimleri hakkında ayrıntılı bilgi verilmektedir.

Dahili RAM Belleği

8051 tabanlı tüm mikrodenetleyicilerde program ve veri bellekleri birbirinden fiziksel olarak ayrı ve bağımsızdırlar. Bu özellik 8-bitlik bir MİB’in dahili program ve veri belleklerini kolay ve basit şekilde kullanmasına imkan tanır.8 bitlik adres,dahili RAM bellek üniteleri için yeterli ve oldukça verimlidir.

Ancak harici bellek erişimi için 16 bitlik DPTR (Data Pointer-Veri İşaretçisi) saklayıcısına ihtiyaç duyulur.Dahili RAM bellek 3 ana bölümden oluşmuştur.

  • Alt RAM(Lower RAM)
  • Üst RAM(Upper RAM)
  • Özel İşlev Saklayıcıları(SFR-Special Function Register)

Alt RAM(Lower RAM)

İlk 128 Byte’ lık kısım Alt RAM olarak isimlendirilir ve tüm 8051 türevleri için ortak olan bu bölgeye doğrudan veya dolaylı adresleme yöntemleri ile erişilebilir.Alt RAM bölgesinde 4 adet saklayıcı grubu ,16 Byte lık alan ve 80 Byte’lık genel kullanıma açık veri belleği vardır.

Üst RAM(Upper RAM)

Alt RAM gibi birçok fonksiyona sahip olmayan Üst RAM bölgesi,bütün 8051 lerde mevcut olmayabilir.Bu bölge daha çok genel amaçlı olarak kullanılır ve 80h adresinden başlar FFh adresinde don bulur.Diğer önemli özelliği bu alana sadece dolaylı adresleme ile ulaşılmasıdır.

Özel Fonksiyon Saklayıcıları(SFR)

Dahili bellekte SFR saklayıcıları 80h-FFh adresleri arasında yer alırlar. SFR bellek alanı çekirdeğine,kesme birimine,giriş-çıkış portlarına,zamanlayıcı/sayıcı birimine,haberleşme birimlerine ve diğer tümdevre fonksiyon birimlerine ait saklayıcıları içerir.Bu saklayıcılar kullanılarak birimlerin başlangıç veya çalışma ayarları ,bilgi okuma ve yazma işlemleri ile diğer birimlere ait özel işlemler gerçekleştirilebilir.

REAL TIME CLOCK (RTC) Entegresinin Özellikleri

DS 1302 (RTC)Elemanının Üstten Görünüşü
realtime-clock-rtc-entegresinin-ozellikleri-ust

  • a) RTC(Real Time Clock) 2100 yılına kadar saat,dakika ,saat, ay , yıl bilgisini gösterir.Artık yıl uygulamasını ve ayların günlerini kendi otomatik olarak ayarlar.
  • b) 31×8 byte Data depolama kapasitesi
  • c) Seri I/O
  • d) 2-5.5 V giriş seçeneği vardır.
  • e) Clock ve Ram bilgisini okuma yazma için tekli yada çoklu (multiple) byte modunda çalışır.
  • f) Basit 3-wire arayüzlüdür.
  • g) TTL uyumludur(Vcc=+5V)
  • h)-40 o C ile +85 o C arasında çalışır.
  • DS 1302 (RTC) Elemanının Çalışma Mantığı

DS1302 entegresi gerçek zamanlı saat/tarih bilgisi ve 31 Byte’lık bir statik RAM içerir.Gerçek zamanlı saat/tarih bilgisi, bize saat, dakika, saniye,gün,ay ve yılı verir. Örneğin ayın sonunda tarihi otomatik olarak bir sonraki aya ayarlar.Aynı şekilde saat bilgisini de 24 saat formatında veya 12 saat AM/PM formatında üretir.

DS1302 mikrodenetleyiciyle senkron seri haberleşme yolu ile haberleşir. Haberleşmeyi sağlayan üç tane önemli pini vardır.

Bunlar CE (Chip enable), I/O ve SCLK (serial clock) pinleridir.Mikroişlemciyle haberleşmeyi de bu uçlar yapar. Seri clock (SCLK) ucu,seri ara yüzde senkronize olarak verileri taşır. I/O ucu, 3-kablo ara yüzü ile iki yönlü veri ucudur. CE (Chip enable) ucu, saat veya RAM’den veri okuma yada veri yazma için kullanılır.

Command Byte

DS1302 de adreslerden veri okuma veya adreslere veri yazma komut byte’ı ile gerçekleşir.
Komut Byte’ı data transferlerimi sağlar. 7.biti(MSB) her zaman için lojik “1” seviyesindedir.”0” olursa DS1302 ye veri yazamayız. 6.bit lojik”0” iken saat verisi ile ilgili işlemlerde lojik”1” iken de RAM verisi ile ilgili işlemlerde kullanılır.

5.bitten 1.bite kadar A4- A0 registerları I/O olarak düzenleyebiliriz. 0.bit veya LSB biti lojik ”0” iken DS1302 ye veri yazabiliriz, lojik”1” iken de veri okuma işlemi yapabiliriz.

DS1302 –Komut byte’ı
ds1302-komut-byte

CE ve SAAT Kontrolü

CE ucu high iken yani lojik ”1” seviyesinde iken tüm data transferlerini başlatır.CE girişleri iki işlemi gerçekleştirir.Birincisi adres/komut ikilisi için registerlara erişimi sağladığından CE yön değiştirir.İkincisi CE single tek byte veya çoklu (multiple) byte data gönderimi sağlar.

DATA INPUT

SCLK palsinin yükselen kenarında 1 bytelık veri alınır.Bu işlem 8 clock palste tamamlanır.Bu durumda data girişi yapılabilmesi için komut byte’nın yazma (write) modunda olması gerekir.

DATA OUTPUT

SCLK palsinin düşen kenarında 1 bytelık data çıkışa aktarılır.Bu işkem 8 clock palste tamamlanır.0.bit ile data çıkışı başlar.

BURST MODE

Burst modu RAM kaydedicisi veya saat/tarih verilerini adreslemede kullanılır.Komut byte’daki 6.bit lojik “0” yapıldığında saat,lojik”1” olduğunda RAM kaydedicisi adresi için kurulur.Ayrıca komut byte’nın 0.biti lojik “1” iken DS1302 ‘nin adreslerini okur,lojik”0” DS1302 adreslerine veri yazabilmesini sağlar.Yani 0.bit çift ise veri okur,tek ise adreslerine veri yazılabilir.

Burst modunda saat kaydedicisi yazarken 0.adresin 0.biti ile başlar.Burst modunda saat kaydedicisine yazarken veriyi gönderebilmek için ilk sekiz kaydedici yazılmış olmalıdır.Burst modu RAM’e yazarken gerekli olmasa da 31 byte’lık verinin hepsini yazar. Statik RAM31x8 byte’lık adres aralığı vardır.

RAM BURST MODE

RAM komut byte’ı burst mod işlemlerinde kullanılır.Bu moda 31 RAM kaydedicisine 0.adresin 0.bitinden itibaren okunup yazılabilir.

SAAT/TARİH BURST MODE

Write-protect biti set edildiğinde saat/tarih burst modu seçilebilir.Saat burst modu okumaya başladığında, “gerçek zaman” registerları ikinci defa set edildiğinde gönderilir.Regıster data format özetini aşağıdaki tabloda görebiliriz.

Register Adres/Tanımlamalar
register-adres-tanimlamalari

DS1302 (RTC) Elemanının Bağlantı Şekli

CE,ucu daha önce dendiği gibi Chip Enable DS1302 yani RTC nin aktif olmasını sağlıyor.
X1,X2 ,uçları buradan RTC ye 32khzllik bir kristal bağlayarak clock sinyal üretiyor.

DS1302( RTC) nin Bağlantı şekli
ds1302-rtc-baglanti-sekli

I/O , data girdi çıktısı ve SCLK okuma yazma durumuna göre serial clock gönderiyor. Burada tanımlanan CE,I/O ve SCLK uçları MCU programlanırken hangi portun hangi bitine işaret edilmişse o portun ilgili bitine bağlanmalıdır.

RTC Dijital Saat Devre Şeması

ds1302-8051-devresi

C Programlama Diliyle Yazılmış Program Kodları

LCD için Başlık Dosyası

/****************************************************************/
/* 				     T_LCD.H	 	 		     */
/****************************************************************/

/* LCD'de kullanılan komutların tanımlanması */
#define Sil 		 1	// Ekranı temizler
#define BasaDon 	 2	// İmleci sol üst köşeye getirir
#define SolaYaz 	 4  // İmlecin belirttiği adres azalarak gider
#define SagaYaz 	 6   // İmlecin belirttiği adres artarak gider
#define ImlecGizle	 12	// Göstergeyi aç, kursör görünmesin
#define ImlecYanSon	 15	// Yanıp sönen blok kursör
#define ImlecGeri	 16	// Kursörü bir karakter geri kaydır
#define KaydirSaga	 24	// Göstergeyi bir karakter sağa kaydır                   
#define KaydirSola   28	// Göstergeyi bir karakter sola kaydır   
#define EkraniKapat	 8	// Göstergeyi kapat (veriler silinmez)
#define BirinciSatir 128	// LCD'nin ilk satir başlangıç adresi       
                          // (DDRAM adres)
#define IkinciSatir  192	// İkinci satırın başlangıç adresi
#define KarakUretAdres 64	// Karakter üreteci adresini belirle  
                          // (CGRAM adres)

/* LCD'de Kullanılan Fonksiyon Seçimi */
#define CiftSatir8Bit  56	 // 8 bit ara birim, 2 satır, 5*7 piksel
#define CiftSatir4Bit  48	 // 8 bit ara birim, 1 satır, 5*7 piksel
#define TekSatir8Bit   40	 // 4 bit ara birim, 2 satır, 5*7 piksel
#define TekSatir4Bit   32	 // 4 bit ara birim, 1 satır, 5*7 piksel

/* LCD Girişlerinin Tanımlanması */
#define Data  P1	  // LCD Data girişleri için port ata
#define RS	P2_0 // Saklayıcı seçme girişi RS=0 komut, RS=1 veri
#define RW	P2_1  // Oku/Yaz girişi RW=0 yaz, RW=1 oku
#define EN	P2_2   // Yetki girişi 

/* LCD Gecikme Fonksiyonu */
void Gecikme (long int sure)
{
  long int i;
  for (i=1;i<=sure;i++)
    {;}
}

/* LCD Hazır Olana Kadar Bekle Fonksiyonu */
void LcdHazir ()
{
   Data=0xFF;	      // LCD den veri almaya hazirlan 	  	
   RS = 0;	      // komut modu
   RW = 1;	      // LCDden okuma
   EN = 1;         // yetki için düşen kenar ayarı
   Gecikme(200);   // kısa bir bekleme süresi
   while(Data & 0x7F == 0x80); // mesgul bitini kontrol et.
}

/* LCD'ye Komut Yazdırma Fonksiyonu */
void Komut (int komut) 
{
  LcdHazir();      // LCD hazir olana kadar bekle
  RS=0;	      // RS komut modunda
  RW=0;	      // RW yaz modunda
  EN=1;	// işlemin yetkilendirilmesi için düşen kenar ayarı           
  Data=komut;	      // LCD data girişlerine komut bilgisini aktar
  EN=0;	      // yetki için düşen kenar sağlandı
  Gecikme(1000);   // gecikme
}	
/* LCD'ye Tek Bir Karakter Yazdırma Fonksiyonu */
void Veri (char veri, long int hiz)	
{
  LcdHazir();      // LCD hazir olana kadar bekle
  RS=1;	      // RS komut modunda
  RW=0;	      // RW yaz modunda
  EN=1;	      // yetki için düsen kenar ayar işlemi
  Data=veri;       // LCD data girişlerine veri bilgisini aktar
  EN=0;            // yetki için düşen kenar sağlandı
  Gecikme(hiz); // Ekranda karakterlerin görünmesi arasındaki süre
}

/* LCD'ye Karakter Dizisi (String) Yazdırma Fonksiyonu */
/*void VeriDizi (char veri[], long int hiz)	
{
  int i=0;
  while(veri[i]!=0)
  {
    LcdHazir();     // LCD hazir olana kadar bekle
    RS=1;	       // RS komut modunda
    RW=0;	       // RW yaz modunda
    EN=1;	       // yetki için düsen kenar ayar işlemi
    Data=veri[i];   // LCD data girişlerine veri bilgisini aktar
    EN=0;           // yetki için düşen kenar sağlandı
    i++;   // bir sonraki veri bitini almak için dizi'yi 1 arttır 
    Gecikme(hiz);   // karakterlerin görünmesi arasındaki süre
  }
}*/
/* LCD Başlangıç Ayarlarını Yapan Fonksiyon */
void LcdAc(void)            
{ 	
  Komut(ImlecGizle);
  Komut(CiftSatir8Bit);
  Komut(SagaYaz);
}

DS1302 (RTC) Elemanı için Başlık Dosyası


#define RTC_SCLK P3_0
#define RTC_IO   P3_1
#define RTC_RST  P3_2

void delay_us(int tekrar)
{
	int i;
	for(i=0;i<=tekrar;i++);
}
void bit_yaz(int c)
{
	RTC_IO=c;
	RTC_SCLK=1;
	RTC_SCLK=0;
	RTC_IO=1;
}
int bit_oku()
{
	int c;
	c=RTC_IO;
	RTC_SCLK=1;
	RTC_SCLK=0;
	return c;
}
void write_ds1302_byte(int cmd)
{
	int i,simdiki_bit;
	for(i=0;i<=7;++i)
	{
		simdiki_bit=cmd>>i;
		simdiki_bit=simdiki_bit&1;
		bit_yaz(simdiki_bit);
	}
}

void write_ds1302(int cmd, int veri)
{
   RTC_RST=1;
   write_ds1302_byte(cmd);
   write_ds1302_byte(veri);
   RTC_RST=0;
}
int read_ds1302(int cmd)
{
   int i,veri=0;

   RTC_RST=1;
   write_ds1302_byte(cmd);
   for(i=0;i<=7;++i) 
		veri=veri|(bit_oku()<>4)*10;
   veri=veri+(i<<4>>4);
   return veri;
}*/
  int rakam(int veri)
{
	int i;
	i=veri;
	veri=((i>>4)&0x0F)*10;
	veri=veri+(i&0x0F);
	return veri;
}
void rtc_set_datetime(int day,int mth,int year,int dow,int hr,int min)
{
   write_ds1302(0x86,get_bcd(day));
   write_ds1302(0x88,get_bcd(mth));
   write_ds1302(0x8c,get_bcd(year));
   write_ds1302(0x8a,get_bcd(dow));
   write_ds1302(0x84,get_bcd(hr));
   write_ds1302(0x82,get_bcd(min));
   write_ds1302(0x80,get_bcd(0));
}

void rtc_get_date(int *day, int *mth, int *year, int *dow)
{
   *day = rakam(read_ds1302(0x87));
   *mth = rakam(read_ds1302(0x89));
   *year = rakam(read_ds1302(0x8d));
   *dow = rakam(read_ds1302(0x8b));
}

void rtc_get_time(int *hr, int *min, int *sec)
{
   *hr = rakam(read_ds1302(0x85));
   *min = rakam(read_ds1302(0x83));
   *sec = rakam(read_ds1302(0x81));
}
/*
void rtc_write_nvr(BYTE address, BYTE data) {
   write_ds1302(address|0xc0,data);
}

BYTE rtc_read_nvr(BYTE address) {
    return(read_ds1302(address|0xc1));
}
*/

ANA Program

#include <89c51rd2.H>
#include 
#include "T_LCD.h"
#include "rtc.h"
#define program P3_5
#define azalt   P3_6
#define arttir  P3_7
code char  sayi[10]={'0','1','2','3','4','5','6','7','8','9'};
//code char gunler[7][3]={"CTS","PZR","PZT","SAL","CAR","PER","CUM"};
int gun,ay,yil,dow;
int saat,dakika,saniye;
int a1=0,a2=0;g1=0,g2=0,y1=0,y2=0,hg1=0,hg2=0;
int sa1=0,sa2=0,dkk1=0,dkk2=0,sn1=0,sn2=0;
int i;
int  s=0;
void main(void)
{
LcdAc();
rtc_init();
Komut(Sil);
while(1)
{
Komut(BirinciSatir+4);
rtc_get_time(&saat,&dakika,&saniye);
if((saniye%10)!=0)
{
//Veri('-',0);Veri('-',0);Veri('-',0);Veri('-',0);
sa1=saat/10;                    Veri(sayi[sa1],0);
sa2=saat%10;                  Veri(sayi[sa2],0);
Veri(':',0);
dkk1=dakika/10;             Veri(sayi[dkk1],0);
dkk2=dakika%10;          Veri(sayi[dkk2],0);
Veri(':',0);
sn1=saniye/10;               Veri(sayi[sn1],0);
sn2=saniye%10;             Veri(sayi[sn2],0);
Veri('-',0);Veri('-',0);Veri('-',0);Veri('-',0);
}
Komut(IkinciSatir+4);
rtc_get_date(&gun,&ay,&yil,&dow);
Veri('-',0);Veri('-',0);Veri('-',0);Veri('-',0);
g1=gun/10;                     Veri(sayi[g1],0);
g2=gun%10;                   Veri(sayi[g2],0);
Veri('/',0);
a1=ay/10;                       Veri(sayi[a1],0);
a2=ay%10;                     Veri(sayi[a2],0);
Veri('/',0);
y1=yil/10;                       Veri(sayi[y1],0);
y2=yil%10;                    Veri(sayi[y2],0);
Veri('/',0);
for(i=0;i<3;i++)
Veri(gunler[dow][i],0);
Veri('-',0);Veri('-',0);Veri('-',0);Veri('-',0);
if(!(program))// buton kontrol
    s++;
  if(s==1)
 if(!(arttir))
      {
      saat=read_ds1302(0x85);
 saat++;
        if((saat&(0x0F)==0x0A)) saat+=6; 
          if((saat>=0x24)) saat=0x00;
         write_ds1302(0x84,saat);
         }
   else if(!(azalt))
      {saat= read_ds1302(0x85);
        saat--;
         if((saat&(0x0F))==0x0F) saat-=6; 
         if(saat<=0x00) saat=0x24;
         write_ds1302(0x84,saat);
   }
      if (s==2)
    if(!(arttir))
        { dakika = read_ds1302(0x83);
         dakika++;
        if((dakika&0x0F)==0x0A) dakika+=6;
         if(dakika>=0x60) dakika=0x00;
         write_ds1302(0x82,dakika);
         }
       else if(!(azalt))
        {
         dakika=read_ds1302(0x83);
         dakika--;
         if((dakika&0x0F)==0x0F) dakika-=6;
         if(dakika<=0x00) dakika=0x60;
         write_ds1302(0x82,dakika);
         }
  if(s==3)
 if(!(arttir))
      {
         gun=read_ds1302(0x87);
         gun++;
         if((gun&(0x0F)==0x0A)) gun+=6;
         if((gun>=0x31)) gun=0x01;
         write_ds1302(0x86,gun);
         }
   else if(!(azalt))
      {gun=read_ds1302(0x87);
         gun--;
         if((gun&(0x0F))==0x0F) gun-=6;
         if(gun<=0x01) gun=0x31;
         write_ds1302(0x86,gun);
   }
   if(s==4)
 if(!(arttir))
      {
         ay=read_ds1302(0x89);
         ay++;
         if((ay&(0x0F)==0x0A)) ay+=6;
         if((ay>=0x12)) ay=0x01;
         write_ds1302(0x88,ay);
         }
   else if(!(azalt))

      {ay=read_ds1302(0x89);
         ay--;
         if((ay&(0x0F))==0x0F) ay-=6;
         if(ay<=0x01) ay=0x12;
         write_ds1302(0x88,ay);
   }
   if(s==5)
 if(!(arttir))
      {
         yil=read_ds1302(0x8D);
         yil++;
         if((yil&(0x0F)==0x0A)) yil+=6;
         write_ds1302(0x8C,yil);
         }
   else if(!(azalt))
      {yil=read_ds1302(0x8D);
         yil--;
         if((yil&(0x0F))==0x0F) yil-=6;
         write_ds1302(0x8C,yil);
   }
         if(s==6)
         {
   s=0;
}
}

Projenin Keil ve Proteus Dosyaları : 8051 RTC DS1302 ile LCD Gösterimli Dijital Saat

Dosya indirme LINK listesi (HTML formatında) link-4652.zip şifre-pass: 320volt.com

  • Akif

    RTC dosyasında hata var..

    veri=veri|(bit_oku()<<<4)|nibl); satırından kaynaklanıyor,sanırım..

  • kodlar yazıya eklenirken sorun olmuş olabilir yazının başında verilen dosyadaki kodları kullanın

  • Nazım

    arkadaşlar hex dosyası yok ve keil uvision4 de hex olusmuyor hata veriyor. Galiba c kodunda bir hata var. Yardımcı olursanız sevinirim.
    Derleyip çalıştırdığınız dosyayı rar halinde nazm_91@windowslive.com e-mail olarak atarsanız çok sevinirim

  • qwerty

    hex dosyasını oluşturamadım yardım edin arkadaşlar

  • mert

    HEX dosyasını oluşturamıyoruz büyük olduğu için, elinde olan avr ise paylaşsın lütfen.