PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

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

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 27-08-2011, 01:14 PM   #1
tnt_bkfet
Nhập môn đệ tử
 
Tham gia ngày: Aug 2010
Bài gửi: 5
:
Question 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!
tnt_bkfet vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2011, 01:50 PM   #2
DINH THANH SANG
Đệ tử 3 túi
 
Tham gia ngày: Jul 2011
Bài gửi: 55
:
Trích:
Nguyên văn bởi tnt_bkfet View Post
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.
__________________
ĐINH THANH SANG 1990
AN MỸ - CẨM CHÂU - HỘI AN - QUẢNG NAM
DĐ: 01684222047
Yahoo ID: thanh_sang_mua_he_mai_xanh@yahoo.com.vn
DINH THANH SANG vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2011, 03:01 PM   #3
lionking
Đệ tử 3 túi
 
lionking's Avatar
 
Tham gia ngày: May 2011
Bài gửi: 47
:
Trích:
Nguyên văn bởi tnt_bkfet View Post
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
lionking vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-08-2011, 03:37 PM   #4
tnt_bkfet
Nhập môn đệ tử
 
Tham gia ngày: Aug 2010
Bài gửi: 5
:
Red face

Trích:
Nguyên văn bởi DINH THANH SANG View Post
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!
File Kèm Theo
File Type: rar 16F887_7_RTC.rar (86.9 KB, 1114 lần tải)
tnt_bkfet vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
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
Old 01-09-2011, 05:44 PM   #6
tnt_bkfet
Nhập môn đệ tử
 
Tham gia ngày: Aug 2010
Bài gửi: 5
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-09-2011, 05:46 PM   #7
tnt_bkfet
Nhập môn đệ tử
 
Tham gia ngày: Aug 2010
Bài gửi: 5
:
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ì
tnt_bkfet vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-09-2011, 08:04 PM   #8
pstin
Đệ tử 7 túi
 
Tham gia ngày: Jul 2010
Nơi Cư Ngụ: TP HCM
Bài gửi: 190
:
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!!!!!!!!.
File Kèm Theo
File Type: pdf NUT NHAN.pdf (82.1 KB, 625 lần tải)
pstin vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-03-2015, 09:43 AM   #9
vuongjerydang
Nhập môn đệ tử
 
Tham gia ngày: Mar 2015
Bài gửi: 2
:
cho mình hỏi sao mình down file code và mạch mô phỏng về mà đọc không đc
vuongjerydang 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


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


Đượ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