Ðề tài: Hỏi về DS1307
View Single Post
Old 15-06-2008, 12:02 PM   #13
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Trích:
Nguyên văn bởi nguyendungdt12 View Post
làm mãi mà vẫn khong thiết lập được chán ghê, có bác nào giúp cho tiểu đệ 1 đoạn code để khởi taịo cho ds1307 giá trị đầu và nó chạy luôn mà không cần nút chỉnh bên ngoài không nhỉ? Em dung pic 16F877a và CCS
nè u ! làm gì mà than vãn ghê z thế
Code:
#include    <16F877A.h>
#fuses      NOPROTECT,HS,NOWDT,NOLVP,NODEBUG,NOPUT
#use        delay(clock =20000000)
#use        i2c(master,fast,sda=PIN_C4,scl=PIN_C3)

#define mode   RE0 
#define change RE1
#define IR     RE2
//                                0     1    2    3    4   5    6    7    8    9
unsigned char const maled[10] = {0x01,0xCF,0x92,0x86,0xCC,0xA4,0xA0,0x8F,0x80,0x04};
unsigned char sec,min,hour,dow,date,month,year; // bien data trong RTC
unsigned char day1,day2,month1,month2,year1,year2,hour1,hour2,min1,min2,sec1,sec2; // bien xuat data
unsigned char hour_wait1,hour_wait2,min_wait1,min_wait2;
unsigned char i=0;
unsigned int  var_IR=0;

//------------ham thu tin hieu Sony------------------------
void scan_IR()
{ if (!IR) { delay_ms(1);
             if(!IR){ RB1= RB2 = 1 ; // tat 2 led
                      while(!IR) continue ; // trong khi IR van muc 0 thi wait de doi sang muc 1
                      while(IR) continue ;  // neu IR chuyen sang muc 1 thi wait tiep
                      delay_us(750);
                      for(i=1;i<=12;i++)
                             { //if(IR==0){ bit_set(var_IR,i)  ; };
                               //if(IR!=0){ bit_clear(var_IR,i); };
                               if(IR==0){ (var_IR ||0x01)<<i; };
                               if(IR!=0){ (var_IR ||0x01)<<i; };
                               while(!IR) continue ; 
                               while(IR) continue ;  
                               delay_us(750);
                             };
                    };
           };
}  


void test_IR()  
{  for(i=0;i<=12;i++)
        {
          if(bit_test(var_IR,i)==1) 
               {RB1 = 0 ;delay_ms(1000); // bat led day1
                RB1 = 1 ;delay_ms(1000);
               };
          if(bit_test(var_IR,i)==0) 
               {RB2 = 0;delay_ms(1000); // bat led day2
                RB2 = 1;delay_ms(1000); 
               };
        };
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++  


//------------ cac ham lien quan den RTC--------------------
void init_time()
{ I2C_start();       // gui bit start
  I2C_write(0xD0);   // gui lenh write
  I2C_write(0x07);   // den dia chi 07H de
  I2C_write(0x10);   // cau hinh cho thanh ghi 07H
  I2C_stop();
  
  I2C_start();
  I2C_write(0xD0);
  I2C_write(0x00);   // dia chi 00h
  I2C_write(0x00);   // nap gia tri cho thanh ghi giay = 0 , dong thoi xoa bit CH
  I2C_write(0x01);   // cho thanh ghi phut = 1
  I2C_write(0x11);   // chon mode 24h cho thanh ghi gio & nap gia tri la 11h
  I2C_write(0x02);   // thu 2
  I2C_write(0x15);   // ngay 15
  I2C_write(0x06);   // thang 6
  I2C_write(0x08);   // nam 2008 , nhap gia tri 2 so cuoi cua nam
  i2c_read(0);
  I2C_stop();
}
void up_date1307()
{ 
}

void update_time()
{I2C_start();
 I2C_write(0xD0); // gui lenh ghi
 I2C_write(0x00); // dia chi bat dau
 I2C_start();
 I2C_write(0xD1); // gui lenh doc
 sec=i2c_read(1);
 min=i2c_read(2);
 hour=i2c_read(3);
 dow =i2c_read(4);
 date=i2c_read(5);
 month=i2c_read(6);
 year=i2c_read(7);
 i2c_read(0);
 i2c_stop();

 sec1  = sec & 0x0F;
 sec2  = (sec & 0xF0)>>4;
 min1  = min & 0x0F;
 min2  = (min & 0xF0)>>4;
 hour1 = hour & 0x0F;
 hour2 = (hour & 0xF0)>>4;
 day1  = date & 0x0F ; 
 day2  = (date & 0xF0)>>4;
 month1= month & 0x0F ; 
 month2= (month & 0xF0)>>4;
 year1 = year & 0x0F ; 
 year2 = (year & 0xF0)>>4;
}


#int_ext
void read_time()
{ I2C_start();
  I2C_write(0xD0);
  I2C_write(0x00);   // xoa bit CH
  I2C_start();
  I2C_write(0xD1);
  sec = I2C_read(0x00);
  I2C_stop();
  if(sec==0) update_time();
  sec1 = sec & 0x0F;// lay 4 bit thap
  sec2 = (sec & 0xF0) >> 4 ;
}


void display()
{ PORTD = maled[sec1] ;RC6=0 ; delay_us(50); RC6=1 ;
  PORTD = maled[sec2] ;RC5=0 ; delay_us(50); RC5=1 ; 
  PORTD = maled[min1] ;RC2=0 ; delay_us(50); RC2=1 ; 
  PORTD = maled[min2] ;RC1=0 ; delay_us(50); RC1=1 ; 
  PORTD = maled[hour1];RB7=0 ; delay_us(50); RB7=1 ; 
  PORTD = maled[hour2];RC0=0 ; delay_us(50); RC0=1 ; 
  PORTD = maled[day1]; RB2=0 ; delay_us(50); RB2=1 ; 
  PORTD = maled[day2]; RB1=0 ; delay_us(50); RB1=1 ; 
  PORTD = maled[month1];RB4=0; delay_us(50); RB4=1 ; 
  PORTD = maled[month2];RB3=0; delay_us(50); RB3=1 ; 
  PORTD = maled[year1];RB6=0 ; delay_us(50); RB6=1 ; 
  PORTD = maled[year2];RB5=0 ; delay_us(50); RB5=1 ; 
}

main()
{ set_tris_A(0b0000000);  PORTA = 0b00001111;
  set_tris_B(0b00000001); PORTB = 0b11111111; // tat led 1-9
  set_tris_C(0b00011000); PORTC = 0b11100111;
  set_tris_D(0x00); PORTD = 0xFF;
  set_tris_E(0xFF); PORTE = 0xFF;
  
  delay_ms(500);
  init_time();
  
  GIE = 1; // cho phep ngat xay ra
  enable_interrupts(int_ext);
  ext_int_edge(H_to_L);

  while(1)
  {display();
  };
}
code chạy rùi đóa , nhưng ko hỉu sao khi giây về 00 thì tất cả các led đều nháy nháy ( khó chịu chỗ này lám , giống như ta quét led với tốc độ chậm í) wa 3s thì nó mới quét lại đúng thời gian 50ms . Tui cũng ko hỉu làm sao nữa . Nhưng nói chung thỏa mãn kì vọng khởi tạo DS1307 rùi đóa

thay đổi nội dung bởi: Mr.Bi, 15-06-2008 lúc 12:07 PM.
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn