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. kvolts - All Rights Reserved
Template Created by Creating Website Published by Mas Template
Proudly powered by Blogger