Elektronik / Mikrodenetleyici Projeleri/

Alarm Saat (picbasic pro, pic16f877, pcf8583)

Sponsorlu Bağlantılar

Saatin kurulması için: SET tuşuna basın. Köşeli parantez içini 00 da bırakıp MOD tuşu ile saat ayarına atlayın.Saati ayarladıktan sonra MOD tuşu ile dakika ve sırası ile Ay-Gün ve Yıl ayarlarını yapın. Sonunda SET tuşuna basıp ayar modundan çıkın.

Dikkat: [00] modu saat ayarı içindir. [01] ile [10] arası modlar alarmların SET edilmesi içindir.

Açma Alarmlarının Kululması: SET Tuşuna basın. Parantez içini 1. alarm için 1, 10. alarm için 10`a ayarlayın. MOD tuşu ile Saat, Dakika, Gün, Ay, Yıl ayarlarını yapıp SET tuşu ile Kayıt edin.

Kapatma Alamlarının Ayarlanması: SET Tuşuna basın. Parantez içini 1. alarmın kapatılması için 11`e 10. alarmın kapatılması için 20`ye getirin. MOD tuşu ile Saat, Dakika, Gün, Ay, Yıl ayarlarını yapıp SET tuşu ile kayıt edin

Alarmların Tek Tuşla İptal Edilmesi: Açılmış alarm var ise normal saat ekranında, Arttır ya da azalt tuşlarından birine basılması açık olan alarmları kapatır.

Alarm Saat Uygulamasına ait picbasic pro ve proteus isis dosyaları: Alarm Saat (picbasic pro, pic16f877, pcf8583)

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

Alarm Saat isis devre şeması

picbasic-pro-pic16f877-pcf8583

ALRM-SAAT.bas yazılım içeriği


'****************************************************************
'*  Name    : ALARM-SAAT.BAS                                    *
'*  Author  : [ETE]                                             *
'*  Notice  : Copyright (c) 2005 [ETE]                          *
'*          : All Rights Reserved                               *
'*  Date    : 11.05.2005                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
'INCLUDE "modedefs.bas"
@ DEVICE pic16F877 'işlemci 16F877
@ DEVICE pic16F877, WDT_on 'Watch Dog timer AÇIK
@ DEVICE pic16F877, PWRT_ON 'Power on timer açık
@ DEVICE pic16F877, PROTECT_OFF 'Kod KORUMA kapalı
@ DEVICE pic16F877, HS_OSC 'HS osilatör kullanılacak
'------------------------------------------------------------------------------
DEFINE LCD_DREG PORTB  'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4  'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 2 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor
'------------------------------------------------------------------------------
Define osc 10
ADCON1=7 'ADC GİRİŞLERİ DİGİTAL
OPTION_REG.7=1 'Dahili pull-up lar iptal edildi
PortA=0
TrisA=%00101111
PortB=0
TrisB=%00000010
PORTD=0
TRISD=0
PORTC=0
TRISC=0
'------------------------------------------------------------------------------
SYMBOL SET=PORTA.0
SYMBOL MODE=PORTA.1
SYMBOL DOWN=PORTA.2
SYMBOL UP=PORTA.3
Symbol SCL=PORTB.0
SYMBOL SDA=PORTB.1
SYMBOL ISIK=PORTC.0
symbol BUZER=PORTC.1
SIMDI  VAR  WORD
ZAMAN  VAR  WORD
SN     var  byte
Y_SN   VAR  BYTE
DAK    var  byte
Y_DAK  VAR  BYTE
ESKIDAK VAR BYTE
SAAT   var  byte
Y_SAAT VAR  BYTE
GUN    VAR  BYTE
Y_GUN  VAR  BYTE
HGUN   VAR  BYTE 'HAFTANIN GÜNÜ
Y_HGUN var  byte
AY     var  byte
Y_AY   VAR  BYTE
YIL    var  BYTE
Y_YIL  VAR  BYTE
ESKYIL VAR  BYTE
TAMYIL var  BYTE
TEMP   VAR  BYTE
ARA    VAR  BYTE
ONLAR  VAR  BYTE
BIRLER VAR  BYTE
SURE   VAR  BYTE
SIRA   VAR  BYTE
YER    VAR  BYTE
AKTIFA VAR  BYTE
AKTIFB VAR  BYTE
LED    var  byte
'------------------------------------------------------------------------------
LCDOUT $FE,$68,$0E,$11,$10,$10,$10,$15,$0E,$4 'Ç dataları Numarası 5
LCDOUT $FE,$70,$00,$0E,$10,$0E,$02,$1C,$0C,$00  'ş dataları NUMARSI 6 DİR
LCDOUT $FE,$78,$0,$0,$0C,$4,$4,$4,$e,$0 'ı dataları NUMARSI 7 DİR
clear
lcdout $FE,1
PAUSE 200
SURE=180
'WRITE 0,255
READ 0,TAMYIL
IF TAMYIL=255 THEN
TAMYIL=8
WRITE 0,TAMYIL
ENDIF
READ 2,SIRA
IF SIRA=255 THEN
SIRA=1:WRITE 2,SIRA
ENDIF
Y_SN=0
rEAD 5,AKTIFA
READ 6,AKTIFB
IF AKTIFA=255 THEN
AKTIFA=0:WRITE 5,AKTIFA:PAUSE 10
ENDIF

IF AKTIFB=255 THEN
AKTIFB=0:WRITE 6,AKTIFB:PAUSE 10
ENDIF

'------------------------------------------------------------------------------
'------------------------------------------------------------------------------

BASLA: 'PAUSE 100
GOSUB SAAT_OKU
GOSUB EKRAN
PAUSE 200
IF PORTD>0 or (PORTC & %11000000)>63 then
IF UP=0 or DOWN=0 then
PORTC=0:PORTD=0
ENDIF
endif
IF SET=0 THEN AYAR
IF (ESKIDAK=DAK) THEN TEKRAR
ESKIDAK=DAK
GOSUB ALARM_KONTROL
PORTD=AKTIFA:PORTC=AKTIFB
TEKRAR:
GOTO BASLA

'-------------------------ALT PROGRAMLAR---------------------------------------
AYAR:  YER=0:ISIK=0
lcdout $FE,$0E
GOSUB SAAT_OKU
Y_DAK=DAK
Y_SAAT=SAAT
Y_GUN =GUN
Y_HGUN=HGUN
Y_AY  =AY
Y_YIL =YIL
GOSUB EKRAN1
WHILE SET=0
WEND
PAUSE SURE

SIRA_BELIRLE:
IF MODE=0 THEN HOURA
IF SET=0 THEN SONA
IF UP=0 THEN
YER=YER+1
IF YER=21 THEN YER=20
ENDIF
IF DOWN=0 THEN
YER=YER-1
IF YER=255 THEN YER=0 'SIRA=0 İSE GERÇEK ZAMAN SAATİ 8583'E KAYIT EDİLECEK
ENDIF
IF YER>0 THEN GOSUB ALARM_OKU
GOSUB EKRAN1:LCDOUT $FE,$82 'SIRA>0 İSE ALARM EEPROME KAYIT EDİLECEK.
PAUSE SURE
GOTO SIRA_BELIRLE

HOURA: WHILE MODE=0
WEND
HOUR:
IF MODE=0 THEN MINA
IF SET=0 THEN SONA
IF UP=0 THEN

Y_SAAT=Y_SAAT+1
IF Y_SAAT=24 THEN Y_SAAT=0
ENDIF

IF DOWN=0 THEN
Y_SAAT=Y_SAAT-1
IF Y_SAAT=255 THEN Y_SAAT=23
ENDIF
GOSUB EKRAN1:LCDOUT $FE,$86
PAUSE SURE
GOTO HOUR

MINA:  WHILE MODE=0
WEND

MINUTE:IF MODE=0 THEN TAKA
IF SET=0 THEN SONA
IF UP=0 THEN
Y_DAK=Y_DAK+1
IF Y_DAK=60 THEN  Y_DAK=0
ENDIF
IF DOWN=0 THEN
Y_DAK=Y_DAK-1
IF Y_DAK=255 THEN Y_DAK=59
ENDIF
GOSUB EKRAN1:LCDOUT $FE,$89
PAUSE SURE
GOTO MINUTE

TAKA:  WHILE MODE=0
WEND
TAKVIM:
IF MODE=0 THEN AYA
IF SET=0 THEN SONA
IF UP=0 THEN
Y_GUN=Y_GUN+1
IF Y_GUN=32 THEN  Y_GUN=1
ENDIF
IF DOWN=0 THEN
Y_GUN=Y_GUN-1
IF Y_GUN=0 THEN  Y_GUN=31
ENDIF
GOSUB EKRAN1:LCDOUT $FE,$C1
PAUSE SURE
GOTO TAKVIM

AYA:   WHILE MODE=0
WEND
MONTH:
IF MODE=0 THEN YILA
IF SET=0 THEN SONA
IF UP=0 THEN
Y_AY=Y_AY+1
IF Y_AY=13 THEN  Y_AY=1
ENDIF
IF DOWN=0 THEN
Y_AY=Y_AY-1
IF Y_AY=0 THEN  Y_AY=12
ENDIF
GOSUB EKRAN1:LCDOUT $FE,$C4
PAUSE SURE
GOTO MONTH

YILA:  WHILE MODE=0
WEND
YEAR:  IF MODE=0 THEN GUNA
IF SET=0 THEN SONA
IF UP=0 THEN
Y_YIL=Y_YIL+1
IF Y_YIL=100 THEN  Y_YIL=0
ENDIF
IF DOWN=0 THEN
Y_YIL=Y_YIL-1
IF Y_YIL=0 THEN  Y_YIL=99
ENDIF
GOSUB EKRAN1:LCDOUT $FE,$C7
PAUSE SURE
GOTO YEAR

GUNA: WHILE MODE=0
WEND
HAFGUN:IF MODE=0 THEN SONA
IF SET=0 THEN SONA
IF UP=0 THEN
Y_HGUN=Y_HGUN+1
IF Y_HGUN=8 THEN  Y_HGUN=1
ENDIF
IF DOWN=0 THEN
Y_HGUN=Y_HGUN-1
IF Y_HGUN=255 THEN  Y_HGUN=7
ENDIF
GOSUB EKRAN1:LCDOUT $FE,$CA
PAUSE SURE
GOTO HAFGUN

SONA:IF YER=0 THEN KAYIT
GOSUB ALARM_KAYIT
GOTO BASLA
'-------------------------------------------------------------------------------
EKRAN:
LCDOUT $FE,2,"    "
LCDOUT DEC2(SAAT),":",DEC2(DAK),":", dec2(SN),"   "
'       LCDOUT DEC2 (SAAT),":",DEC2 (DAK)," S=",DEC2 SIMDI,"Z=",DEC2 ZAMAN
LCDOUT $FE,192,dec2(GUN),"-",dec2(AY),"-",dec2(YIL+TAMYIL)
ARA=HGUN
DORT: select case ARA
case 1
lcdout $fe,$c9,"Pazar  "
case 2
lcdout $fe,$c9,"Pazrtsi"
case 3
lcdout $fe,$c9,"Sal",7,"   "
case 4
lcdout $fe,$c9,5,"ar",6,"amb"
case 5
lcdout $fe,$c9,"Per",6,"emb"
case 6
lcdout $fe,$c9,"Cuma   "
case 7
lcdout $fe,$c9,"Cumarts"
end select
RETURN

EKRAN1: 'BU EKRAN SAAT AYARINDA KULLANILAN İLK EKRAN
LCDOUT $FE,2,"[",dec2 YER,"]"
LCDOUT $FE,$0C," "
LCDOUT DEC2(Y_SAAT),":",DEC2(Y_DAK),":", DEC2(SN)
LCDOUT $FE,192,dec2(Y_GUN),"-",dec2(Y_AY),"-",dec2(Y_YIL+TAMYIL) ,$FE,$0E
ARA=Y_HGUN
GOTO DORT

'-------------------------------------------------------------------------------
KAYIT:WHILE set=0
wend
LCDOUT $FE,$0C     'REG_2  'SANIYE <0:5>
TEMP=Y_YIL+TAMYIL  'REG_3  'DAKİKA <0:5>
TAMYIL=4*(TEMP/4 ) 'REG_4  'SAAT   <0:5>
Y_YIL=TEMP-TAMYIL  'REG_5  'GUN    <0:5> ; YIL  <6:7>
WRITE 0,TAMYIL     'REG_6  'AY     <0:4> ; HAFTANIN GUNU <5:7>

DAKHESAP:
TEMP=Y_DAK:GOSUB HESAP
Y_DAK=ONLAR+BIRLER

SAATHESAP:
TEMP=Y_SAAT:GOSUB HESAP
Y_SAAT=ONLAR+BIRLER
IF TEMP>12 THEN Y_SAAT.6=1

GUNHESAP:
TEMP=Y_GUN:GOSUB HESAP
Y_YIL=Y_YIL<<6
Y_GUN=Y_YIL+ONLAR+BIRLER

AYHESAP:
TEMP=Y_AY:GOSUB HESAP
Y_HGUN=Y_HGUN<<5
Y_AY=Y_HGUN + ONLAR + BIRLER

I2CWRITE SDA,SCL,160,2,[Y_SN,Y_DAK,Y_SAAT,Y_GUN,Y_AY]
GOSUB SAAT_OKU
lcdout $fe,1
GOTO BASLA
HESAP:
ARA=(TEMP/10)
ONLAR=ARA<<4       BIRLER=TEMP-(ara*10)       RETURN '-------------------------------------------------------------------------------

SAAT_OKU:ESKYIL=YIL       I2CREAD SDA,SCL,161,2,[SN,DAK,SAAT,GUN,AY]       YIL.1=GUN.7       YIL.0=GUN.6       IF ESKYIL=3 AND YIL=0 THEN          TAMYIL=TAMYIL+4          WRITE 0,TAMYIL       ENDIF          TEMP=AY       HGUN=TEMP>>5
SN=SN&%00111111
TEMP=DAK:gosub BUL:DAK=TEMP
TEMP=SAAT&%00111111:GOSUB BUL:SAAT=TEMP
TEMP=GUN&%00111111:GOSUB CEVIR:GUN=TEMP
TEMP=AY&%00011111:GOSUB IKI:AY=TEMP
RETURN

CEVIR:
ONLAR=TEMP & 48
UC:   ONLAR=(onlar>>4)*10
BIR:  BIRLER=TEMP & %1111
TEMP=ONLAR+BIRLER
RETURN
BUL:ONLAR=(TEMP>>4)*10
GOTO BIR
IKI:  ONLAR=ay & 16
GOTO UC

'-------------------------------------------------------------------------------
ALARM_KONTROL: '------------------Alarm açma kontrolu--------------------------
SIMDI=YIL+AY+GUN+SAAT+DAK
YER=1
GOSUB ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD | %00000001
YER=2
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD | %00000010
YER=3
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD | %00000100
YER=4
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD | %00001000
YER=5
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD | %00010000
YER=6
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD | %00100000
YER=7
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD | %01000000
YER=8
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD | %10000000
YER=9
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTC | %01000000
YER=10
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTC | %10000000

'--------------------ALARM KAPATMA  KONTROLU ----------------------------------
YER=11
GOSUB ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD & %11111110
YER=12
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD & %11111101
YER=13
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD & %11111011
YER=14
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD & %11110111
YER=15
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD & %11101111
YER=16
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD & %11011111
YER=17
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD & %10111111
YER=18
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTD & %01111111
YER=19
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTC & %10111111
YER=20
gosub ALARM_OKU
IF SIMDI=ZAMAN THEN PORTD=PORTC & %01111111
IF (PORTD=AKTIFA) AND (PORTC=AKTIFB) THEN CIK
AKTIFA=PORTD:AKTIFB=PORTC
WRITE 5,AKTIFA:PAUSE 10:WRITE 6,AKTIFB:PAUSE 10
CIK:     RETURN

ALARM_KAYIT:
IF YER>SIRA THEN
WRITE 2,YER:PAUSE 10
ENDIF
temp=yer*8
WRITE TEMP,Y_SAAT:PAUSE 10
WRITE TEMP+1,Y_DAK:PAUSE 10
WRITE TEMP+2,Y_GUN:PAUSE 10
WRITE TEMP+3,Y_AY :PAUSE 10
WRITE TEMP+4,Y_YIL:PAUSE 10
RETURN

ALARM_OKU:
temp=yer*8
READ TEMP,Y_SAAT:IF Y_SAAT>23 THEN Y_sAAT=0
READ TEMP+1,Y_DAK:IF Y_DAK>59 THEN Y_DAK=0
READ TEMP+2,Y_GUN:IF Y_GUN>31 THEN y_GUN=1
READ TEMP+3,Y_AY :IF Y_AY>12 THEN Y_AY=1
READ TEMP+4,Y_YIL:IF Y_YIL>99 THEN Y_YIL=0
ZAMAN=Y_YIL+Y_AY+Y_GUN+Y_SAAT+Y_DAK
RETURN

end

  • murat solak

    saat saniyesi neden 10’ncu saniyeden sonra 16 saniye’ye zıplıyor?

  • ete

    Bir sürü saat projesi tasarladım ama hiç birisini fiziki olarak yapmadım.

    Buda onlardan bir tanesi idi. Gerçi bu projeyi istek üzerine yapmıştım ve yanlış hatırlamıyorsam birileri bunu yaptı ve sorun yok idi.

    Bu zıplama olayı gerçek devredemi yoksa simulasyondamı oluyor?.

    Gerçi fark etmez ama simulasyonda oluyor ise normaldir.

    Gerçek devrede oluyor ise muhtemelen saat kristalinden yada saat entegresinden oluyordur.

    Başka da bir diyeceğim yok maalesef.

    Program bayağı eski neredeyse 5 yıldan fazla oldu bunu yapalı. Biraz daha acemilik yıllarımda yapılmış bir proje diyebilirim. O yüzden programa şöytle bir baktım. Her bir program çevrimi 1 sn (1000 ms) içinde yapılmalı. Baktım o kadar vakit alacak bir komut yok programda.

    Başlarda bir ;

    PAUSE 200 koymuşum gerekirse bunu kaldırabilirsin.

    Kolay Gelsin
    Ete