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

                              • bqviet
                                Trả lời cho Đấu tắt điện cho máy tính bảng
                                bởi bqviet
                                Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
                                06-12-2025, 17:17
                              • nguyendinhvan
                                Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
                                bởi nguyendinhvan
                                Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
                                05-12-2025, 19:59
                              • afrendly
                                Trả lời cho Đấu tắt điện cho máy tính bảng
                                bởi afrendly
                                Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
                                04-12-2025, 01:27
                              • nick22
                                Trả lời cho Máy điện châm ?
                                bởi nick22
                                Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
                                01-12-2025, 13:23
                              Đang tải...
                              X