Relógio Circuitos Pic Basic com PIC16F628 e um Termômetro

sábado, 10 de julho de 2010 0 comentários


PIC-16F628 CLOCK e termômetro feito pelo Circuito 7

percebi que eu explico abaixo as várias fases de relógio e termômetro. O sensor de temperatura é utilizado em todos os DS18B20 projetos.

Circuito-1: Este sinal de clock do circuito criado por método de corte. LCD display usado como um indicador. DS18B20 sensor utilizado como um sensor de calor.

    clique na imagem p/ Ampliar

'*********************************
'*  Name    : KESMETMR0.BAS
'*  Author  : [Erol Tahir Erdal]
'*  Notice  : Copyright (c) 2005 [ETE]
'*          : All Rights Reserved
'*  Date    : 23.04.2005
'*  Version : 1.0
'*  Notes   :
'*          : (1) LCD
'*********************************
PORTA=0:portb=0
TRISB=%11110000   'PortB tamamı giriş yapıldı.
TRISA=000111   'A portu tamamı çıkış yapıldı.
'----------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628
@ DEVICE pic16F628, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off            'MCLR pini kullanılıyor.
@ DEVICE pic16F628, XT_OSC
'@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili 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 RWREG    PORTB   'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT    2       'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 1  '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 4
'-----------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'-----------------------------------------------------------------
Comm_Pin    VAR Portb.0     ' One-wire Data-Pin "DQ" PortB.0 da
Busy        VAR BIT         ' Busy Status-Bit
HAM         VAR WORD        ' Sensör HAM okuma değeri
ISI         VAR WORD        ' Hesaplanmış ISI değeri
Float       VAR WORD        ' Holds remainder for + temp C display
X           VAR WORD
SIGN_BITI   VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
NEGAT_ISI   CON 1           ' Negatif_Cold = 1
Deg         CON 223         ' ° işareti
SIGN        VAR BYTE        '  ISI değeri için  +/-  işaret
TEMP        VAR BYTE         ' Div32 bit hesap için geçici değişken
SAYAC       VAR   BYTE
SN          VAR   BYTE
DAK         VAR   BYTE
SAAT        VAR   BYTE
GUN         VAR   BYTE
symbol  SEC=PORTA.0
SYMBOL  YUKARI=PORTA.2
SYMBOL  ASAGI =PORTA.1
'------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
PAUSE 200
LCDOUT $FE,1

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

BASLA:
      GOSUB EKRAN0        'SAATİ EKRANA YAZ
      if SEC=0 THEN AYAR  'MODE TUŞUNA BASILMIŞ İSE AYAR'A GİT
      gosub SENSOROKU     'SONSÖR OKU VE SICAKLIĞI EKRANA YAZ
      GOTO BASLA

EKRAN0:
       LCDOUT $FE,$84,DEC2 SAAT,":",DEC2 DAK:RETURN

AYAR:
       WHILE SEC=0
       WEND
HOUR:  GOSUB EKRAN0
       LCDOUT $FE,$84
       lcdout $FE,$0E  'ÇİZGİLİ KURSÖR AÇIK
       IF SEC=0 THEN MINBIR
       IF YUKARI=0 THEN
          SAAT=SAAT+1
          IF SAAT=24 THEN SAAT=0
        ENDIF
        IF ASAGI=0 THEN
           SAAT=SAAT-1
           IF SAAT=255 THEN SAAT=23
        ENDIF
        GOSUB GECIKME
        GOTO HOUR

MINBIR: WHILE SEC=0
        WEND

MINUTE: GOSUB EKRAN0
       LCDOUT $FE,$87
        IF SEC=0 THEN SECBIR
        IF YUKARI=0 THEN
           DAK=DAK+1
           IF DAK=60 THEN DAK=0
        ENDIF
        IF ASAGI=0 THEN
           DAK=DAK-1
           IF DAK=255 THEN DAK=59
        ENDIF
        GOSUB GECIKME
        GOTO MINUTE

SECBIR: WHILE SEC=0
        WEND
SECOND:
        GOSUB EKRAN0
        LCDOUT $FE,$8A
        IF SEC=0 THEN ARA
        IF YUKARI=0 THEN
           SN=SN+1
           IF SN=60 THEN SN=0
        ENDIF
        IF ASAGI=0 THEN
           SN=SN-1
           IF SN=255 THEN SN=0
        ENDIF
        GOSUB GECIKME
        GOTO SECOND

GECIKME:
        FOR X=0 TO 1800
        PAUSEUS 100
        NEXT
        RETURN

ARA:    LCDOUT $FE,$0C
        WHILE SEC=0
        wend
'        gosub GECIKME
        goto BASLA

'-------ISI SENSÖR OKUMA BÖLÜMÜ ----------
SENSOROKU:
           'ham=$FE6F:Gosub hesapla:RETURN bu satır normal devrede silinecek
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN

Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-"
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10
       GOTO GEC
    endif
    TEMP = 625 * (HAM+1)        '
    ISI = DIV32 10          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    FLOAT = (ISI //1000)/100
    ISI=ISI/1000
    LCDOUT $FE,$C4,Sign,DEC ISI,".",DEC1 (Float)," ",Deg,"C " '2. satırda ısı
    RETURN

DISABLE
KESME:
      SAYAC=SAYAC+1  'kesme sayacı  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
      IF SAYAC=61 then  '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0        'sayaç sıfırlanıyor
          SN=SN+1
          toggle portb.0       'saniye değeri bir artırılıyor
            IF SN=60 THEN  'saniye 60 olmuş ise 1 dakika süre geçti ohalde
              SN=0        ' saniye sıfırlanıyor
               DAK=DAK+1   ' dakika değeri bir artırılıyor
                  IF DAK=60 then   'dakika 60 olmuş ise 1 saat süre geçti
                     DAK=0         ' dakika sıfırlanıyor
                     SAAT=SAAT+1   ' saat değeri bir artırılıyor
                        IF SAAT=24 THEN  'saat 24 olmuş ise 1 gün geçti
                           SAAT=0        'saat sıfırlanıyor
'                           GUN=GUN+1     'gün değeri bir artırılıyor
'                              IF GUN=365 THEN GUN=0  'gün 365 olmuş ise
                        endif                    'gün sıfırlanıyor 1 yıl geçti
                  ENDIF
            ENDIF
           lcdout $fe,$89,":",DEC2 SN
          ENDIF
CIK:     INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE

END


Circuito 2: Este circuito como um indicador da hora e minuto, eu uso o display de 7 segmentos.  também o sinal de tempo gerado pelo método.



'*****************************
'*  Name    : KESMETMR0.BAS
'*  Author  : [Erol Tahir Erdal]
'*  Notice  : Copyright (c) 2005 [ETE]
'*          : All Rights Reserved
'*  Date    : 23.04.2005
'*  Version : 1.0
'*  Notes   :
'*          :   LED (2)
'*****************************
PORTA=0:portb=0
TRISB=0   'PortB tamamı giriş yapıldı.
TRISA=000111  'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628
@ DEVICE pic16F628, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off            'MCLR pini kullanılıyor.
'@ DEVICE pic16F628, XT_OSC
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'---------------------------------------------------------------
'DEFINE OSC 4
'----------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'----------------------------------------------------------------
Comm_Pin    VAR PortA.4     ' One-wire Data-Pin "DQ" PortB.0 da
Busy        VAR BIT         ' Busy Status-Bit
HAM         VAR WORD        ' Sensör HAM okuma değeri
ISI         VAR WORD        ' Hesaplanmış ISI değeri
Float       VAR WORD        ' Holds remainder for + temp C display
X           VAR WORD
Y           VAR BYTE
SAYI        VAR BYTE
SIGN_BITI   VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
NEGAT_ISI   CON 1           ' Negatif_Cold = 1
Deg         CON 223         ' ° işareti
SIGN        VAR BYTE        '  ISI değeri için  +/-  işaret
TEMP        VAR BYTE         ' Div32 bit hesap için geçici değişken
SAYAC       VAR   BYTE
SN          VAR   BYTE
DAK         VAR   BYTE
SAAT        VAR   BYTE
GUN         VAR   BYTE
symbol  SEC=PORTA.0
SYMBOL  YUKARI=PORTA.2
SYMBOL  ASAGI =PORTA.1
'------------------------------
CLEAR  'tüm değişkenler sıfırlandı
PAUSE 200
 SAAT=13:DAK=24 : PORTB=255
'------------------------------
 HIGH PORTA.3
BASLA:
       IF Y>6 THEN
           IF Y>=11 THEN Y=1
           GOSUB EKRAN1
           GOTO ATLA
       ENDIF
       GOSUB EKRAN0

ATLA:  if SEC=0 THEN AYAR  'MODE TUŞUNA BASILMIŞ İSE AYAR'A GİT
       gosub SENSOROKU     'SONSÖR OKU VE SICAKLIĞI EKRANA YAZ
       GOTO BASLA

EKRAN0:
       if sayac=30 then low porta.3
       X= SAAT DIG 1:GOSUB AL
       SHIFTOUT PORTB.0,PORTB.1,1,[SAYI]
       HIGH PORTB.2:PAUSEUS 2:LOW PORTB.2

       X= SAAT DIG 0:GOSUB AL
       SHIFTOUT PORTB.0,PORTB.1,1,[SAYI]
       HIGH PORTB.3:PAUSEUS 2:LOW PORTB.3 

       X= SN DIG 1:GOSUB AL
       SHIFTOUT PORTB.0,PORTB.1,1,[SAYI]
       HIGH PORTB.4:PAUSEUS 2:LOW PORTB.4

       X= SN DIG 0:GOSUB AL
       SHIFTOUT PORTB.0,PORTB.1,1,[SAYI]
       HIGH PORTB.5:PAUSEUS 2:LOW PORTB.5

'       X= sn DIG 1:GOSUB AL
'       SHIFTOUT PORTB.0,PORTB.1,1,[SAYI]
'       HIGH PORTB.6:PAUSEUS 2:LOW PORTB.6

'       X= SN DIG 0:GOSUB AL
'       SHIFTOUT PORTB.0,PORTB.1,1,[SAYI]
'       HIGH PORTB.7:PAUSEUS 2:LOW PORTB.7
       RETURN

AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN
EKRAN1:
       LOW PORTA.3 :SAYI=0
       SHIFTOUT PORTB.0,PORTB.1,1,[SAYI]
       HIGH PORTB.2:PAUSEUS 2:LOW PORTB.2
       IF SIGN_BITI = NEGAT_ISI THEN SAYI=64
       SHIFTOUT PORTB.0,PORTB.1,1,[SAYI]
       HIGH PORTB.3:PAUSEUS 2:LOW PORTB.3

       x=(ISI DIG 1):GOSUB AL
       SHIFTOUT PORTB.0,PORTB.1,1,[SAYI]
       HIGH PORTB.4:PAUSEUS 2:LOW PORTB.4
       x=(ISI DIG 0):GOSUB AL
       SHIFTOUT PORTB.0,PORTB.1,1,[SAYI]
       HIGH PORTB.5:PAUSEUS 2:LOW PORTB.5
       X=10:GOSUB AL
       SHIFTOUT PORTB.0,PORTB.1,1,[SAYI]
       HIGH PORTB.6:PAUSEUS 2:LOW PORTB.6
       X=11:GOSUB AL
       SHIFTOUT PORTB.0,PORTB.1,1,[SAYI]
       HIGH PORTB.7:PAUSEUS 2:LOW PORTB.7
       RETURN
AYAR:
       WHILE SEC=0
       WEND
HOUR:  GOSUB EKRAN0
       LOW PORTA.3
       IF SEC=0 THEN MINBIR
       IF YUKARI=0 THEN
          SAAT=SAAT+1
          IF SAAT=24 THEN SAAT=0
        ENDIF
        IF ASAGI=0 THEN
           SAAT=SAAT-1
           IF SAAT=255 THEN SAAT=23
        ENDIF
        GOSUB GECIKME
        GOTO HOUR

MINBIR: WHILE SEC=0
        WEND

MINUTE: GOSUB eKRAN0
       LOW PORTA.3
       IF SEC=0 THEN ara
        IF YUKARI=0 THEN
           DAK=DAK+1
           IF DAK=60 THEN DAK=0
        ENDIF
        IF ASAGI=0 THEN
           DAK=DAK-1
           IF DAK=255 THEN DAK=59
        ENDIF
        GOSUB GECIKME
        GOTO MINUTE

SECBIR: WHILE SEC=0
        WEND

GECIKME:
        FOR X=0 TO 1800
        PAUSEUS 100
        NEXT
        RETURN

ARA:    HIGH PORTA.3
        WHILE SEC=0
        wend

        goto BASLA

'-------ISI SENSÖR OKUMA BÖLÜMÜ ----------
SENSOROKU:
           ham=$ff5e:Gosub hesapla:return 'NORMAL ÇALIŞMADA BU SATIR SİLİNECEK
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN

Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-"
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10
       GOTO GEC
    endif
    TEMP = 625 * (HAM+1)        '
    ISI = DIV32 10          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
'    ISI  = (HAM & $0FF0) >> 4 'ortadaki 8 biti maskele, ve sağa doğru 4 hane kaydır.
GEC:
    FLOAT = (ISI //1000)/100
    ISI=ISI/1000
'    Float = ((HAM.Lowbyte & $0F) * 625) ' Küsürat hesabı
'    LCDOUT $FE,$C4,Sign,DEC ISI,".",DEC1 (Float)," ",Deg,"C " '2. satırda ısı
    RETURN 

DISABLE
KESME:
      SAYAC=SAYAC+1  'kesme sayacı  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
       IF SAYAC=58 then  '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0        'sayaç sıfırlanıyor
          SN=SN+1
          Y=Y+1       'saniye değeri bir artırılıyor
            if y<7 then high porta.3
            IF SN=60 THEN  'saniye 60 olmuş ise 1 dakika süre geçti ohalde
              SN=0        ' saniye sıfırlanıyor
               DAK=DAK+1   ' dakika değeri bir artırılıyor
                  IF DAK=60 then   'dakika 60 olmuş ise 1 saat süre geçti
                     DAK=0         ' dakika sıfırlanıyor
                     SAAT=SAAT+1   ' saat değeri bir artırılıyor
                        IF SAAT=24 THEN  'saat 24 olmuş ise 1 gün geçti
                           SAAT=0        'saat sıfırlanıyor
'                           GUN=GUN+1     'gün değeri bir artırılıyor
'                              IF GUN=365 THEN GUN=0  'gün 365 olmuş ise
                        endif                    'gün sıfırlanıyor 1 yıl geçti
                  ENDIF
            ENDIF
'           lcdout $fe,$89,":",DEC2 SN
          ENDIF
CIK:     INTCON.2=0  'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE

END
(continue Lendo)
Share this article :

Postar um comentário

 
Support : Creating Website | Johny Template | Mas Template
Copyright © 2011. Circuitos Digital - All Rights Reserved
Template Created by Creating Website Published by Mas Template
Proudly powered by Blogger