![]() |
|
Tài trợ cho PIC Vietnam |
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 |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: Aug 2010
Bài gửi: 5
: |
![]() 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! |
![]() |
![]() |
![]() |
#2 |
Đệ tử 3 túi
Tham gia ngày: Jul 2011
Bài gửi: 55
: |
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 |
![]() |
![]() |
![]() |
#3 |
Đệ tử 3 túi
Tham gia ngày: May 2011
Bài gửi: 47
: |
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
|
![]() |
![]() |
![]() |
#4 |
Nhập môn đệ tử
Tham gia ngày: Aug 2010
Bài gửi: 5
: |
![]() 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! |
![]() |
![]() |
![]() |
#5 | |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Trích:
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 |
|
![]() |
![]() |
![]() |
#6 |
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
|
![]() |
![]() |
![]() |
#7 |
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ì
|
![]() |
![]() |
![]() |
#8 |
Đệ 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!!!!!!!!. |
![]() |
![]() |
![]() |
#9 |
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
|
![]() |
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|