hỏi về đồng hồ thời gian thực sử dụng DS1307 và pic16f887

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • tnt_bkfet
    Nhập môn đệ tử
    • Aug 2010
    • 5

    #1

    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
    Đệ tử 3 túi
    • Jul 2011
    • 55

    #2
    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

    Comment

    • lionking
      Đệ tử 3 túi
      • May 2011
      • 47

      #3
      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

      Comment

      • tnt_bkfet
        Nhập môn đệ tử
        • Aug 2010
        • 5

        #4
        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!
        Attached Files

        Comment

        • tdm
          Đệ tử 7 túi
          • May 2005
          • 258

          #5
          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(); 
             }
          }
          Last edited by tdm; 27-08-2011, 07:02 PM. Lý do: chèn thêm code
          viết chương trình cho vdk chạy ổn định là cả một vấn đề.

          Comment

          • tnt_bkfet
            Nhập môn đệ tử
            • Aug 2010
            • 5

            #6
            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

            Comment

            • tnt_bkfet
              Nhập môn đệ tử
              • Aug 2010
              • 5

              #7
              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ì

              Comment

              • pstin
                Đệ tử 7 túi
                • Jul 2010
                • 190

                #8
                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!!!!!!!!.
                Attached Files

                Comment

                • vuongjerydang
                  Nhập môn đệ tử
                  • Mar 2015
                  • 2

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

                  Comment

                  Working...