pic16f877 ile saat,tarih ve sıcaklık

xlante

Üye
Katılım
28 Nis 2010
Mesajlar
22
Puanları
1
Yaş
36
arkadaşlar ben PIC16F877 Entegresiyle digital lcd ekrandasaat,tarih ve sıcaklık gösteren bir proje yapıyorum...proteusda çalışan aşağıdaki kodum benim baskı devremde saat ve tarhite sorun yaratıyor ama sıcaklığı gösteriyor...saat ve tarih proteusda düzgün bie şekilde gösterirken simulasyon yaptığım zaman...baskı devrede saat: 00:00:00 'dan başlıyor ve tek tek artıyor..tarih ise 01/01/2010 dan başlıyor...elektriği kesince ve tekrardan elektrik verince baskı devreye tekrar saat ve tarih yukarıda yazdığım gibi baştan başlıyor...ben saat ve tarihh entegresine bağladığım 32.768 hz lik crystalimi oscilloscope ile ölçtüm onda signal var başka neyden kaynaklanabilir, bunun nedeni ne olabilir,bana yardımcı olursanız çok sevinirim..

#define backlight PORTC.F0
#define sistemled portb.f1
#define outled portc.f2
//buttons definitions
#define btnEnter porte.f2
#define btnEsc porta.f2
#define btnUp porte.f0
#define btnDown porta.f4
#define btnLeft porta.f5
#define btnRight porte.f1
unsigned short sec;
unsigned short minute;
unsigned short hour;
unsigned short day;
unsigned short date;
unsigned short month;
unsigned short year;
////////////////
unsigned long temperature=0;
unsigned int sicaklik=0;
unsigned int isi=0;
unsigned char isidegeri[6];
unsigned char setdegeri[6];
unsigned int isideger=0;
unsigned int setdeger=0;
unsigned char offset=20;
unsigned char mode=0;
//////////////
void initial_time();
void read_time();
void setting_time();
void display_time();
void Transform_Time();
void sicaklikoku(unsigned char kanal,unsigned char* dizi);
void timemode();
void temperaturemode();
void main(){

initial_time();

while(1)
{
while(1){
switch (mode){
case 1: timemode(); mode=2;break;
case 2: temperaturemode(); mode=1;break;
default: mode=1; break;
}
}
}
}
void read_time()
{
I2C_Start(); // Issue start signal
I2C_Wr(0xA0); // Address PCF8583, see PCF8583 datasheet
I2C_Wr(2); // Start from address 2
I2C_Repeated_Start(); // Issue repeated start signal
I2C_Wr(0xA1); // Address PCF8583 for reading R/W=1

sec= I2C_Rd(1); // Read seconds byte
minute= I2C_Rd(1); // Read minutes byte
hour = I2C_Rd(1); // Read hours byte
day = I2C_Rd(1); // Read year/day byte
month = I2C_Rd(0); // Read weekday/month byte
I2C_Stop(); // Issue stop signal

}
void Transform_Time() {
sec = ((sec & 0xF0) >> 4)*10 + (sec & 0x0F); // Transform seconds
min= ((minute & 0xF0) >> 4)*10 + (minute & 0x0F); // Transform months
hour = ((hour & 0xF0) >> 4)*10 + (hour & 0x0F); // Transform hours
year = (day & 0xC0) >> 6; // Transform year
day = ((day & 0x30) >> 4)*10 + (day & 0x0F); // Transform day
month = ((month & 0x10) >> 4)*10 + (month & 0x0F); // Transform month
}
void Display_Time() {

Lcd_Out(1, 1,"Date:");
Lcd_Chr(1, 6, (day / 10) + 48); // Print tens digit of day variable
Lcd_Chr(1, 7, (day % 10) + 48); // Print oness digit of day variable
Lcd_Chr(1, 8,47);
Lcd_Chr(1, 9, (month / 10) + 48);
Lcd_Chr(1,10, (month % 10) + 48);
Lcd_Chr(1, 11,47);
Lcd_Out(1,12,"2010");
Lcd_Out(2, 1,"Time:");
Lcd_Chr(2, 6, (hour / 10) + 48);
Lcd_Chr(2, 7, (hour % 10) + 48);
Lcd_Chr(2, 8,':');
Lcd_Chr(2, 9, (minute / 10) + 48);
Lcd_Chr(2,10, (minute % 10) + 48);
Lcd_Chr(2,11,':');
Lcd_Chr(2,12, (sec / 10) + 48);
Lcd_Chr(2,13, (sec % 10) + 48);
}
void initial_time()
{
I2C_Init(100000); //DS1307 I2C is running at 100KHz
Lcd_Init(&PORTD); // Initialize LCD connected to PORTB
Lcd_Cmd(Lcd_CLEAR); // Clear display
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
}
void timemode(){
tekrar1:
read_time();
Transform_Time();
Display_Time();
Delay_ms(10);
if(!btnEnter) goto tekrar1;

}
void temperaturemode(){
unsigned char temp=0;
Lcd_Cmd(LCD_CLEAR); // Clear display
Lcd_Cmd(LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,1,"Set : ");
Lcd_Out(2,1,"Temp: ");
tekrar:
isideger=setdeger=0;
// sicaklikoku(0,isidegeri);
// sicaklikoku(1,setdegeri);
if(outled==1)if(isideger<=(setdeger-(unsigned int)offset))outled=0;
if(outled==0) {if(isideger>=setdeger)outled=1;}

Lcd_Out(1,7,setdegeri);
Lcd_Out(2,7,isidegeri);
if(!btnEnter) goto tekrar; //enter tuşuna basılana kadar işlemi tekrarla

}

void sicaklikoku(unsigned char kanal,unsigned char* dizi){
unsigned char i;
sicaklik=ADC_Read(kanal);
for(i=0;i<10;i++)
{
sicaklik+=ADC_Read(kanal);
sicaklik=sicaklik/2;
}
if(kanal==0) {temperature = (long)sicaklik*1000;}
else if(kanal==1){ temperature = (long)sicaklik*100;}
temperature=(temperature/1023)*5;
sicaklik = (unsigned int)temperature;
if(kanal==0)isideger=sicaklik;else setdeger=sicaklik;
// sicaklik = 4999;
isi = sicaklik/1000;
if(isi==0) dizi[0]=32;else dizi[0]=48+isi;

isi = sicaklik-(isi*1000);
isi = isi/100;
if(isi==0){ if(dizi[0]==32)dizi[1]=32;else dizi[1]=48;}
else if(isi>0){dizi[1]=48+isi;}

sicaklik = sicaklik%100;
isi = sicaklik/10;
dizi[2]=48+isi;dizi[3]='.';

isi=sicaklik%10;
dizi[4]=48+isi;dizi[5]=0;

}//
 

Forum istatistikleri

Konular
128,198
Mesajlar
915,766
Kullanıcılar
449,978
Son üye
food_eng_1952

Yeni konular

Geri
Üst