PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > PIC - Thiết kế và Ứng dụng

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 02-02-2007, 01:02 PM   #1
Sangcao
Đệ tử 1 túi
 
Tham gia ngày: May 2006
Bài gửi: 25
:
Code:
Code cua DS1307 day:
////////////////////////////////////////////////////////////////////////////////
///                               DS1307.C                                   ///
///                     Driver for Real Time Clock                           ///
///                                                                          ///
/// ds1307_init() - Enable oscillator without clearing the seconds register -///
///                 used when PIC loses power and DS1307 run from 3V BAT     ///
///               - Disable squarewave output                                ///
///                                                                          ///
/// ds1307_set_date_time(day,mth,year,dow,hour,min,sec)  Set the date/time   ///
///                                                                          ///
/// ds1307_get_date(day,mth,year,dow)               Get the date             ///
///                                                                          ///
/// ds1307_get_time(hr,min,sec)                     Get the time             ///
///                                                                          ///
////////////////////////////////////////////////////////////////////////////////

#define RTC_SDA  PIN_C4
#define RTC_SCL  PIN_C3

#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)

BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);

void ds1307_init(void)
{
   BYTE seconds = 0;

   i2c_start();
   i2c_write(0xD0);      // WR to RTC
   i2c_write(0x00);      // REG 0
   i2c_start();
   i2c_write(0xD1);      // RD from RTC
   seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
   i2c_stop();
   seconds &= 0x7F;

   delay_us(3);

   i2c_start();
   i2c_write(0xD0);      // WR to RTC
   i2c_write(0x00);      // REG 0
   i2c_write(bin2bcd(seconds));     // Start oscillator with current "seconds value
   i2c_start();
   i2c_write(0xD0);      // WR to RTC
   i2c_write(0x07);      // Control Register
   i2c_write(0x80);     // Disable squarewave output pin
   i2c_stop();

}

void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec)
{
  sec &= 0x7F;
  hr &= 0x3F;

  i2c_start();
  i2c_write(0xD0);            // I2C write address
  i2c_write(0x00);            // Start at REG 0 - Seconds
  i2c_write(bin2bcd(sec));      // REG 0
  i2c_write(bin2bcd(min));      // REG 1
  i2c_write(bin2bcd(hr));      // REG 2
  i2c_write(bin2bcd(dow));      // REG 3
  i2c_write(bin2bcd(day));      // REG 4
  i2c_write(bin2bcd(mth));      // REG 5
  i2c_write(bin2bcd(year));      // REG 6
  i2c_write(0x80);            // REG 7 - Disable squarewave output pin
  i2c_stop();
}

void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
{
  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x03);            // Start at REG 3 - Day of week
  i2c_start();
  i2c_write(0xD1);
  dow  = bcd2bin(i2c_read() & 0x7f);   // REG 3
  day  = bcd2bin(i2c_read() & 0x3f);   // REG 4
  mth  = bcd2bin(i2c_read() & 0x1f);   // REG 5
  year = bcd2bin(i2c_read(0));            // REG 6
  i2c_stop();
}

void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)
{
  i2c_start();
  i2c_write(0xD0);
  i2c_write(0x00);            // Start at REG 0 - Seconds
  i2c_start();
  i2c_write(0xD1);
  sec = bcd2bin(i2c_read() & 0x7f);
  min = bcd2bin(i2c_read() & 0x7f);
  hr  = bcd2bin(i2c_read(0) & 0x3f);
  i2c_stop();

}

BYTE bin2bcd(BYTE binary_value)
{
  BYTE temp;
  BYTE retval;

  temp = binary_value;
  retval = 0;

  while(1)
  {
    // Get the tens digit by doing multiple subtraction
    // of 10 from the binary value.
    if(temp >= 10)
    {
      temp -= 10;
      retval += 0x10;
    }
    else // Get the ones digit by adding the remainder.
    {
      retval += temp;
      break;
    }
  }

  return(retval);
}


// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
  BYTE temp;

  temp = bcd_value;
  // Shifting upper digit right by 1 is same as multiplying by 8.
  temp >>= 1;
  // Isolate the bits for the upper digit.
  temp &= 0x78;

  // Now return: (Tens * 8) + (Tens * 2) + Ones

  return(temp + (temp >> 2) + (bcd_value & 0x0f));
}

thay đổi nội dung bởi: namqn, 02-02-2007 lúc 06:14 PM.
Sangcao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-08-2007, 12:15 PM   #2
minhtienbk
Đệ tử 5 túi
 
minhtienbk's Avatar
 
Tham gia ngày: Dec 2005
Bài gửi: 120
:
Send a message via ICQ to minhtienbk Send a message via Yahoo to minhtienbk
em cũng đang làm với 1307 ,dùng PIC basic pro ,viec ghi và đọc OK , nhưng nó ko đếm lên , ghi vào thanh ghi 00h ( giây) = 03h ,rồi sau đó đọc lại ,nó vẫn cứ là 03h ,để bao lâu cũng là 03h ,bó tay ,có ai chỉ giùm

Mạch OK ,PIN ,dt kéo lên ,thạch anh đầy đủ , ( ghi giá trị dc mà ) ,
__________________
Mạch - remote điều khiển từ xa qua RF 30m ,300m ,500m,1000m,... (đã test ) ,loại công suất lớn , loại cực nhỏ .... , rẻ ,giao hàng nhanh chóng toàn quốc (3 ngày), thâm niên 3 năm mua bán mạch RF 09 8485.bảy bảy.11
bán linh kiện ,MCU ARM , kit , dụng cụ , mạch www.nhattaoonline.com
Hỗ trợ kỹ thuật đầy đủ. Tài liệu đầy đủ.
minhtienbk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-09-2007, 03:41 AM   #3
thuhang
Nhập môn đệ tử
 
Tham gia ngày: Jul 2007
Bài gửi: 6
:
Anh thử thay con DS1307 khác xem thế nào .
thuhang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-09-2007, 06:38 PM   #4
linhnc308
Đệ tử 5 túi
 
Tham gia ngày: Oct 2005
Bài gửi: 117
:
Trích:
Nguyên văn bởi minhtienbk View Post
em cũng đang làm với 1307 ,dùng PIC basic pro ,viec ghi và đọc OK , nhưng nó ko đếm lên , ghi vào thanh ghi 00h ( giây) = 03h ,rồi sau đó đọc lại ,nó vẫn cứ là 03h ,để bao lâu cũng là 03h ,bó tay ,có ai chỉ giùm

Mạch OK ,PIN ,dt kéo lên ,thạch anh đầy đủ , ( ghi giá trị dc mà ) ,
Bạn gắn một con LED vào chân clokc out của DS1307, rồi quan sát xem sau khi đã cấu hình cho DS thì LED có nháy hay không, nếu chưa nháy thì có lẽ bạn đã cấu hình sai hoặc lỗi có thể nầm ở bus I2C. Xem lại cẩn thận từng bước để phát hiện lỗi xem nó nằm ở đâu.
Chúc thành công.
__________________
CallerID, Ethernet-RS232, PICWEB, Cảnh báo BTS
Giải pháp toàn diện giám sát - điều khiển từ xa qua GSM/Internet
0988006696

http://linhnc308.blogspot.com
linhnc308@gmail.com
linhnc308 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-10-2007, 06:06 PM   #5
vandungevn
Đệ tử 5 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 116
:
Send a message via Yahoo to vandungevn
C18 giao tiếp I2C với DS1307 có ai đã làm cho chạy chưa. Post lên cho Dũng tham khảo với........!
__________________
Hãy chung sức vì nền Điện Tử Viêt Nam...! Sản Phẩm thương hiệu Việt "Made in Viet Nam"
Nguyen Van Dung - Nguyễn Văn Dũng. Mobile : (+84) 97 329 1368
Nick name : VanDungEvn ( Yahoo + Skype )
Tư vấn & thiết kế điện tử + Làm mạch in + Hoàn thiện sản phẩm điện tử. Mạch nạp 89-PIC-AVR.
Email: vandungevn@gmail.com Website: www.dientuphuongdung.com
Xóm Mới - Nguyên Xá - Minh Khai - Từ Liêm - Hà Nôi - Viet Nam.
vandungevn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-10-2007, 10:42 PM   #6
hanspkt
Đệ tử 3 túi
 
Tham gia ngày: Aug 2006
Bài gửi: 55
:
Em dùng CCS để viết chương trình và hiển thị ra LCD (dùng DS1307), đọc và điều chỉnh các dữ liệu từ ô nhớ 00H --> 09H là đúng yêu cầu chỉ gặp rắc rối từ ô nhớ 0Ah trở về sao. Mong các anh giúp đỡ tí !
hanspkt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-10-2007, 11:11 PM   #7
HueDN
Nhập môn đệ tử
 
Tham gia ngày: Sep 2007
Bài gửi: 5
:
Đây là code của đồng hồ 6 digit của TMdùng để học tập. Tuy nhiên vì mới học PIC nên chưa hiểu được. Nhất là chổ MAP đó. Các cao thủ giải thích dùm nhé
Code:
/****************************************************************   
* Real time Clock DS1307 
* Dong ho so su dung DS1307 hien thi tren 6 LED 7-segment hh.mm.ss
* Sofware: Compiler CCS Ver 4.018
* Harware: TMe - EasyPIC: (www.tme.com.vn)
   - Pull up PORTD, Pull-down Switches, connect PORTD to Switches
   - Switches: T1 - Mode, T2 - set time, T3 - clean status
   - DIP Swich SW2 all ON (Enable 7-segment and RTC DS1307)
*****************************************************************/

#include <16F877A.h>
#include <def_877a.h> //file header do nguoi dung dinh nghia
#include <ds1307.c>
#fuses   HS,NOWDT,NOPROTECT,NOLVP
#use     delay(clock=12000000)

byte sec,min,hour;
byte const MAP[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//Cathode
byte DIS1,DIS2,DIS3,DIS4,DIS5,DIS6;
byte key,mode;
int1 ampm,blink,blink_sec,blink_min,blink_hour;
int1 on_off;
int16 count;

#bit SW1   = 0x8.0  // D0 - mode
#bit SW2   = 0x8.1  // D1 - set_time 
#bit SW3   = 0x8.2  // D2 - Clear_status

void set_blink();
void change_time();
void update_1307();
void keyscan();
void set_sec();
void set_min();
void set_hour();
void clear_status();
void read_time();
void update_time();
void display();

//===============================================


void set_blink()
{

   switch (mode)
   {
      case 1:  blink_sec=1;   break;
      case 2: {blink_min=1;blink_sec=0;}   break;
      case 3: {blink_hour=1;blink_min=0;} break;
      case 4:
      {
         blink=0;mode = 0;blink_sec=0;
         blink_min=0;blink_hour=0;
      }
      break;
   }
}

void change_time(){ //Ham chon che do, giong nhu o dong ho CASIO, nhan 1 lan la phut, 2 lan la gio....

   if(mode == 1) {blink_sec=1;set_sec();}
   if(mode == 2) {blink_min=1;set_min();}
   if(mode == 3) {blink_hour=1;set_hour();}
   if(mode == 4)
   {
      blink=0;mode = 0;
      blink_sec=0; blink_min=0; blink_hour=0;
   } 
}


void update_1307() 
{
   write_DS1307(0,sec);
   write_DS1307(1,min);
   bit_set(hour,6);
   if (ampm == 0) {bit_clear(hour,5); write_DS1307(2,hour);} // AM
   if (ampm == 1) {bit_set  (hour,5); write_DS1307(2,hour);} // PM
   
}
void keyscan() {
   RD0=1;RD1=1;RD2=1;RD3=1;
   if(SW1 != 1)   { key=0;SW1=1;delay_ms(150);}
   if(SW2 != 1)   { key=1;SW2=1;delay_ms(150);}
   if(SW3 != 1)   { key=2;SW3=1;delay_ms(150);}
   if(key != 5)
     {
      switch (key)
      {
         case 0: {mode++;key = 5;blink=1;set_blink();}
         break;
         case 1: {change_time();key = 5;update_1307();}
         break;
         case 2: {clear_status();key = 5;}
         break;  
      }
    }
}

void set_sec()
{
       sec=read_ds1307(0);
       if (sec>=0x30) {sec=0; min++; write_ds1307(1,min);}
       else sec=0;
       write_ds1307(0,sec);
}
void set_min()
{ byte j;
 
            min=read_ds1307(1);
            min++;
            j=min & 0x0F;
            if (j>=0x0A) min=min+0x06;
            if (min>=0x60) min=0;
            write_ds1307(1,min);
}
void set_hour()
{  
   hour= hour & 0x1F;
   hour++;
   if(hour== 0x0a) hour = hour+0x06;
   if(hour == 0x13)
   { hour = 0x00;
     if (ampm == 0) ampm = 1;
     else ampm = 0;
   }
}

void clear_status() {

 mode=4;  set_blink();
}
void read_time() 
{
     sec  = read_DS1307(0);
     min  = read_DS1307(1);
     hour = read_DS1307(2);
     update_time();
}

void update_time()
{
  
   ampm = bit_test(hour,5);   //test AM PM
   if(ampm == 0)  {RD4 = 0;RD5=1;}   //AM
   if(ampm == 1)  {RD4 = 1;RD5=0;}   // PM
    DIS1= sec & 0x0F;
    DIS2=(sec & 0xF0)>>4; //convert to BCD SEC
    DIS3= min & 0x0F;
    DIS4=(min & 0xF0)>>4; //convert to BCD MIN
    DIS5= hour & 0x0F;
    DIS6=(hour & 0x10)>>4; //convert to BCD HOUR
   
}
void display() {
TRISB=0x00;TRISA=0x00;
   if(blink==0) goto norm;
   if(on_off==0) goto led_blink;
norm:
// sec - min - hour
      PortB=MAP[DIS1];  RA5=0;//DIS1
      delay_ms(1);         RA5=1;
      PortB=MAP[DIS2];  RA4=0;  //DIS2
      delay_ms(1);         RA4=1;
      PortB=MAP[DIS3];output_low(PIN_B7);RA3=0;//DIS3
      delay_ms(1);         RA3=1;
      PortB=MAP[DIS4];  RA2=0;//DIS4
      delay_ms(1);         RA2=1;
      PortB=MAP[DIS5];output_low(PIN_B7);  RA1=0;//DIS5
      delay_ms(1);         RA1=1;
      PortB=MAP[DIS6];if (portb==0xC0) RA0=1; else RA0=0;//DIS6
      delay_ms(1);         RA0=1;//*/
      
      if(count!=0) goto exit;
      else
      {
         count=15;
         on_off=0;
      }
      goto exit;
      
led_blink:
      PortB=MAP[DIS1];
      if (blink_sec==1) RA5=1;//DIS1
      else RA5=0;
      delay_ms(3);         RA5=1;
      PortB=MAP[DIS2];
      if (blink_sec==1) RA4=1;//DIS2
      else RA4=0;
      delay_ms(3);         RA4=1;
      PortB=MAP[DIS3];output_low(PIN_B7);
      if(blink_min==1)     RA3=1;//DIS3
      else RA3=0;//DIS3
      delay_ms(3);         RA3=1;
      PortB=MAP[DIS4];
      if(blink_min==1)     RA2=1;//DIS4
      else RA2=0;//DIS4
      delay_ms(3);         RA2=1;
      PortB=MAP[DIS5];output_low(PIN_B7);
      if(blink_hour==1)    RA1=1;//DIS5
      else RA1=0;//DIS5
      delay_ms(3);         RA1=1;
      PortB=MAP[DIS6];
      if(blink_hour==1)    RA0=1;//DIS6
      else {if (portb==0xC0) RA0=1; else RA0=0;}//DIS6
      delay_ms(3);         RA0=1;//*/
      if(count==0) {count=15;on_off=1;}
      
exit:
      count--;
}
void main() {
byte u;
 Delay_ms(5);
 Trisd = 0x0F;
 Trisb = 0x00;//output
 Trisa = 0x00;
 RD4=1;RD5=1;
 init_ds1307();
 u=read_ds1307(0);
 sec=u & 0x7F;// enable RTC
 write_ds1307(0,sec);// set second to 00 and enable clock(bit7=0)

//Xoa tat ca cac co dieu khien
 key=5;mode=0;blink=0;
 blink_sec=0;blink_min=0;blink_hour=0;
 count=15;on_off=1;
   ampm = bit_test(hour,5);// test AM_PM
   if(ampm==0)  {RD4 = 0;RD5=1;}   //LED AM 
   if(ampm==1)  {RD4 = 1;RD5=0;}   //LED PM
while(true) 
   {
   read_time();
   display();
   keyscan();
   }
}//end of main program
HueDN vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-11-2007, 11:08 AM   #8
kali
Nhập môn đệ tử
 
Tham gia ngày: Jun 2007
Bài gửi: 2
:
Chào mọi người!
Mình dùng protues mô phỏng con DS1307.
Mình đã nạp vào thanh ghi điều khiển 0x07 của DS1307 giá trị 0x10, tức mình muốn nó phát xung 1Hz ở chân Sout, nhưng trong protues thì nó lại phát xung 0.5Hz.
Bạn nào giải thích hộ mình nguyên nhân được không.
Thanks.
kali vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-11-2007, 01:26 PM   #9
vinhyen1
Nhập môn đệ tử
 
Tham gia ngày: Oct 2007
Bài gửi: 1
:
minh dang lam he thong dong ho thuc

minh su dung DS 1302,noi voi IC 89S51 các ban co the chi cho minh các buoc để lập trình và cách chuyển du lieu lên LCD.minh cam on moi bat dau hoc mong các ban dung cuoi nhe
vinhyen1 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-11-2007, 01:55 PM   #10
hanspkt
Đệ tử 3 túi
 
Tham gia ngày: Aug 2006
Bài gửi: 55
:
bạn dùng ngôn ngữ lập trình gì
hanspkt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-12-2008, 10:26 PM   #11
ketxanh
Đệ tử 3 túi
 
ketxanh's Avatar
 
Tham gia ngày: Aug 2008
Bài gửi: 53
:
Muốn tìm hiểu DS1307 thi đọc datasheet la biết hết liền. Trong Datasheet chỉ rõ làm bạn ơi
__________________
Hãy cho trước khi nhận
ketxanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-12-2008, 01:29 PM   #12
12a3456789
Nhập môn đệ tử
 
Tham gia ngày: Dec 2008
Bài gửi: 2
:
đồng hồ số dùng DS1307

ai đó giúp với mình đang viết chương trình đồng hồ số hiển thị ngày, tháng, năm trên LED 7 đoạn dùng 98c51 với DS1307 bằng ngôn ngữ Assemble .Mình đang cần chương trình để tham khảo, ai đó có chương trình thì post lên nhen.Nếu được thì gửi cho chương trình luôn, địa chỉ email của mình la caovan_py@yahoo.com
12a3456789 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-07-2009, 09:21 AM   #13
hvhdtk3
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 11
:
DS1307_Anh em giúp tui giải thích điều này nhé!!!

Mình đang làm cái đồng hồ số hiển thị LCD 16*2, dùng DS1307. Có 2 điều tui ko giải thích được, mong các bạn giúp đỡ:
1) Mình đọc kỹ Datasheet của DS1307 và cấu hình thanh ghi Control (địa chỉ 07H) là:
write_DS1307(0x07, 0x90); //nghĩa là tại địa chỉ 07H, ghi vào giá trị 90H = (10010000)binary.
Khi đó, bit SQWE = 1 phải tạo xung ra có tần số 1 Hz.
Khi mô phỏng, thời gian hiển thị trên LCD là đúng, nhưng chân tạo xung 1 Hz lại không đúng, nó cứ 2 giây mới thay đổi trạng thái. Thành ra giá trị giây hiển thị là: 1, 3, 5,... chứ không liên tục 1, 2, 3, 4..... Why?????????????????????????????????
2) Mình đặt giá trị ban đầu cho DS1307 là: ngày 07, tháng 08, năm 09. Nhưng trên LCD không hiển thị số 0, mà chỉ là: 7 / 8 / 9 Why?????????????????????????????????
Các bạn giúp mình với !
hvhdtk3 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-07-2009, 07:06 AM   #14
nguyenhung1811
Đệ tử 3 túi
 
Tham gia ngày: Jul 2007
Bài gửi: 48
:
Trích:
Nguyên văn bởi hvhdtk3 View Post
Mình đang làm cái đồng hồ số hiển thị LCD 16*2, dùng DS1307. Có 2 điều tui ko giải thích được, mong các bạn giúp đỡ:
1) Mình đọc kỹ Datasheet của DS1307 và cấu hình thanh ghi Control (địa chỉ 07H) là:
write_DS1307(0x07, 0x90); //nghĩa là tại địa chỉ 07H, ghi vào giá trị 90H = (10010000)binary.
Khi đó, bit SQWE = 1 phải tạo xung ra có tần số 1 Hz.
Khi mô phỏng, thời gian hiển thị trên LCD là đúng, nhưng chân tạo xung 1 Hz lại không đúng, nó cứ 2 giây mới thay đổi trạng thái. Thành ra giá trị giây hiển thị là: 1, 3, 5,... chứ không liên tục 1, 2, 3, 4..... Why?????????????????????????????????
2) Mình đặt giá trị ban đầu cho DS1307 là: ngày 07, tháng 08, năm 09. Nhưng trên LCD không hiển thị số 0, mà chỉ là: 7 / 8 / 9 Why?????????????????????????????????
Các bạn giúp mình với !
ban cho minh xin doan chuong trinh ma ban viet nhe'. Minh viet mai ma` chi co ghi duoc thoi. ko doc du lieu duoc.
nguyenhung1811 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-10-2009, 12:35 AM   #15
hvhdtk3
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 11
:
Trích:
Nguyên văn bởi nguyenhung1811 View Post
ban cho minh xin doan chuong trinh ma ban viet nhe'. Minh viet mai ma` chi co ghi duoc thoi. ko doc du lieu duoc.
Giờ mình viết xong rồi đây! Không biết gửi File đính kèm như thế nào cả, đành post cả chương trình trình lên vậy! Anh em thông cảm nha!

Tuy dùng Proteus mô phỏng ngon lành, nhưng mình test trên mạch thật thì gặp vấn đề này không giải thích được! Mong anh em giúp đỡ.
Mình đặt giá trị cho DS1307: setDateDs1307(01, 02, 03, 04, 05, 06, 07);
với mục đích hiển thị trên LCD là: Time: 03:02:01 Date: 05:06:07
Nhưng trên LCD lại hiển thị: Time: 05:03:00 Date: 07:00:00
Hic! Hiển thị sai rồi! Biết làm sao đây???

Code:

////////////////////////////////////////////////////////////////////////////////
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bi ts=9)
#use i2c(Master,Fast,sda=PIN_A1,scl=PIN_A0)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#define DS1307_SDA PIN_A1
#define DS1307_SCL PIN_A0
//************************************************
int8 val_sec1, val_min1, val_hou1, val_dat1, val_mon1, val_yea1;
int8 val_sec2, val_min2, val_hou2, val_dat2, val_mon2, val_yea2;
//************************************************
void display_lcd();
//************************************************
#int_ext // Khai bao chuong trinh ngat
RB0_isr() {
display_lcd();
return input(PIN_B1);
}
//**********************************************
int8 decToBcd(int8 val) {
return ( (val/10*16) + (val%10) );
}
//***********************************
int8 bcdToDec1(int8 val) { //Tach lay so hang chuc
return (val/16*10);
}
//***********************************
int8 bcdToDec2(int8 val) { //Tach lay so hang don vi
return (val%16);
}
//***********************************
void init_DS1307() {
output_float(DS1307_SCL); //Bus free
output_float(DS1307_SDA); //Bus free
}
//***********************************
void write_DS1307(byte address, byte data) {
short int status;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xd0);
while(status==1)
{
i2c_start();
status=i2c_write(0xd0);
}
}
//***********************************
BYTE read_DS1307(byte address)
{
BYTE data;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_start();
i2c_write(0xd1);
data=i2c_read(0);
i2c_stop();
return(data);
}
//***********************************
void setDateDs1307(int8 second, // 0-59
int8 minute, // 0-59
int8 hour, // 1-23
int8 dayOfWeek, // 1-7
int8 dayOfMonth, // 1-28/29/30/31
int8 month, // 1-12
int8 year) // 0-99
{
write_DS1307(0x0, decToBcd(second));
delay_ms(10);
write_DS1307(0x1, decToBcd(minute));
delay_ms(10);
write_DS1307(0x2, decToBcd(hour));
delay_ms(10);
write_DS1307(0x3, decToBcd(dayOfWeek));
delay_ms(10);
write_DS1307(0x4, decToBcd(dayOfMonth));
delay_ms(10);
write_DS1307(0x5, decToBcd(month));
delay_ms(10);
write_DS1307(0x6, decToBcd(year));
}
//***********************************
void display_lcd() {
LCD_putcmd(0x80);
Printf(LCD_putchar,"Time: ");
LCD_putcmd(0xC0);
Printf(LCD_putchar,"Date:");
//*******************************************
val_sec1 = bcdToDec1(read_DS1307(0x00)); //So giay hang chuc
val_sec2 = bcdToDec2(read_DS1307(0x00)); //So giay hang don vi

val_min1 = bcdToDec1(read_DS1307(0x01));
val_min2 = bcdToDec2(read_DS1307(0x01));

val_hou1 = bcdToDec1(read_DS1307(0x02));
val_hou2 = bcdToDec2(read_DS1307(0x02));

val_dat1 = bcdToDec1(read_DS1307(0x04));
val_dat2 = bcdToDec2(read_DS1307(0x04));

val_mon1 = bcdToDec1(read_DS1307(0x05));
val_mon2 = bcdToDec2(read_DS1307(0x05));

val_yea1 = bcdToDec1(read_DS1307(0x06));
val_yea2 = bcdToDec2(read_DS1307(0x06));
//*******************************************
//In lan luot cac so ra LCD
LCD_putcmd(0x8E);
Printf(LCD_putchar,"%u",val_sec1);
LCD_putcmd(0x8F);
Printf(LCD_putchar,"%u",val_sec2);

LCD_putcmd(0x8A);
Printf(LCD_putchar,"%u:",val_min1);
LCD_putcmd(0x8B);
Printf(LCD_putchar,"%u:",val_min2);

LCD_putcmd(0x86);
Printf(LCD_putchar,"%u:",val_hou1);
LCD_putcmd(0x87);
Printf(LCD_putchar,"%u:",val_hou2);

LCD_putcmd(0xC6);
Printf(LCD_putchar,"%u/",val_dat1);
LCD_putcmd(0xC7);
Printf(LCD_putchar,"%u/",val_dat2);

LCD_putcmd(0xCA);
Printf(LCD_putchar,"%u/",val_mon1);
LCD_putcmd(0xCB);
Printf(LCD_putchar,"%u/",val_mon2);

LCD_putcmd(0xCE);
Printf(LCD_putchar,"%u",val_yea1);
LCD_putcmd(0xCF);
Printf(LCD_putchar,"%u",val_yea2);
}
//***********************************

void main()
{
set_tris_b (0x01);
set_tris_d (0x00);
output_b (0x00);
output_c (0x00);
output_d (0x00);
LCD_init(); //Khoi tao LCD
LCD_putcmd(0x80);
Printf(LCD_putchar,"Time: ");
LCD_putcmd(0xC0);
Printf(LCD_putchar,"Date:");
init_DS1307(); //Khoi tao DS1307
write_DS1307(0x07, 0x90); //Cau hinh thanh ghi cua DS1307
setDateDs1307(01, 02, 03, 04, 05, 06, 07); //Vi du Time: 03:02:01 Date: 05:06:07
enable_interrupts(GLOBAL);
enable_interrupts(INT_ext);
while (1)
{
}
}
//************************************************** **
////////////////////////////////////////////////////////////////////////////////
//************************************************** **
hvhdtk3 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
Làm ơn giúp đỡ lập trình PIC với DS1307, EEPROM enti PIC - Thiết kế và Ứng dụng 1 20-11-2006 06:19 PM


Múi giờ GMT. Hiện tại là 07:21 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam