Bu devre, alarmlı bir saat olarak kullanılması amacıyla tasarlanmıştır. Bu devre ile saati ve alarmı istediğimiz değere ayarlayabiliriz. Alarm ayarlanan (kurulan) saatte çalışır. Kristal osilatör referaslı olarak çalıştığı için bir kez ayarlandıktan sonra enerjisi kesilmediği takdirde geri kalma veya ileri gitme gibi sorunlar ortaya çıkmaz. Ayarlaması çok basit ve pratiktir. Saat ve alarm olarak verilen bütün değerler LCD displeyde gösterilmektedir.
Devrenin Çalışması ve Yapısı:
Devrede PIC 16F84 mikrokontrolör entegresi kullanılmıştır. Programı ise JAL ile hazırlanmıştır. Devreyi, saati ve aynı zamanda alarmı sıfırlamak amacıyla bir adet buton kullanılmıştır. PIC16F84 entegresinin 4 nolu RESET ucuna bağlı olan bu butona basılıp bırakıldığı anda devre, saat ve alarm değerleri sıfırlanır yani resetlenmiş olur. Saati, dakikayı ve alarm için saat ve dakika değerlerini ayarlamak amacıyla 4 adet buton kullanılmıştır. Aslında 4 adet buton sayı olarak bir devrede kullanım açısından bakıldığında biraz fazladır. Daha az sayıda buton ile ayarlama devresi yapılabilirdi. Benim buton sayısını fazla tutmaktaki amacım, devrenin JAL ile hazırlanan yazılımının (programının) sade olmasını sağlamaya yöneliktir. Saati ayarlamak için PIC16F84 entegresinin 18 nolu RA1 ucuna bağlı olan B2 butonuna basılınca o anda göstergede bulunan saat değeri bir artırılır. Sürekli basılı tutulursa yarım saniye aralıklarla saat değeri birer birer artar. Bu artırma sırasında saniyenin değeri ise sıfırlanır. Saat için her yapılan ayarlamadan sonra saniye değeri sıfırdan saymaya başlar. Dakikayı ayarlamak için, aynı saati ayarladığımız yöntemi kullanırız. Dakikayı ayarlamak için PIC16F84 entegresinin 17 nolu RA0 ucuna bağlı olan B1 butonuna basılınca o anda göstergede bulunan dakika değeri bir atırılır. Sürekli basılı tutulursa yarım saniye aralıklarla dakika değeri birer birer artar. Bu artırma sırasında saniyenin değeri ise sıfırlanır. Dakika için her yapılan ayarlamadan sonra saniye değeri sıfırdan saymaya başlar.
Alarmı ayarlamak için yine saat ve dakika ayarlaması için tanımladığımız alarm_saat ve alarm_dakika değişkenlerinin değerini artırıyoruz. Kullanım şekli itibariyle yukarıda anlatılan saat ve dakika ayarlamasında yapıldığı biçimde alarmı ayarlıyoruz. PIC 16F84'ün 1 nolu ucu (RA2) ile alarm için saati, 2 nolu ucu (RA3) ile de alarm için dakikayı ayarlıyoruz. Yaptığım denemelerde, alarmı ayarlarken saatin değerinde herhangi bir değişiklik olmamıştır.
Devrede 2 satırlı 16 karakterli LCD ekran kullanılmıştır. Göstergenin birinci satırında “Saat:” ve saatin gösterilecek değeri yazılıdır. İkinci satırda ise “Alarm:” ve ayarlanan alarmın gösterilecek değeri bulunmaktadır. LCD ekranın kontrast ayarını yapmak için RV1 10K ayarlı direnci kullanılmıştır.
Devrenin mikrokontrolör yazılımında sayıcı olarak Timer0 zamanlayıcı/sayıcı'sı kullanılmıştır. Timer0'ın zaman aşımı kesmesi özelliğinden yararlanılarak zaman ve saydırma işlemi gerçekleştirilmiştir. Devrede kullanılan kristalin frekansı 4.194304 Mhz olarak seçilmiştir. Programda kullanılan işlemler açık olarak yazıldığından ve bölümler halinde düzenlendiğinden yeterince bilgiyi içermektedir.
Devrenin Şeması:
Şekil 1: LCD göstergeli alarmlı ayarlı saat devresi şeması.
Devrenin JAL ile hazırlanan programı:
-- ====================================
-- mehmet.yilmaz@teknomerkez.net
-- 01.10.2007
-- LCD alarmli ayarli saat uygulamasi
-- ====================================
include 16f84_4 -- 4.194304 Mhz'lik kristal kullanilacak
include jlib
include hd447804 -- LCD ekran icin kullanilacak
-- === PORTLARIN YONLENDIRILMESI ===
port_a_direction = all_input
pin_b7_direction = output
-- === DEGISKENLER ===
var byte saat = 0
var byte dakika = 0
var byte saniye = 0
var byte clock = 0
var byte alarm_saat = 0
var byte alarm_dakika = 0
-- === AYARLAMALAR ===
hd44780_clear
-- === ALT PROGRAMLAR ===
procedure saat_yazisi is
hd44780 = "S"
hd44780 = "a"
hd44780 = "a"
hd44780 = "t"
hd44780 = ":"
hd44780 = " "
end procedure
procedure alarm_yazisi is
hd44780 = "A"
hd44780 = "l"
hd44780 = "a"
hd44780 = "r"
hd44780 = "m"
hd44780 = ":"
hd44780 = " "
end procedure
procedure saat_ayarla is
if pin_a1 == high then
saat = ( saat + 1 ) % 24
saniye = 0
delay_500ms
end if
if pin_a0 == high then
dakika = ( dakika + 1 ) % 60
saniye = 0
delay_500ms
end if
end procedure
procedure alarm_ayarla is
if pin_a2 == high then
alarm_saat = ( alarm_saat + 1 ) % 24
delay_500ms
end if
if pin_a3 == high then
alarm_dakika = ( alarm_dakika + 1 ) % 60
delay_500ms
end if
end procedure
procedure saat_sayaci is
pragma interrupt
clock = ( clock + 1 ) % 32
if clock == 0 then
saniye = ( saniye + 1 ) % 60
if saniye == 0 then
dakika = dakika + 1
if dakika == 60 then
dakika = 0
saat = saat + 1
if saat == 24 then
saat = 0
end if
end if
end if
end if
if saat == alarm_saat & dakika == alarm_dakika Then
pin_b7 = high
else
pin_b7 = low
end if
intcon_t0if = low
end procedure
option = 0b10000110 -- 1/128
tmr0 = 0
intcon_t0if = low
intcon_t0ie = true
intcon_gie = true
-- === PROGRAM BASI ===
forever loop
saat_ayarla
alarm_ayarla
hd44780_line1
saat_yazisi
print_decimal_2 ( hd44780, saat, "0" )
hd44780 = ":"
print_decimal_2 ( hd44780, dakika, "0" )
hd44780 = ":"
print_decimal_2 ( hd44780, saniye, "0" )
hd44780_line2
alarm_yazisi
print_decimal_2 ( hd44780, alarm_saat, "0" )
hd44780 = ":"
print_decimal_2 ( hd44780, alarm_dakika, "0" )
end loop
-- === PROGRAM SONU ===
Devrenin Resmi:
Resim 1: Tamamlanmış devrenin çalışır şekildeki görünümü.
Devrenin Malzeme Listesi:
U1: PIC 16F84
LCD1: İki satır LCD
D1: Kırmızı LED
R1, R2, R4, R5, R6: 470
R3: 1K
RV1: 1K trimpot
XTAL: 4.194304MHz
C1, C2: 22pF
B1-B5: Buton
BUZ1: BUZZER (+5V olanlardan)
Ekler:
JAL Devreye ait programın Jal ile hazırlanmış dosyasına bakmak için tıklayınız.
Devreye ait programın Jal ile hazırlanmış dosyasını sıkıştırılmış zip dosya olarak indirmek için tıklayınız.
Devreye ait programın HEX yazılım dosyasını indirmek için tıklayınız.