View Single Post
Old 27-08-2011, 07:49 PM   #5
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi tnt_bkfet View Post
Code và mô phỏng, bạn xem giúp mình với. Mô phỏng thì chạy tốt mỗi tội đưa ra test thử trên mạch thì không chạy.
Thanks!
chưa cấu hình cho PIC thì làm sao nó chạy được.
code của bạn:
Code:
#include "16F887.h"
#include "def_877a.h"
//*************cấu hình PIC *********************
# fuses NOWDT, HS, NOPROTECT, NOLVP, PUT//thêm vào
# use delay (clock = 20000000)//thêm vào
//********************************************
#include "lcd.c" //File nay co san trong CCS
int8 second, minute, hour, date, day, month, year;
int16 year1;
int i;

// ------- Chuyen du lieu mã BINARY cua MASTER -> du lieu mã BCD cho DS1307--------
int DECIMALtoBCD(int data) // MASTER -> DS1307
{ 
     // x -> y trong do x la du lieu cua MASTER, y la du lieu sau khi chuyen doi
     // Thuat toan thuc hien bien doi tu ma  DECIMAL sang ma BCD he 10 
     int x, y, z; 
     x = data;
     if(x<10) // vd: (x=9) -> (y=9) = 0x09
     {
           y = x;
     }
     else if(x>=10) // vd: (x=29) -> (y=41) = 0x29
     {
           y = (x/10 * 6) + x; 
     }
     return y; 
}

// ------- Chuyen du lieu mã BCD cua DS1307 -> du lieu mã BINARY cho MASTER-------
int BCDtoDECIMAL(int data) // MASTER <- DS1307
{ 
     // x <- y trong do y la du lieu cua SLAVE, x la du lieu sau khi chuyen doi
     // Thuat toan thuc hien bien doi tu ma BCD he 10 sang ma DECIMAL 
     int x,y,z;
     y = data;        
     i=0;             
     if(y<10)         // vd: (x=9) <- (y=9) = 0x09
     { 
              x = y;   
     } 
     else if(y>=10)  // vd: (x=10) <- (y=16) = 0x10
     {
        do         
        {
              x = y - (6 * i); 
              z = (x/10 * 6) + x; 
              i++;
        }
        while(z!=y);
     }
     return x; 
}

#int_EXT
void  set_time() 
{
  // --------- Khoi tao hien thi ban dau: SAT, 15-10-2011, 07:30:00 --------
  second = 0; //Giay: 00
  minute = 30; //Phut: 30
  hour = 7; //Gio: 07 (che do 24h)
  day = 7; //Thu 7: SAT (SATURDAY)
  date = 15; //Ngay: 15
  month = 10; //Thang: 10
  year = 11; //Nam: 11
  
  // Ghi gia tri vao slave
  i2c_start(); // Bat dau ghi du lieu vao Slave
  i2c_write(0xD0); // Truyen dia chi cua DS1307 len duong truyen I2C ( 0xD0 = Slave Address OR Write bit hay (0x68 OR 0) )
  i2c_write(0x00); // Truyen dia chi thanh ghi 0x00 cua DS1307
  i2c_write(DECIMALtoBCD(second)); // Ghi gia tri BCD giay vao thanh ghi 0x00
  i2c_write(DECIMALtoBCD(minute)); // Ghi gia tri BCD phut vao thanh ghi 0x01
  i2c_write(DECIMALtoBCD(hour));   // Ghi gia tri BCD gio vao thanh ghi 0x02
  i2c_write(DECIMALtoBCD(day));    // Ghi gia tri BCD thu vao thanh ghi 0x03
  i2c_write(DECIMALtoBCD(date));   // Ghi gia tri BCD ngay vao thanh ghi 0x04
  i2c_write(DECIMALtoBCD(month));  // Ghi gia tri BCD thang vao thanh ghi 0x05
  i2c_write(DECIMALtoBCD(year));   // Ghi gia tri BCD nam vao thanh ghi 0x06
  i2c_write(0x10);          // Ghi gia tri vao thanh ghi 0x07 de tao xung vuong 1Hz
  i2c_stop(); // Ket thuc ghi du lieu
}

void update_time()
{
  // Doc du lieu tu Slave
  i2c_start(); // Bat dau doc du lieu tu Slave
  i2c_write(0xD0); // Truyen dia chi cua DS1307 len duong truyen I2C ( 0xD0 = Slave Address OR Write bit hay (0x68 OR 0) )
  i2c_write(0x00); // Truyen dia chi thanh ghi 0x00 cua DS1307
  i2c_start();     // Dieu kien Restart
  i2c_write(0xD1);  
  second = BCDtoDECIMAL(i2c_read()); // Doc gia tri giay tu thanh ghi 0x00 cua DS1307
  minute = BCDtoDECIMAL(i2c_read()); // Doc gia tri phut tu thanh ghi 0x01 cua DS1307
  hour = BCDtoDECIMAL(i2c_read());   // Doc gia tri gio tu thanh ghi 0x02 cua DS1307
  day = BCDtoDECIMAL(i2c_read());    // Doc gia tri thu tu thanh ghi 0x03 cua DS1307
  date = BCDtoDECIMAL(i2c_read());   // Doc gia tri ngay tu thanh ghi 0x04 cua DS1307
  month = BCDtoDECIMAL(i2c_read());  // Doc gia tri thang tu thanh ghi 0x05 cua DS1307
  year = BCDtoDECIMAL(i2c_read(0));  // Doc gia tri nam tu thanh ghi 0x06 cua DS1307
  i2c_stop(); // Ket thuc doc du lieu
}

void display_LCD()
{
  // --------------- Hàng 1 cua LCD: hien thi thu. ngay - thang - nam ---------
  
  lcd_gotoxy(1,1); // Bat dau o hang 1, cot 1
  if(day==2) lcd_putc("Mon"); // Hien thi thu o hang 1, cot 1
  else if(day==3) lcd_putc("Tue");
  else if(day==4) lcd_putc("Wed");
  else if(day==5) lcd_putc("Thu");
  else if(day==6) lcd_putc("Fri");
  else if(day==7) lcd_putc("Sat");
  else if(day==1) lcd_putc("Sun");
  
  lcd_gotoxy(4,1); // Nhay sang hang 1, cot 4
  lcd_putc("."); // Hien thi dau "." o hang 1, cot 4

  lcd_gotoxy(6,1); // Nhay sang hang 1, cot 6
  if(date<10)
  {
      lcd_putc("0"); // Hien thi so 0 o hang 1, cot 6
      lcd_gotoxy(7,1); // Nhay sang hang 1, cot 7
      printf(lcd_putc,"%d", date); // Hien thi thang o hang 1, cot 7
  }
  else if(date>=10)
  {
      printf(lcd_putc,"%d", date); 
  }

  lcd_gotoxy(8,1); // Nhay sang hang 1, cot 8
  lcd_putc("-"); // Hien thi dau "-" o hang 1, cot 8

  lcd_gotoxy(9,1); // Nhay sang hang 1, cot 9
  if(month==1) lcd_putc("Jan"); // Hien thi thang o hang 1, cot 9
  else if(month==2) lcd_putc("Feb");
  else if(month==3) lcd_putc("Mar"); 
  else if(month==4) lcd_putc("Apr");
  else if(month==5) lcd_putc("May");
  else if(month==6) lcd_putc("Jun");
  else if(month==7) lcd_putc("Jul");
  else if(month==8) lcd_putc("Aug");
  else if(month==9) lcd_putc("Sep"); 
  else if(month==10) lcd_putc("Oct");
  else if(month==11) lcd_putc("Nov");
  else if(month==12) lcd_putc("Dec");

  lcd_gotoxy(12,1); // Nhay sang hang 1, cot 12
  lcd_putc("-"); // Hien thi dau "-" o hang 1, cot 12

  lcd_gotoxy(13,1); // Nhay sang hang 1, cot 13
  year1 = 2000 + year; 
  printf(lcd_putc,"%ld", year1); // Hien thi nam o cac cot 13,14,15,16

  // --------------- Hàng 2 cua LCD: hien thi gio : phut : giay  ---------

  lcd_gotoxy(6,2); // Nhay xuong  hang 2, cot 6
  if(hour<10) // Gio
  {
      lcd_putc("0");
      lcd_gotoxy(7,2);
      printf(lcd_putc,"%d", hour); 
  }
  else if(hour>=10)
  {
       printf(lcd_putc,"%d", hour); 
  }

  lcd_gotoxy(8,2);
  lcd_putc(":");

  lcd_gotoxy(9,2); // Nhay sang hang 2, cot 9
  if(minute<10) // Phut
  {
      lcd_putc("0"); 
      lcd_gotoxy(10,2);
      printf(lcd_putc,"%d", minute); 
  }
  else if(minute>=10)
  {
       printf(lcd_putc,"%d", minute); 
  }

  lcd_gotoxy(11,2);
  lcd_putc(":");

  lcd_gotoxy(12,2); // Nhay sang hang 2, cot 12
  if(second<10) // Giay
  {
      lcd_putc("0"); 
      lcd_gotoxy(13,2);
      printf(lcd_putc,"%d", second); 
  }
  else if(second>=10)
  {
      printf(lcd_putc,"%d", second); 
  }
}

void main()
{
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!
   
   lcd_init();
   delay_ms(10);

   while(TRUE)
   {
      update_time(); 
      display_LCD(); 
   }
}
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.

thay đổi nội dung bởi: tdm, 27-08-2011 lúc 08:02 PM. Lý do: chèn thêm code
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn