Thông báo

Collapse
No announcement yet.

Giúp mình về lập trình đồng hồ thời gian sử dụng DS1307 hiển thi LCD (Pic 16f877a)

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giúp mình về lập trình đồng hồ thời gian sử dụng DS1307 hiển thi LCD (Pic 16f877a)

    Mình đang làm một đề tài viết chương trình đồng hồ hiển thị lên LCD dùng DS1307. mình đã viết code nhưng khi nạp vào thì LCD chỉ hiện lên màn hình trắng mà không hoạt động gì nữa! Mình nghi ngờ chương trình bị rơi vào vòng lặp vô hạn nhưng mình tìm mãi cũng chưa biết lý do. Các bạn làm ơn giúp mình xem mình sai chõ nào. Cảm ơn nhiều.
    Đây là chương trình

    //////////////////////////////////////////////////////////////////
    #include <16f877a.h>
    #include <def_877a.h>
    #device *=16 ADC=8
    #fuses NOWDT,PUT,XT,NOPROTECT
    #use delay(clock=4000000)
    #include <DS1307.c>
    #include <LCD420.c>

    //====================Global variable declaration===============================
    int8 second, minute, hour;/*, date, day, mon, year,limit,limit1;
    int16 year1;
    int8 mode=-1;*/
    //====================================MAIN========== ============================
    void main(){
    TRISB = 0x00;
    PORTB = 0x00;

    lcd_init();
    delay_ms(10);
    //================Hien Thi Ban Dau===================
    init_DS1307();
    // Set date : 12-4-2012
    // Set time : thu 5 - 12 gio, 59 phút 10 giây
    setDateDs1307(12,4,12,5,12,59,10);
    delay_ms(10);

    while(1)
    { Printf(lcd_putc,"\f"); //=========Clear LCD=========================
    lcd_gotoxy( 1,1);
    Printf(lcd_putc,"TIME: ");
    second =read_DS1307(0x0);
    lcd_gotoxy( 7,1);
    Printf(lcd_putc,second/16 + 0x30);
    Printf(lcd_putc,second%16 + 0x30);
    lcd_gotoxy( 8,1);
    Printf(lcd_putc,":");

    minute =read_DS1307(0x01);
    lcd_gotoxy( 9,1);
    Printf(lcd_putc,minute/16 + 0x30);
    Printf(lcd_putc,minute%16 + 0x30);
    lcd_gotoxy( 10,1);
    Printf(lcd_putc,":");

    hour = read_DS1307(0x02);
    lcd_gotoxy( 11,1);
    Printf(lcd_putc,hour/16 + 0x30);
    Printf(lcd_putc,hour%16 + 0x30);
    }
    }

    /*
    LCD_putcmd(0xC0);//=========Put Cursor on line 2: thu ngay thang nam ============
    //thu
    day =read_DS1307(0x03);
    switch (day) {
    case 1: Printf(LCD_putchar," SUN"); break;
    case 2: Printf(LCD_putchar," MON"); break;
    case 3: Printf(LCD_putchar," TUE"); break;
    case 4: Printf(LCD_putchar," WEN"); break;
    case 5: Printf(LCD_putchar," THU"); break;
    case 6: Printf(LCD_putchar," FRI"); break;
    case 7: Printf(LCD_putchar," SAT"); break;
    }
    Printf(LCD_putchar," ");
    //ngay
    date =read_DS1307(0x04);
    LCD_putchar(day/16 + 0x30);
    LCD_putchar(day%16 + 0x30);
    Printf(LCD_putchar,"/");
    //thang
    mon=read_DS1307(0x05);
    LCD_putchar(mon/16 + 0x30);
    LCD_putchar(mon%16 + 0x30);
    Printf(LCD_putchar,"/");
    // nam
    year=read_DS1307(0x06);
    year=bcdToDec(year);
    year1 = 2000 + year;
    printf(lcd_putchar,"%ld",year1);
    }
    }
    }
    }
    */
    /////////////////////////////////////////////////////////////////////////


    Mình vừa từ 89c51 chuyển qua Pic nên lập trình còn có nhiều chỗ chưa biết....

  • #2
    mình đọc sơ qua. vì bạn để ngoài vậy khó đọc quá.với lại mình dùng HTC. có mấy chỗ mà hàm tính toán nó giống nhau bạn nên cho vào 1 chương trình con hoặc tính toán trong hàm readRTC luôn.
    email:
    chỉ được liên lạc từ 19h00 - 21h30



    Comment


    • #3
      chương trình chắc chưa chạy được đến chỗ tính toán đâu bạn ạ. Mình nghĩ nó bị dính lại ngay dòng lệnh nhập ngày tháng vào DS1037. Mình dùng thạch anh 4Mhz cho Pic để lập trình không biết có ảnh hưởng gì không?

      Comment


      • #4
        bạn up cả file.c lên luôn đi cho dể đọc
        email:
        chỉ được liên lạc từ 19h00 - 21h30



        Comment


        • #5
          không up được ban ơi. nó ghi là invalid!? mà có khi nào thạch anh 4MHZ anh hưởng không nhỉ

          Comment


          • #6
            Nguyên văn bởi super_noob Xem bài viết
            không up được ban ơi. nó ghi là invalid!? mà có khi nào thạch anh 4MHZ anh hưởng không nhỉ
            Debug bằng LED là phường pháp đơn giản để giải quyết các lỗi khi ko có debugger (Nếu có thì xài càng tốt)...
            Computer Science major - Vietnamese-German University
            Sponsored by

            Comment


            • #7
              bạn minh cly noi rõ hơn được không?! mình mới tiếp xúc với pic nên không hiểu

              Comment


              • #8
                Nguyên văn bởi super_noob Xem bài viết
                bạn minh cly noi rõ hơn được không?! mình mới tiếp xúc với pic nên không hiểu
                Bạn có thể chèn các hàm tắt mở led ở các điểm khác nhau để xem lệnh nào đc thực hiện và ở đâu bị lặp vô hạn (Giống kiểu checkpoint đó). Từ đó mình biết đc vị trí của mã lỗi thôi.
                Computer Science major - Vietnamese-German University
                Sponsored by

                Comment


                • #9
                  minh nghi là pic không lấy được hoặc ghi được vào DS1307...?! co cách nào giúp mình với?!

                  Comment


                  • #10
                    đồng hồ số hiện thị lcd (DS1307=PIC8F4620)

                    mình cũng đang làm bài đó nhưng giờ nó vẩn chưa chạy, giúp mình sử bài này với, cảm ơn các bạn đã giúp đỡ, đây là chương trình sử dung MPLAB
                    Attached Files

                    Comment


                    • #11
                      bạn cứ viết từng lệnh 1, thử giao tiếp với DS1307 coi có vấn đề gì ko, đọc từng giá trị rồi xuất ra thử, sau đó hiệu chỉnh lại, mình cũng đã làm mấy cái đồng hồ LCD rồi, đang xài máy của đứa bạn, bạn rãnh thì PM Y!M pndx89, mình sẽ chỉ cho.

                      Comment


                      • #12
                        DAMH2.rar thứ bạn đang cần đây
                        email: nguyentrungphuocspk@gmail.com

                        Comment


                        • #13
                          phần trong này là cách đọc giá trị từ DS_1307
                          Code:
                          void GET_ds1307()
                          {
                          
                                sec=read_ds1307(0);   // read second gan vao bien sec
                                sec=bcdtodec(sec);
                               
                               if(sec==0)
                               {
                                min=read_ds1307(1);   // read minute gan vao bien min
                                min=bcdtodec(min);
                               }
                               if(min==0&&sec==0)
                               {
                                hours=read_ds1307(2);   // read hour gan vao bien hour 
                                hours=bcdtodec(hours);
                               }
                               if(hours==0&&min==0&&sec==0)
                               {
                                day=read_ds1307(3);   // read day
                                day=bcdtodec(day);
                          
                                date=read_ds1307(4);  // read date gan vao bien date
                                date=bcdtodec(date);
                               }
                               if(day==1&&hours==0&&min==0&&sec==0)
                               {
                                month=read_ds1307(5); // read month gan vao bien month
                                month=bcdtodec(month);
                               }
                               if(month==1&&day==1&&hours==0&&min==0&&sec==0)
                               {
                                year=read_ds1307(6);  // read year gan vao bien year 
                                year=bcdtodec(year);
                               }
                                    
                          
                          
                          }
                          Còn đây là phần hiển thị của bạn
                          có 2 dòng
                          hh:mm:ss
                          dd:MM:yy

                          Code:
                          void Hienthi()
                          {
                                      lcd_putcmd(0x80);     
                                      printf(lcd_putchar,"TIME: %02U:%02U:%02U ",hours,min,sec);                 
                                      lcd_putcmd(0xc0);
                                      printf(lcd_putchar,"DATE: %02U/%02U/%02U ",date,month,year);
                          }
                          như vậy trong đoạn code cơ bản nhất của bạn


                          Code:
                          //============================
                          khia báo ban đầu
                          //====================
                          
                          void main()
                          {
                          //======= Khai báo ban đầu về tiền sử lý ============//
                          
                          bạn viết các phần khai báo, ngắt, định dạng biến.....
                          
                          //====( cái này là bất buộc )============//
                          
                          sec=dectobcd(30);                 // enable oscillator(bit 7 =0) cho phép dao dong o Bit 7 =0.
                          write_ds1307(0,sec);              // nhầm tạo giao động ban đầu cho DS_1307
                          
                          //==========================================//
                          //=============== đọc giá trị lần đầu tiên =========//
                                sec=read_ds1307(0);   // read second gan vao bien sec
                                sec=bcdtodec(sec);
                          
                                min=read_ds1307(1);   // read minute gan vao bien min
                                min=bcdtodec(min);
                          
                                hours=read_ds1307(2);   // read hour gan vao bien hour 
                                hours=bcdtodec(hours);
                          
                                day=read_ds1307(3);   // read day
                                day=bcdtodec(day);
                          
                                date=read_ds1307(4);  // read date gan vao bien date
                                date=bcdtodec(date);
                          
                                month=read_ds1307(5); // read month gan vao bien month
                                month=bcdtodec(month);
                          
                          
                                year=read_ds1307(6);  // read year gan vao bien year 
                                year=bcdtodec(year);
                          
                          //=========================================//
                          
                          //============= vào vòng Whlie ===============// 
                          
                          whlie(true)
                          {
                          GET_ds1307();
                          delay_ms(5);
                          Hienthi();
                          delay_ms(10);
                          }
                          
                          }
                          do may tính của mình ko đính kèm dc file mo phỏng, bạn cứ tập vào nghiên cứ, học viết từng dòng lệnh, đừng chỉnh sửa của người khác mà hảy tạo ra phong cách riêng của mình.
                          vấn đề về lịch vạn niên, tui thấy rất củ rồi, mà mọi người cử hỏi hoài. tìm vấn đề gì mới hơn nhé.

                          chúc bạn thành công
                          lambaotrungdt@gmail.com

                          Comment

                          Về tác giả

                          Collapse

                          super_noob Tìm hiểu thêm về super_noob

                          Bài viết mới nhất

                          Collapse

                          Đang tải...
                          X