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

                              • mèomướp
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi mèomướp
                                Dạ hông dám làm thì chắc chắn sẽ mãi ko thể làm được đâu ạ. Nguồn xung dân dụng vài kw giờ rất nhìu ạ, sạc ô tô điện, máy hàn, lò vi sóng, âm ly... tùy chất lượng mà độ phức tạp sẽ khác nhau ạ. Và cái giá phải trả về kinh tế...
                                Hôm qua, 13:11
                              • tuyennhan
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi tuyennhan
                                Sửa dạng này thì chuyên còn không dám chắc khộng cháy nổ với linh kiện bán ngoài chợ nói gì khộng chuyên .
                                Hôm qua, 09:25
                              • tuyennhan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi tuyennhan
                                Đúng rồi chọn mua theo tai . ca thì phải toàn dải nhạc thì chỉ cao và thấp thé nên loa ca thì nghe nhạc không hay và ngược lại .
                                Muốn ca và nhạc đều hay thì phải dúng 2 giàn , còn nếu chỉ có 1 thì phải chỉnh sửa lại sao cho ca và nhạc đều được không quá dở ....
                                Hôm qua, 09:10
                              • Ng.Phuong.5
                                Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                                bởi Ng.Phuong.5
                                Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                                Mấy con...
                                09-01-2025, 19:44
                              • viettinh
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi viettinh
                                Bác nói đúng quá. Cơ mà muốn mua hàng chính hãng, hàng thương hiệu mà tai lại hợp hàng tầu mới khổ chứ.
                                Đang tính mua cái loa tầu nữa cột đằng sau loa này, Loa sony chỉ để hát nhép thôi, có dc k các bác ...
                                09-01-2025, 18:12
                              • nguyendinhvan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi nguyendinhvan
                                Theo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
                                Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
                                Cách đơn giản...
                                09-01-2025, 00:04
                              • mèomướp
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi mèomướp
                                Dạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
                                08-01-2025, 19:02
                              • tuyennhan
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi tuyennhan
                                Chủ thớt hỏi có kiểm tra được dao động mà không cấp nguồn thì rõ trình ở mức nào mà mèo còn xúi ngâm cứu nữa ác vậy ....
                                08-01-2025, 15:43
                              • tuyennhan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi tuyennhan
                                Loa bass đấu trực tiếp không qua phân tần để thành loa toàn dải xem có thoát tiếng khộng , nếu không thoát cần phải sửa lại mạch cs hay âm sắc nếu đủ trình còn nếu thoát ca hay nhưng chưa vừa ý vì bass kém chăc thì đấu lại như cũ và đấu thêm loa mid treble bên ngoài .
                                08-01-2025, 15:28
                              • mèomướp
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi mèomướp
                                Dạ loa tép bé xíu như ngón chân cái thôi ạ. Thiếu gì chỗ để đâu. Quan trọng là gắn thêm nó loa nghe ok hay ko thôi ạ...
                                08-01-2025, 11:44
                              Đang tải...
                              X