Thông báo

Collapse
No announcement yet.

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

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

  • 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ì?

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


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


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


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


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


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


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


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


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


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


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


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


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


                            • #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...
                              X