Mikro denetleyici kontrollü lcd ekranlı pil şarj devresi

Hazırlayan : Kerem Süzgün – Pil şarj devresi pic16f877 ile gerçekleştirilmiş yazılım picbasic pro ile hazırlanmış 2×16 lcd ekran üzerinde şarj durumu gözlenebiliyor isis simulasyon ve kaynak pbp asm hex dosyaları var. Emeği geçen kişilere teşekkürler
Dosyalar : pic16f877-pi-sarj-picbasicpro.rar
![]()
Program 0.5 volt arasını 10 kademe olarak pil karakterine yansıtıyor, seviye sıfır olursa karakter bitti anlamında yanıp sönerek ikaz veriyor ayrıca şarj düğmesine basıldığın da farklı bir ekranda şarj durumu yine pil karakterine, hareketli olarak yansıyor isterseniz farklı voltajlara uyarlayabilirsiniz, ADC çevirici olarak ETE hocanın notlarında ki programı taban olarak kullandım, sağolsun program satırlarının yanında gayet açıklayıcı tanımları var,
kendisine teşekkürlerimi sunarım.
Pil şarj devre şeması ve şarj durum görüntüleri

Picbasic pro kod
'****************************************************************
'* Name : pil.BAS *
'* Author : [kerem süzgün] *
'* Notice : Copyright (c) 2005 [kerem süzgün] *
'* : All Rights Reserved *
'* Date : 12.04.09 *
'* Version : 1.0 *
'* Notes :ETE hocanın notları kalıp olarak kullanılmıştır *
'* : *
'****************************************************************
TRISA=%000000001
TRISB=%000000001
TRISC=0
TRISD=0
'-------------------------------------------------------------------------------
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
'-------------------------------------------------------------------------------
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 ADC_BITS 10 'A/D çevirim sonucu kaç bit olacak
DEFINE ADC_CLOCK 3 'Clock kaynağı (3=rc)
DEFINE ADC_SAMPLEUS 100 'Örnekleme zamanı mikro saniye cinsinden.
'-------------------------------------------------------------------------------
ADCON1=%10001110 '7. bit 1 yapıldı 10 bit sonuç almak için.
'OPTION_REG=0
'-------------------------------------------------------------------------------
HAM var word 'ADC den okunan ham digital değer.
VOLT var word '16 bit değişken tipi seçtik kullanacağımız değer 10 bit olacak.
Mvolt var byte
BattLevel var BYTE ' 0 - 10, 0=bos 10=dolu
Char var byte
y var byte
ONLAR VAR BYTE
TVOLT VAR WORD
'-------------------------------------------------------------------------------
LCDOut $FE,1 ' LCD de CLS yapar
pause 200 ' LCD nin açılması için gerekli süredir.
'-------------------------------------------------------------------------------
BASLA:
LCDout $FE,1
PAUSE 100
ADCIN 0,HAM '0 nolu kanaldan Analog değeri oku ve RAW değişkenine aktar.
BAK:
ADCIN 0,HAM '0 nolu kanaldan Analog değeri oku ve RAW değişkenine aktar.
IF ADCON0.2=1 THEN BAK 'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.
Ham=ham+1 'Hesap kolaylığı açısından Ham değerini bir artırdık
'Okunan değer 0-5 volt için 0-1024 olacağından okunacak değer başına volt değeri
' 5/1024 =0,0048828 olacaktır. Sayı çok küçük olduğundan bu değeri 1000 ile
'çarpmalıyız. Ohalde (Okuma/V)= 4,8828 bu değeri 256 ile çarpar isek
'4,8875 x 256 = 1250 değerini buluruz. Bu değeri kullanarak 32 bit işlem yapabiliriz.
'1250 değeri (5/1024)*256 değerine karşılık gelmektedir.
'sonuçta ADC HAM değerini bu sayı ile çarpıp 256'ya bölersek sonucu elde etmiş oluruz.
'ancak sonuç 32 bitlik sınırda olduğundan bu işi 32 bit çarpma ile yapıyoruz ve orta
'baytı aldığımızda ise zaten sayının 256'ya bölünmüş halini aldığımızdan başka bir
'işlem yapmadan sonucu elde etmiş oluruz.
Volt=(ham */ 1250)/100 'Ham ile 1250 yi 32 bit olarak çarp ve 100'böl
Mvolt=volt//10
'Burada yeni bir komut veya işlem şekli görüyorsunuz. MOD alma yani (//) kalan bulma
'Bir sayını başka bir sayıya bölünmesinden sonra kalan miktarı bulma işlemine MOD
'alma denir. Örnek W=A//1000 , A'yı 1000'e böl kalanı W değişkenine koy anlamındadır.
'bizde yukarıda Milivolt değerini bulmak için volt (10 ile çarpılmış halini) 10'a
'bölüp kalanı Mvolt değişkenine yerleştiriyoruz.
Volt=Volt/10
LCDout $FE,$80," Pil= ",1
LCDOUT $FE,$C0," VOLT=",#VOLT,",",# Mvolt
ONLAR=VOLT*10
TVOLT=ONLAR+Mvolt
IF TVOLT=0 THEN BattLeveL=0
IF TVOLT=5 THEN BattLeveL=1
IF TVOLT=10 THEN BattLeveL=2
IF TVOLT=15 THEN BattLeveL=3
IF TVOLT=20 THEN BattLeveL=4
IF TVOLT=25 THEN BattLeveL=5
IF TVOLT=30 THEN BattLeveL=6
IF TVOLT=35 THEN BattLeveL=7
IF TVOLT=40 THEN BattLeveL=8
IF TVOLT=45 THEN BattLeveL=9
IF TVOLT=50 THEN BattLeveL=10
IF PORTB.0=1 THEN GOTO PILSARJ
gosub ShowBattery
IF BattLeveL=0 THEN LCDout $FE,$80," Pil= "," "
pause 300
goto BAK
ShowBattery: ' pil seviye göstergesi 0 - 10, 0=boş 10=dolu
lcdout $FE,$48,$06
for y = 5 to 1 step - 1
if BattLevel >= (y *2 - 1) then
if BattLevel >= (y*2 ) then
Char = $0F
else
Char = $0B
endif
else
Char = $09
endif
lcdout Char
next y
lcdout $0F,$00
return
PILSARJ:
LCDout $FE,1,1
LCDout $FE,$C0,"- Pil Doluyor -"
Loop:
for BattLevel =10 to 0 step -1
gosub Battery
pause 500
next BattLevel
IF PORTB.0=0 THEN GOTO BASLA
goto Loop
Battery: ' pil seviye göstergesi 0 - 10, 0=boş 10=dolu
lcdout $FE,72,6
'lcdout $FE,$48,$06 orjinal hex kod
for y=5 to 1 step -1
if BattLevel >= (y * 2 - 1) then
if BattLevel >= (y * 2) then
Char =15' $0F
else
Char =11' $0B
endif
else
Char =9' $09
endif
lcdout Char
next y
lcdout $0F,0'$00
return
END
Yazar: gevv
Yazarımızın 320volt.com Blog üzerinde şu an okuduğunuz yazı dahil 1955 yazısı bulunmaktadır. Yazarımız hakkında bilgileri ve diğer yazılarını görmek için bakınız; gevv












hocam bu uygulamanın aynısını yapmak için 1 hafta önce karar aldım devrede farklı gerlilimlerde olcak en çok hoşuma giden ise pil ekranını dolu boş göstergesi bende bu kodu programda kullanırım
eyvallah
Selamu Aleyküm
Ben bu devre ile 12 Volt 7 Amper Kuru tip aküleri şarj edebilirmiyim. Eğer oluyosa bunu nasıl yaparım. Programla ilgili bilgim yetersiz. Hangi kodları değiştirmem gerekecek. yada devrede hangi bölümleri değiştireceğim. Şimdiden iyi çalışmalar. Emeği geçen bütün arkadaşlara teşekkürler.
devre çok güzel olmuş gerçekten tebrikler bi de şu voltu arttırmamız ne işe yarıyor?
ben yeni lise 3 e geçtimde daha tam olarak bilimiyorum :D şimdiden teşekkürler!
Bir de bu devre kaç volt ile çalışıyor ? Beslemeyi fişten mi alacağız?. Saygılar
Devre 5 volt dc ile çalışıyor adaptör kullanabilirsiniz