#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device ADC=10 // 10 bitlik ADC kullanılacağı belirtiliyor.
//Mikro denetleyici konfigürasyon ayarları
#fuses HS // Yüksek hızlı kristal kullanımı
#fuses NOWDT // WATCHDOG TIMER kapalı
#fuses NOPROTECT // ROM bellege okumaya karsi koruma koymaz
#fuses NOBROWNOUT // Brownout reseti kapalı
#fuses NOLVP // No Law Voltage Programming.
#fuses NOPUT // No Power Up Timer
#fuses NOWRT // Program hafızasına yazma işlemi koruması kapalı
#fuses NODEBUG // ICD için DEBUG modu kapalı
#fuses NOCPD // EEPROM kod koruması kapalı
#fuses STVREN
#use delay (clock=20000000) /* Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor. */
#define fast_io_a // Port yönlendirme ayarları
#define fast_io_b
#define fast_io_c
#define fast_io_d
#define fast_io_e
#use rs232(baud=9600,parity=N, xmit=PIN_C6,rcv=PIN_C7,bits=8) //rs232 haberleşme kodu
unsigned long int bilgi[7]={0,0,0,0,0,0,0};
float voltaj[7]={0,0,0,0,0,0,0};
int i=0;
int k=0;
int En_dusuk;
int n=0;
void main ( )
{
setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
set_tris_a(0xff); // A portu komple giriş
set_tris_b(0x00); // B portu komple çıkış
set_tris_c(0x00); // C portu komple çıkış
set_tris_d(0x00); // D portu komple çıkış
set_tris_e(0xff); // E portu komple giriş
setup_adc(adc_clock_div_32); // ADC clock frekansı fosc/32 setup_adc_ports(ALL_ANALOG); // Tüm AN girişleri analog
output_b(0x00); // çıkışlar sıfırlanıyor
output_c(0x00);
output_d(0x00);
82
while(TRUE) // sonsuz döngü
{// batarya gerilimleri ölçülüyor
for(i=0;i<6;i++)
{
set_adc_channel(i); // adc ayarlanıyor
delay_us(20);
bilgi=read_adc(); // adc okunuyor
voltaj=0,0048828125*bilgi; /*maksimum gerilim=5 volt 5/210= 0,0048828125 bu katsayı ile dijitalden analoga çevriliyor *\
printf("batarya %d: %03f V\n\r", i+1,voltaj); //sanal ekrana yazılıyor
}
output_high(pin_d5); // mikrodenetleyici led testi
if((En_dusuk-3.7<0.001))
{output_high(pin_d4);
}
else
{
output_low(pin_d4);
}
for(k=0;k<6;k++) // en küçük batarya gerilimi bulunuyor
{
for(i=0;i<6;i++)
{
if(k==0)
{
goto son;
}
if(voltaj[k]< voltaj[n])
{
son:
if(voltaj[k] < voltaj)
{
En_dusuk = voltaj[k];
n=k;
}
}
}
}
printf("En dusuk batarya : %03f\n\r",voltaj[n]);// fazla olan bataryaların gerilimleri düşürülüyor
if((voltaj[0]-voltaj[n]) > 0.01)
{
output_high(pin_b7);
}
else
{
output_low(pin_b7);
}
if((voltaj[1]-voltaj[n]) > 0.01)
{
output_high(pin_b6);
}
else
83
{
output_low(pin_b6);
}
if((voltaj[2]-voltaj[n]) > 0.01)
{
output_high(pin_b5);
}
else
{
output_low(pin_b5);
}
if((voltaj[3]-voltaj[n]) > 0.01)
{
output_high(pin_c5);
}
else
{
output_low(pin_c5);
}
if((voltaj[4]-voltaj[n]) > 0.01)
{
output_high(pin_c4);
}
else
{
output_low(pin_c4);
}
if((voltaj[5]-voltaj[n]) > 0.01)
{
output_high(pin_d3);
}
else
{
output_low(pin_d3);
}
}
şöyle bir yazılım var, çok ileri seviye bi uygulama olmadığı için yeterli gibi geldi. Emin değilim