PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   hỏi về đồng hồ thời gian thực sử dụng DS1307 và pic16f887 (http://www.picvietnam.com/forum/showthread.php?t=10937)

tnt_bkfet 27-08-2011 01:14 PM

hỏi về đồng hồ thời gian thực sử dụng DS1307 và pic16f887
 
Hi, mình mới học PIC và đang làm Đồng hồ thời gian dùng pic16f887 và ds1307 hiển thị trên LCD. Mọi người cho mình hỏi, mình đã mô phỏng tên proteus chạy tốt nhưng khi cắm mạch nó không chạy, màn hình xanh hiện đủ cả 2 dòng nhưng không có chữ hay số.
Thanks!

DINH THANH SANG 27-08-2011 01:50 PM

Trích:

Nguyên văn bởi tnt_bkfet (Post 49010)
Hi, mình mới học PIC và đang làm Đồng hồ thời gian dùng pic16f887 và ds1307 hiển thị trên LCD. Mọi người cho mình hỏi, mình đã mô phỏng tên proteus chạy tốt nhưng khi cắm mạch nó không chạy, màn hình xanh hiện đủ cả 2 dòng nhưng không có chữ hay số.
Thanks!

bạn gửi code và sch lên cho moị người xem thử mới biết được.

lionking 27-08-2011 03:01 PM

Trích:

Nguyên văn bởi tnt_bkfet (Post 49010)
Hi, mình mới học PIC và đang làm Đồng hồ thời gian dùng pic16f887 và ds1307 hiển thị trên LCD. Mọi người cho mình hỏi, mình đã mô phỏng tên proteus chạy tốt nhưng khi cắm mạch nó không chạy, màn hình xanh hiện đủ cả 2 dòng nhưng không có chữ hay số.
Thanks!

mo phỏng mà chạy rồi thì ko phai do code chương trinh. Ban xem lai phần cứng đi, có thể là do mạch không tiép xúc hoặc đứt

tnt_bkfet 27-08-2011 03:37 PM

1 Attachment(s)
Trích:

Nguyên văn bởi DINH THANH SANG (Post 49011)
bạn gửi code và sch lên cho moị người xem thử mới biết được.


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!

tdm 27-08-2011 07:49 PM

Trích:

Nguyên văn bởi tnt_bkfet (Post 49015)
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();
  }
}


tnt_bkfet 01-09-2011 05:44 PM

Thanks people, thì ra do mình chưa nối chân VBat của Ds1307 vào GND, tại do mình ko dùng pin

tnt_bkfet 01-09-2011 05:46 PM

ah, nhân tiện mọi người cho mình hỏi để làm Button cho đồng hồ thì cần làm những bước gì

pstin 02-09-2011 08:04 PM

1 Attachment(s)
Hì, có đầy đủ các loại nút nhấn đó.
Kinh nghiệm chẳng nên dùng loại có tụ, bởi khi nhấn nút sẽ bị ngắn mạch tụ, lâu ngày sẽ bị hỏng tụ và chai nút nhấn.
Dùng loại có 02 điện trở là chắc nhất, kích mass hay Vcc tùy theo ý thích thôi, thường thì kích mass hay hơn.
Chuyện lập trình thì quá đơn giản và có nhiều "sọt" rồi!!!!!!!!.

vuongjerydang 18-03-2015 09:43 AM

cho mình hỏi sao mình down file code và mạch mô phỏng về mà đọc không đc


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam