Şimdi Ara

PIC SAAT-ALARM-DERECE

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir (1 Mobil) - 1 Masaüstü1 Mobil
5 sn
3
Cevap
0
Favori
354
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • FORMDAKİ ARKADAŞLARLA PAYLAŞMAK İSTEDİM.
    Programı kendim yaptım.PORTC.0 SET düğmesi.Buna basılı tuttuğunuz zaman sırasıyla dakika-saat-hafta-gün ve ay ayarı yapılıyor.SET e bastıktan sonra PORTC.1 VE PORTC.2 ile yukarı aşağı yaparak istediğiniz değere getiriyorsunuz.Alarmı ayarlamak için PORTC.1 tuşunu basılı tutuyorsunuz.Ayarladığınız alarmı görmek içinde PORT.C.1 tuşunu basılı tutuyorsunuz.Isı için kalibrasyon yapmadım.Alarım vakti geldiğinde PORTC.7 çıkış veriyor.Siz bunu istediğiz çıkışla değiştirebilirsiniz.PIC olarak 16F877 veya 876 kullanılabilir.Son olarak PIC in enerjisi kesildiğinde son bilgileri hafızasında tutuyor.Tekrar enerji verildiğinde kaldığı yerden devem eder.Herkese çalışmalarında başarılar.


    DEFINE LCD_DREG PORTB
    DEFINE LCD_DBIT 4
    DEFINE LCD_EREG PORTB
    DEFINE LCD_EBIT 3
    DEFINE LCD_RSREG PORTB
    DEFINE LCD_RSBIT 2
    DEFINE LCD_BITS 4
    DEFINE LCD_LINES 2
    DEFINE LCD_COMMANBUS 2000 ;komut gecikme süresi mikrosaniye olarak
    DEFINE LCD_DATAUS 50 ;veri gecikme süresi mikrosaniye olarak

    DEFINE ADC_BITS 10 'A/D çevirim sonucu kaç bit olacak
    DEFINE ADC_CLOCK 3 'Clock kaynağı (3=rc)
    DEFINE ADC_SAMPLEUS 100 'Şarj zamanı mikro saniye cinsinden.

    ASAAT var byte
    SAAT var byte
    dSaat var byte ' Display de görünecek saat değişkeni
    ADAKIKA var byte
    DAKIKA var byte
    Saniye var byte
    SAY var byte ' Saniye parçacıkları
    Guncelle var byte ' LCD güncellenme durumu
    i var byte ' Döngü değişkeni

    GUN var WORD
    HAFTA var byte
    AY var byte
    YIL var byte
    ARA VAR BYTE
    ARA1 VAR BYTE
    AC VAR BYTE
    HAM VAR BYTE
    ISI VAR BYTE



    LCDOUT $FE,$40,7,5,7,0,0,0,0,0 'TÜRKÇE KARAKTER (0)
    LCDOUT $FE,$48,0,4,10,10,17,4,0,0 'TÜRKÇE KARAKTER (1) ZİL
    LCDOUT $FE,$68,$0E,$11,$10,$10,$10,$15,$0E,$4 'Ç 5
    LCDOUT $FE,$70,$00,$0E,$10,$0E,$02,$1C,$0C,$00 'ş 6
    LCDOUT $FE,$78,$0,$0,$0C,$4,$4,$4,$e,$0 'i 7

    TRISA = 255 ;PORTA GIRIŞ

    READ 0,DAKIKA
    READ 1,SAAT
    READ 2,HAFTA
    READ 3,GUN
    READ 4,AY
    READ 5,ADAKIKA
    READ 6,ASAAT
    READ 7,AC

    SYMBOL SET=PORTC.0
    SYMBOL YUKARI=PORTC.1
    SYMBOL ASAGI=PORTC.2



    ADCON1 = 0 ' ADCON1 REGISTERI SIFIRLANDI


    Saniye = 0
    SAY = 0

    Guncelle = 1 ' Güncelleme aktif

    ' TMR0 'ı her 16,384 milisaniyede kesecek şekilde kur.
    OPTION_REG = $55 ' TMR0 konfigurasyonunu ayarla ve PORTB pullup'larını etkinleştir.
    INTCON = $A0 ' TMR0 interrupt'ını etkinleştir.
    On Interrupt Goto KESME ' Interrupt oluşursa TickInt altprogramına git

    ANADONGU:




    KONTROL:
    If GUNCELLE = 1 Then

    WRITE 0,DAKIKA
    WRITE 1,SAAT
    WRITE 2,HAFTA
    WRITE 3,GUN
    WRITE 4,AY


    IF AC=0 THEN AYARLA
    IF AC=1 THEN ALARMCAL

    ALARMCAL:
    IF (SAAT+DAKIKA)= (ASAAT+ADAKIKA) THEN ALARMCAL1



    AYARLA:
    If ASAGI=1 Then ALARMGOR
    If YUKARI=1 Then ALARMARK
    If SET = 1 Then ARK

    IF AC=0 THEN ALARMYOK
    IF AC=1 THEN ALARMVAR

    ALARMGOR:
    LCDOUT $FE,1 ,dec2 dSaat, ":", dec2 Dakika, ":", dec2 Saniye," ",DEC3 ISI,"C",0
    Lcdout $FE,$C0,dec2 ASaat, ":", dec2 ADakika, ":", dec2 Saniye," ",1
    LOW PORTC.7
    GOTO ATLA
    ALARMYOK:
    LCDOUT $FE,1 ,dec2 dSaat, ":", dec2 Dakika, ":", dec2 Saniye," ",DEC3 ISI,"C",0
    Lcdout $FE,$C0,DEC2 GUN,"-",DEC2 AY,"-2007"
    LOW PORTC.7
    GOTO ATLA
    ALARMVAR:
    LCDOUT $FE,1 ,dec2 dSaat, ":", dec2 Dakika, ":", dec2 Saniye," ",1," ",DEC3 ISI,"C",0
    Lcdout $FE,$C0,DEC2 GUN,"-",DEC2 AY,"-2007"
    LOW PORTC.0
    GOTO ATLA
    ALARMCAL1:

    LCDOUT $FE,1 ,dec2 dSaat, ":", dec2 Dakika, ":", dec2 Saniye," ",1," ",DEC3 ISI,"C",0
    Lcdout $FE,$C0," ALARM CALIYOR"
    HIGH PORTC.7
    If SET = 1 Then SUSTUR
    GOTO SAATCEVRIM
    SUSTUR:
    LOW PORTC.7
    AC=0
    WRITE 7,AC

    ATLA:
    ARA=HAFTA
    select case ARA
    case 0
    lcdout $fe,$CB,"Pazar"
    case 1
    lcdout $fe,$CB,"Pts."
    case 2
    lcdout $fe,$CB,"Sal",7
    case 3
    lcdout $fe,$CB,5,"ar."
    case 4
    lcdout $fe,$CB,"Per."
    case 5
    lcdout $fe,$CB,"Cuma"
    case 6
    lcdout $fe,$CB,"Cts."
    end select

    SAATCEVRIM:
    DSAAT = SAAT ' Saati 0-12 aralığına getir
    If (SAAT // 24) = 0 Then
    Endif

    If SAAT < 24 Then


    Endif

    Guncelle = 0 ' EkranI güncelle

    Endif
    Goto ANADONGU ' Sonsuz döngü sağla


    ARK:
    LCDOUT $FE,1,"== SAAT AYARI =="
    LCDOUT $FE,$C0,"DAKIKA: ",DEC2 DAKIKA
    ARK1:
    If SET= 0 Then AYAR
    GOTO ARK1

    AYAR:

    DAKIKA1::
    LCDOUT $FE,1,"== SAAT AYARI =="
    LCDOUT $FE,$C0,"DAKIKA: ",DEC2 DAKIKA
    PAUSE 100
    IF SET=1 THEN SAAT1
    if YUKARI=1 then
    DAKIKA=DAKIKA+1
    if DAKIKA>=60 then
    DAKIKA=0

    pause 100
    endif
    endif
    if ASAGI=1 then
    DAKIKA=DAKIKA-1
    if DAKIKA>=60 then
    DAKIKA=59

    PAUSE 100
    ENDIF
    endif
    GOTO DAKIKA1

    SAAT1:
    If SET= 0 Then SAAT2
    GOTO SAAT1

    SAAT2:
    LCDOUT $FE,1,"== SAAT AYARI =="
    LCDOUT $FE,$C0,"SAAT: ",DEC2 SAAT
    PAUSE 100
    IF SET=1 THEN HAFTA1
    if YUKARI=1 then
    SAAT=SAAT+1
    if SAAT>=24 then
    SAAT=0

    pause 100
    endif
    endif
    if ASAGI=1 then
    SAAT=SAAT-1
    if SAAT>=24 then
    SAAT=23

    PAUSE 100
    ENDIF
    endif
    GOTO SAAT2

    HAFTA1:
    If SET= 0 Then HAFTA2
    GOTO HAFTA1

    HAFTA2:
    LCDOUT $FE,1,"== GUN AYARI =="
    Lcdout $FE,$C0,"HAFTA:",DEC1 HAFTA
    Lcdout $FE,$C0
    ARA=HAFTA
    select case ARA
    case 0
    lcdout $fe,$C9,"Pazar"
    case 1
    lcdout $fe,$C9,"Pts."
    case 2
    lcdout $fe,$C9,"Sal",7
    case 3
    lcdout $fe,$C9,5,"ar."
    case 4
    lcdout $fe,$C9,"Per."
    case 5
    lcdout $fe,$C9,"Cuma"
    case 6
    lcdout $fe,$C9,"Cts."
    end select

    PAUSE 100
    IF SET=1 THEN GUN1
    if YUKARI=1 then
    HAFTA=HAFTA+1
    if HAFTA>=7 then
    HAFTA=0

    pause 100
    endif
    endif
    if ASAGI=1 then
    HAFTA=HAFTA-1
    if HAFTA>=7 then
    HAFTA=6

    PAUSE 100
    ENDIF
    endif
    GOTO HAFTA2

    GUN1:
    If SET= 0 Then GUN2
    GOTO GUN1

    GUN2:
    LCDOUT $FE,1,"== TARIH AYARI =="
    LCDOUT $FE,$C0,"GUN: ",DEC2 GUN
    PAUSE 100
    IF SET=1 THEN AY1
    if YUKARI=1 then
    GUN=GUN+1
    if GUN>=32 then
    GUN=1

    pause 100
    endif
    endif
    if ASAGI=1 then
    GUN=GUN-1
    if GUN>=32 OR GUN=0 then
    GUN=31

    PAUSE 100
    ENDIF
    endif
    GOTO GUN2

    AY1:
    If SET= 0 Then AY2
    GOTO AY1

    AY2:
    LCDOUT $FE,1,"== TARIH AYARI =="
    Lcdout $FE,$C0,"AY: ",DEC2 AY


    PAUSE 100
    IF SET=1 THEN ARK2
    if YUKARI=1 then
    AY=AY+1
    if AY>=13 then
    AY=1

    pause 100
    endif
    endif
    if ASAGI=1 then
    AY=AY-1
    if AY>=13 OR AY=0 then
    AY=12


    PAUSE 100
    ENDIF
    endif
    GOTO AY2

    ARK2:
    If SET= 0 Then KONTROL
    GOTO ARK2
    ;---------------------ALARM RUTİNİ--------------------
    ALARMARK:
    LCDOUT $FE,1,"= ALARM AYARI ="


    ALARMARK1:
    If YUKARI= 0 Then ALARM
    GOTO ALARMARK1

    ALARM:
    ADAKIKA1::
    LCDOUT $FE,1,"= ALARM AYARI ="
    LCDOUT $FE,$C0,"DAKIKA: ",DEC2 ADAKIKA
    PAUSE 100
    IF SET=1 THEN ASAAT1
    if YUKARI=1 then
    ADAKIKA=ADAKIKA+1
    WRITE 5,ADAKIKA
    if ADAKIKA>=60 then
    ADAKIKA=0

    pause 100
    endif
    endif
    if ASAGI=1 then
    ADAKIKA=ADAKIKA-1
    WRITE 5,ADAKIKA
    if ADAKIKA>=60 then
    ADAKIKA=59

    PAUSE 100
    ENDIF
    endif
    GOTO ADAKIKA1

    ASAAT1:
    If SET= 0 Then ASAAT2
    GOTO ASAAT1

    ASAAT2:
    LCDOUT $FE,1,"= ALARM AYARI ="
    LCDOUT $FE,$C0,"SAAT: ",DEC2 ASAAT
    PAUSE 100
    IF SET=1 THEN ADEVRE
    if YUKARI=1 then
    ASAAT=ASAAT+1
    WRITE 6,ASAAT
    if ASAAT>=24 then
    ASAAT=0

    pause 100
    endif
    endif
    if ASAGI=1 then
    ASAAT=ASAAT-1
    WRITE 6,ASAAT
    if ASAAT>=24 then
    ASAAT=23

    PAUSE 100
    ENDIF
    endif
    GOTO ASAAT2

    ADEVRE:
    If SET= 0 Then ADEVRE1
    GOTO ADEVRE

    ADEVRE1:
    LCDOUT $FE,1,"= ALARM AYARI ="
    if AC=0 then ALARM5
    if AC=1 then ALARM6
    ALARM5:
    LCDOUT $FE,1,"= ALARM AYARI ="
    Lcdout $FE,$C0," KAPALI"
    GOTO GEC
    ALARM6:
    LCDOUT $FE,1,"= ALARM AYARI ="
    Lcdout $FE,$C0," ",1,1," ACIK ",1,1
    GEC:
    pause 200
    IF SET=1 THEN ARK2
    if YUKARI=1 then
    AC=AC+1
    ARA1=AC
    WRITE 7,AC
    if AC>=2 then
    AC=0

    endif
    endif

    GOTO ADEVRE1


    disable


    KESME:



    ADCIN 0,HAM

    ISI=HAM*100/51



    SAY = SAY + 1 ' SANİYE SAY
    If SAY < 61 Then SAYDIR ' 61 * 16,384ms = 1 sn

    SAY = 0

    Saniye = Saniye + 1
    If Saniye >= 60 Then
    Saniye = 0

    Dakika = Dakika + 1
    If Dakika >= 60 Then
    Dakika = 0

    Saat = Saat + 1
    If Saat >= 24 Then
    Saat = 0

    HAFTA = HAFTA + 1
    GUN = GUN + 1
    If GUN >= 31 Then
    GUN = 1
    AY = AY + 1
    If HAFTA >= 7 Then
    HAFTA = 0


    If AY >= 12 Then
    AY = 1

    Endif
    Endif
    Endif
    ENDIF
    ENDIF
    ENDIF
    Guncelle = 1 ' Ekran güncellenmesi aktif

    SAYDIR:
    INTCON.2 = 0 ' Timer Interrupt bayrağını sıfırla
    Resume

    End







  • Yaptığınız projeyi paylaştığınız için kendi adıma teşekkür ederim

    Fakat picin timer kesmesi bildiğiniz üzere tam olarak 1 sn de kesme yapmıyor.Bundan dolayı saatte sürekli bir kayma olacaktır.Acaba bir saat entegresi ile yapılsa daha kullanışlı olmaz mıydı?

    Teşekkürler
  • 90alper90 Söylediğin doğru.Ama ben bir haftadır kullanıyorum.Yaklaşık 3-4 sn. bir sapma oluyor.FORMULA 1 de kullanmıyacağımıza göre çokta önemsemedim.
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.