Thắc mắc đơn giản về code C.

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • i0988305410
    Thành viên tích cực
    • Jan 2012
    • 138

    #1

    Thắc mắc đơn giản về code C.

    #include<regx51.h>
    void delay(unsigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms
    {
    unsigned int i;
    unsigned char j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte
    for(i=0;i<ms;i++)
    for(j=0;j<120;j++)

    {}//không làm gì cả
    }
    main()//Chương trình chính
    {
    While(1)//tạo vòng lặp vô hạn
    {
    P1=0x00;//"0x00"là giá trị viết trong hệ hex, cái này=00000000
    delay(1000);//tạo độ trễ 1000ms=1s
    P1=0xff;//"0xff"là giá trị viết trong hệ hex, cái này=11111111
    delay(1000);
    }
    Mấy bro cho em hỏi là 2 lệnh for ở trên dùng để làm gì?
  • chinh_cover
    Thành viên tích cực
    • Apr 2009
    • 167

    #2
    vòng lặp for dùng để xác định số lần lặp xác định, mà code ở trên thì ý đồ của người viết:
    void delay(unsigned int ms)// đặt thời gian muốn làm trễ ,ms
    {
    unsigned int i;
    unsigned char j;
    for(i=0;i<ms;i++)
    for(j=0;j<120;j++)// lặp xác định là 120 lần
    {}//không làm gì cả
    có nghĩa là i tăng 120 lần thì j mới tăng 1 lần, và bạn sẽ tính vòng lặp for tốn bao nhiêu thời gian xử lý nữa.
    Ps: Đây là hàm delay bình thường mình hay dùng nè:
    void delay(unsigned int time){
    while time--;
    continue;
    }

    Comment

    • nguyenvanvui
      Thành viên tích cực
      • May 2009
      • 168

      #3
      hàm delay này mình dùng số nhỏ hơn nữa nè:

      #define DELAY_2N (value)

      void delay(int count)
      {
      count <<= DELAY_2N;
      while(count--);
      }

      vì có dòng count <<= DELAY_2N (count = count << DELAY_2N = count * 2 ^ DELAY_2N - ở đây phép << 1 chính là * 2^1 trong kiểu thập phân còn >> 1 chính là / 2^1) nên bạn chỉ cần truyền cho count 1 giá trị nhỏ cũng đủ có 1 giá trị delay đáp ứng với các ứng dụng cần delay cho chip của bạn.
      ví dụ:
      value = 10 --> delay(10);
      các vấn đề về sdcard, usb, tcp/ip, upgrate firmware,...
      trên các dòng chip: stm32, lpc of nxp
      please cell phone: 01649895559

      Comment

      • Lenh Ho
        Thành viên tích cực
        • Mar 2010
        • 378

        #4
        Câu trả lời như sau:

        vòng lặp bạn sử dụng chính là để thực hiện công việc gì đó lặp đi lặp lại, như theo bài của bạn thì đó là vòng lặp lồng. Mục đích là để tăng thời gian ( mục đích của nó là delay- làm trễ) vì nội dung trong vòng lặp chẳng có gì.

        Ví dụ:
        for ( i = 0; i<100; i++)
        for( j = 0; j < 200; j++)
        {
        // không làm gì
        }


        có nghĩa : ban đầu vòng lặp ngoài chạy, i = 0, nó tiếp tục kiểm tra điều kiện là i < 100 hay không, câu trả lời là có, vậy nó chạy vào nội dung bên trong vòng lặp con của nó.
        Trong vòng lặp con, j = 0 , nó kiểm tra xem j < 200 hay không , câu trả lời là có, nó chạy vào nội dung bên trong của vòng lặp con sau dấu {}, nhưng trong dấu ngoặc này không có gì, nó tiếp tục chạy vòng lặp bằng cách tăng j lên 1 đơn vị nữa ( j++ tức là j = j+1), sau đó nó lại kiểm tra điều kiện xem j < 200 hay không? cứ như vậy vòng lặp con chạy đến khi j = 200 thì thoát ( vì lúc này kiểm tra điều kiện j< 200 không còn đúng nữa), nhưng thoát vòng lặp con thì lại trở lại vòng lặp ngoài. vòng lặp ngoài tăng i lên 1 đơn vị nữa là i = 1, nó kiêmt tra điều kiện ( i <100) hay không rồi lại tiếp tục chạy vòng lặp bên trong...chạy cho đến khi i = 100 thì thoát

        Tóm lại bạn nên hiều về cấu trúc lặp trong c với vòng lặp for như sau:
        for( biểu thức 1; biều thức 2; biểu thức 3)

        trong đó:
        Biểu thức 1 là giá trị khởi tạo
        Biêu thức 2 là kiểm tra điều kiện ( đúng thì chạy tiếp, sai thi thoát)
        biểu thức 3: thường sử dụng làm thay đổi một cái gì đó

        Tóm lại:

        Câu bạn hỏi chính là vòng lặp, nó lặp lại 100*200 = 20000 lần ( tại vòng lặp trong lặp lại 200 lần thì vòng lặp 1 tăng 1 lần).
        Chúc bạn học tốt
        Be quan. Plz contact through email:

        Comment

        • i0988305410
          Thành viên tích cực
          • Jan 2012
          • 138

          #5
          Còn hàm delay(1000) là sao? Có phải delay(1000) là chương trình con không? Cái này là tự mài mò nên có khi mình hỏi rất ngớ ngẩn! Mong các bác thông cảm! Tại vì trên mạng thấy mấy cái led chạy chữ đẹp wa. Đọc code thì không hiểu!

          Comment

          • chinh_cover
            Thành viên tích cực
            • Apr 2009
            • 167

            #6
            Bạn nên học lập trình C trước, C cho vi điều khiển ấy, cái này mà cũng hỏi thì pó tay luôn.

            Comment

            • i0988305410
              Thành viên tích cực
              • Jan 2012
              • 138

              #7
              Nguyên văn bởi chinh_cover Xem bài viết
              Bạn nên học lập trình C trước, C cho vi điều khiển ấy, cái này mà cũng hỏi thì pó tay luôn.
              Ok! Dân mới vào nghề mà. Chỗ này coi 1 chút thì cũng hiểu rùi! Nhưng mà mình code thử trong Keli C rùi. Nó báo lỗi:
              NHAY CC.C(12): warning C206: 'While': missing function-prototype
              NHAY CC.C(12): error C267: 'While': requires ANSI-style prototype
              NHAY CC.C(13): error C141: syntax error near '{'.
              Vậy là code sai chỗ nào?
              Code của mình như z:
              #include<regx51.h>
              void delay(unsigned int ms)
              {
              unsigned int i;
              unsigned char j;
              for(i=0;i<ms;i++)
              for(j=0;j<120;j++)
              {}
              }
              main()
              {
              While(1)
              {
              P1=0x00;
              delay(1000);
              P1=0xff;
              delay(1000);
              }
              }

              }

              Comment

              • tdm
                Thành viên tích cực
                • Sep 2005
                • 349

                #8
                Nguyên văn bởi i0988305410 Xem bài viết
                Ok! Dân mới vào nghề mà. Chỗ này coi 1 chút thì cũng hiểu rùi! Nhưng mà mình code thử trong Keli C rùi. Nó báo lỗi:
                NHAY CC.C(12): warning C206: 'While': missing function-prototype
                NHAY CC.C(12): error C267: 'While': requires ANSI-style prototype
                NHAY CC.C(13): error C141: syntax error near '{'.
                Vậy là code sai chỗ nào?
                Code của mình như z:
                #include<regx51.h>
                void delay(unsigned int ms)
                {
                unsigned int i;
                unsigned char j;
                for(i=0;i<ms;i++)
                for(j=0;j<120;j++)
                {}
                }
                main()
                {
                While(1)
                {
                P1=0x00;
                delay(1000);
                P1=0xff;
                delay(1000);
                }
                }

                }
                bỏ bớt "} ".
                While(1)//W viết bằng chữ thường .
                |

                Comment

                • Lenh Ho
                  Thành viên tích cực
                  • Mar 2010
                  • 378

                  #9
                  hàm delay(1000) là một hàm có sẵn, nó tuơng tự như bạn viết một chương trình delay,thay vì viết thì người ta có sẵn rồi.

                  delay(tham số);
                  hàm này làm trì hoãn một khoảng time được tính theo ms
                  1000 = 1oooms = 1s

                  nhưng để chính xác thời gian thực ngườii ta hay sử dụng 1 timer để viết chương trình delay nha bạn
                  Be quan. Plz contact through email:

                  Comment

                  • i0988305410
                    Thành viên tích cực
                    • Jan 2012
                    • 138

                    #10
                    Nguyên văn bởi Lenh Ho Xem bài viết
                    hàm delay(1000) là một hàm có sẵn, nó tuơng tự như bạn viết một chương trình delay,thay vì viết thì người ta có sẵn rồi.

                    delay(tham số);
                    hàm này làm trì hoãn một khoảng time được tính theo ms
                    1000 = 1oooms = 1s

                    nhưng để chính xác thời gian thực ngườii ta hay sử dụng 1 timer để viết chương trình delay nha bạn
                    người ta hay sử dụng 1 timer để viết chương trình delay. Anh có thể nói chi tiết cái này ko???? Nếu hàm delay là hàm có sẵn rùi thì hai lệnh for ở trên để làm gì?

                    Comment

                    • nguyenvanvui
                      Thành viên tích cực
                      • May 2009
                      • 168

                      #11
                      Nguyên văn bởi i0988305410 Xem bài viết
                      người ta hay sử dụng 1 timer để viết chương trình delay. Anh có thể nói chi tiết cái này ko???? Nếu hàm delay là hàm có sẵn rùi thì hai lệnh for ở trên để làm gì?
                      timer là 1 ứng dụng mà hầu như trên chip nào cũng trang bị, việc sử dụng nó vào ứng dụng nào là tùy người dùng, khi đó cần gọi các thanh ghi để cấu hình mới dùng được. Nếu bạn muốn dùng cho delay thì bạn cũng fai viết 1 hàm delay để cấu hình cho các thanh ghi timer sau đó lấy giá trị của thanh ghi để áp cho biến delay của bạn, chứ ko có sẵn cho bạn dùng đâu,còn việc bạn dùng lệnh for chỉ là tạo 1 giá trị trì hoãn (là thời gian để chạy hết vòng lặp for), như thế cũng xem như bạn đã tạo 1 thời gian delay nhưng ko chính xác, có nghĩa là viết theo cách này để bạn có thể tạo 1s delay đúng thực tế bên ngoài thì bạn cần thay đổi rất nhiều lần giá trị của vòng lặp for mới có thể có giá trị đúng (nhưng ko tuyệt đối)

                      bạn cần học rất nhiều thứ khác từ vi điều khiển mới có thể viết chương trình được,
                      good luck
                      các vấn đề về sdcard, usb, tcp/ip, upgrate firmware,...
                      trên các dòng chip: stm32, lpc of nxp
                      please cell phone: 01649895559

                      Comment

                      • duong_act
                        Thành viên tích cực
                        • Nov 2008
                        • 4903

                        #12
                        Dùng bằng timer không hay lắm. Tốt nhất nên dùng các hàm delay thông thường.

                        Comment

                        • dongcv
                          Thành viên chính thức
                          • Oct 2010
                          • 93

                          #13
                          Nguyên văn bởi i0988305410 Xem bài viết
                          Ok! Dân mới vào nghề mà. Chỗ này coi 1 chút thì cũng hiểu rùi! Nhưng mà mình code thử trong Keli C rùi. Nó báo lỗi:
                          NHAY CC.C(12): warning C206: 'While': missing function-prototype
                          NHAY CC.C(12): error C267: 'While': requires ANSI-style prototype
                          NHAY CC.C(13): error C141: syntax error near '{'.
                          Vậy là code sai chỗ nào?
                          Code của mình như z:
                          #include<regx51.h>
                          void delay(unsigned int ms)
                          {
                          unsigned int i;
                          unsigned char j;
                          for(i=0;i<ms;i++)
                          for(j=0;j<120;j++)
                          {}
                          }
                          main()
                          {
                          While(1)
                          {
                          P1=0x00;
                          delay(1000);
                          P1=0xff;
                          delay(1000);
                          }
                          }

                          }
                          thừa mất 1 "}" , w của While viết thường --> ok

                          Comment

                          • Lenh Ho
                            Thành viên tích cực
                            • Mar 2010
                            • 378

                            #14
                            Anh duong_act có thể giải thích tại sao ta không dùng timer để viết một chuơng trình định thời hay không? thanks anh nhiều
                            Be quan. Plz contact through email:

                            Comment

                            • fee_08
                              Thành viên tích cực
                              • Mar 2011
                              • 201

                              #15
                              Lập trình họ avr với pic thì trình biên dịch mới hỗ trợ sẵn hàm delay , còn 89 thì tự viết , . Delay dùng for là làm cho vi điều khiển không làm gì cả trong khoảng thời gian delay . Delay dùng timer thì ngược lại do bộ timer chạy độc lập lý do nữa hay dùng là độ chính xác cao.

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...