Thông báo

Collapse
No announcement yet.

[thắc mắc- tư vấn] Hàm tạo trễ 1s cho 89c52

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

  • [thắc mắc- tư vấn] Hàm tạo trễ 1s cho 89c52

    Mình có đoạn chương trình tạo trễ 1s mình tham khảo được.Mạch đã chạy nhưng mình đọc lại code thì chưa hiểu rõ lắm.Mong các bạn chỉ giúp.

    void delay_ms(char x)
    {
    int i;
    TMOD = 0x20;
    for(i=0;i<=10*x;i++)
    {
    TL0 = 155;
    TR0 = 1;
    while(!TF0);
    TR0 = 0;
    TF0 = 0;
    }
    }
    Theo ý hiểu của mình thì Thanh ghi TMOD=0x20 thì timer hoạt động ở chế độ 2 timer 1. Nhưng trong vòng lặp thì lại khởi tạo cho thanh ghi TL0 của timer 0.( đây là chỗ không hiểu thứ nhất). Và chế độ 2 là chế độ tự nạp lại vậy nghĩa là (giả sử cho thanh ghi Timer0) thì TH0=155. Vậy cơ chế để tạo ra 1s trễ của hàm trên là như nào.
    Mong các bạn giải đáp giúp mình với

  • #2
    code kia đó là timer 0 hoạt động ở chế độ 0 chế độ 13 bit. bạn xem lại sách của tống văn on đi

    bạn tham khảo code này nhé
    void delay()
    { // ham nay co do che la 1ms
    TMOD=0x21;
    TH0=0xfc;
    TL0=0x18;
    TR0=1;
    while(TF0==0)
    {}
    TR0=0;
    TF0=0;
    }
    cách tính giá trị TH và TL
    nếu hoạt động ở chế độ 1 thì bộ đếm thời gian sẽ từ 0 -> ffff tức là 256 * 256 = 65536 . muốn có độ trễ là m thì giá trị nạp cho TH và TL bằng 65536 - m. chuyển giá trị này về dạng số hexa. TL = byte thấp, TH = byte cao.
    ví dụ như trên độ trễ là 1 ms thì : 65536 - 1000 = 64536 chuyển sang số hexa là FC18 khi đó TH = FC, và TL = 18
    chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
    Everything should be made as simple as possible, but not simpler

    Comment


    • #3
      Nguyên văn bởi daohuytien Xem bài viết
      code kia đó là timer 0 hoạt động ở chế độ 0 chế độ 13 bit. bạn xem lại sách của tống văn on đi

      bạn tham khảo code này nhé
      void delay()
      { // ham nay co do che la 1ms
      TMOD=0x21;
      TH0=0xfc;
      TL0=0x18;
      TR0=1;
      while(TF0==0)
      {}
      TR0=0;
      TF0=0;
      }
      cách tính giá trị TH và TL
      nếu hoạt động ở chế độ 1 thì bộ đếm thời gian sẽ từ 0 -> ffff tức là 256 * 256 = 65536 . muốn có độ trễ là m thì giá trị nạp cho TH và TL bằng 65536 - m. chuyển giá trị này về dạng số hexa. TL = byte thấp, TH = byte cao.
      ví dụ như trên độ trễ là 1 ms thì : 65536 - 1000 = 64536 chuyển sang số hexa là FC18 khi đó TH = FC, và TL = 18
      Cám ơn bạn.Mình sẽ tìm đọc lại.Có thể mình đã nhận diện sai chế độ của timer. Tiện đây bạn có thể cho mình hỏi tại sao chỉ khởi tạo giá trị cho thanh ghi TL0, còn TH0 thì sao?. và cơ chế tạo ra 1s delay trong đoạn code của mình với.

      Comment


      • #4
        bạn ghé qua trang này đọc nha.http://www.dee.hcmut.edu.vn/vn/bomon...0Timer_v01.pdf
        chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
        Everything should be made as simple as possible, but not simpler

        Comment


        • #5
          Nguyên văn bởi daohuytien Xem bài viết
          bạn ghé qua trang này đọc nha.http://www.dee.hcmut.edu.vn/vn/bomon...0Timer_v01.pdf
          Mình vừa xem lại và có 1 số vấn đề nếu bạn không phiền thì giúp mình mấy điều thắc mắc sau.

          1. Code
          void delay_ms(char x)
          {
          int i;
          TMOD = 0x20;
          for(i=0;i<=10*x;i++)
          {
          TL0 = 155;
          TR0 = 1;
          while(!TF0);
          TR0 = 0;
          TF0 = 0;
          }
          }
          là code viết cho 89C52, mà theo lý thuyết thì VDK này có 3 timer là 0,1 và 2.Vậy khi thanh ghi TMOD=0x20h =00100000 thì timer sẽ hoạt động theo chế độ nào?
          ( nếu là 8051(chỉ là nếu thôi nhé) thì với TMOD=00100000 thì timer sẽ hoạt động theo chế độ 2 của timer 1 chứ nhỉ, vì : thứ tự trong thanh ghi TMOD là 4bit cho timer1- 4 bit cho timer0, mặt khác M1M0=10 thì chế độ 2 được chọn. Vậy không hiểu tại sao bạn lại nói là ở đây là chế độ chế độ 0 timer 0).
          2. theo code của mình ở trên, mình cố gắng hiểu cách thức tạo ra 1s như sau: Giả sử chế độ 2 timer 0 được chọn( chế độ 8 bit tự nạp) thì TL0=155 nghĩa là đếm đến khi tràn là 255 thì sẽ được 100 chu kì xung. Sau đó giá trị 155 sẽ được tự nạp trở lại từ thanh ghi TH0 vào thanh ghi TL0 ( đây là lý do nên không cần khởi tạo giá trị cho TH0 như trong code đã thể hiện.) Vì sử dụng thạch anh 12MHz nên 1 chu kỳ xung sẽ thực hiện trong vòng 1 microgiay. khi đó đếm TL0 đếm hết 100 micor giây.nên để tạo ra 1 giây ta phải cho vòng lặp thực hiện 10.000 lần. tương ứng với việc truyền 1000 cho hàm void delay_ms(char x).
          Như trên là cách hiểu của mình. nhưng so với ý thứ nhất mình muốn hỏi thì nó có vẻ mâu thuẫn và không đúng đắn.
          Mình cũng mới tìm hiểu về vi điều khiển nên còn kiến thức còn hạn chế.Mong bạn và mọi người giúp đỡ.

          Comment


          • #6
            Nguyên văn bởi boyxala Xem bài viết
            Mình vừa xem lại và có 1 số vấn đề nếu bạn không phiền thì giúp mình mấy điều thắc mắc sau.

            1. Code là code viết cho 89C52, mà theo lý thuyết thì VDK này có 3 timer là 0,1 và 2.Vậy khi thanh ghi TMOD=0x20h =00100000 thì timer sẽ hoạt động theo chế độ nào?
            ( nếu là 8051(chỉ là nếu thôi nhé) thì với TMOD=00100000 thì timer sẽ hoạt động theo chế độ 2 của timer 1 chứ nhỉ, vì : thứ tự trong thanh ghi TMOD là 4bit cho timer1- 4 bit cho timer0, mặt khác M1M0=10 thì chế độ 2 được chọn. Vậy không hiểu tại sao bạn lại nói là ở đây là chế độ chế độ 0 timer 0).
            2. theo code của mình ở trên, mình cố gắng hiểu cách thức tạo ra 1s như sau: Giả sử chế độ 2 timer 0 được chọn( chế độ 8 bit tự nạp) thì TL0=155 nghĩa là đếm đến khi tràn là 255 thì sẽ được 100 chu kì xung. Sau đó giá trị 155 sẽ được tự nạp trở lại từ thanh ghi TH0 vào thanh ghi TL0 ( đây là lý do nên không cần khởi tạo giá trị cho TH0 như trong code đã thể hiện.) Vì sử dụng thạch anh 12MHz nên 1 chu kỳ xung sẽ thực hiện trong vòng 1 microgiay. khi đó đếm TL0 đếm hết 100 micor giây.nên để tạo ra 1 giây ta phải cho vòng lặp thực hiện 10.000 lần. tương ứng với việc truyền 1000 cho hàm void delay_ms(char x).
            Như trên là cách hiểu của mình. nhưng so với ý thứ nhất mình muốn hỏi thì nó có vẻ mâu thuẫn và không đúng đắn.
            Mình cũng mới tìm hiểu về vi điều khiển nên còn kiến thức còn hạn chế.Mong bạn và mọi người giúp đỡ.
            TMOD ta tách ra làm 2 số TMOD=0x20
            số màu đỏ là để chọn chế độ cho TIMER1, số màu xanh là để chọn chế độ cho TIMER, và 2 số này hoàn toàn độc lập.
            - Như daouytien nói con đầu tiên là timer0 chạy chế độ 0 13 bit không tự nạp lại, đây là chế độ có cách tính phức tạp nên ít đc dùng, bỏ qua.
            - Chế độ 2 là chế độ tự nạp lại, giá trị khởi tạo để nạp lại phải nằm trong TH0 chứ không phải TL0

            Comment


            • #7
              Nguyên văn bởi chung1608 Xem bài viết
              TMOD ta tách ra làm 2 số TMOD=0x20
              số màu đỏ là để chọn chế độ cho TIMER1, số màu xanh là để chọn chế độ cho TIMER, và 2 số này hoàn toàn độc lập.
              - Như daouytien nói con đầu tiên là timer0 chạy chế độ 0 13 bit không tự nạp lại, đây là chế độ có cách tính phức tạp nên ít đc dùng, bỏ qua.
              - Chế độ 2 là chế độ tự nạp lại, giá trị khởi tạo để nạp lại phải nằm trong TH0 chứ không phải TL0
              Như vậy với code mà mình sử dụng ( qoute ở trên) thì bạn có thể nói chính xác cách thức hoạt động của code để tạo ra 1s delay được không? (đọc cm của bạn mình chưa hiểu lắm ý bạn lắm)

              Comment


              • #8
                mình cũng đang thắc mắc
                Last edited by trantiena10; 24-03-2013, 23:34.

                Comment


                • #9
                  Up lên nào.Có ai trả lời thêm giúp mình không.Đầu óc vẫn chưa được thông lắm.

                  Comment


                  • #10
                    Nguyên văn bởi boyxala Xem bài viết
                    Mình vừa xem lại và có 1 số vấn đề nếu bạn không phiền thì giúp mình mấy điều thắc mắc sau.
                    bạn ơi ! bạn xem lại rồi thì bạn nhận thấy cái nào đúng cái nào sai chưa, trong sách, trên mạng người ta cũng hướng dẫn cho rồi, từng bứoc rất chi tiết. sao bạn cứ phải đắn đo mãi thế. có lẽ tác giả đưa code lên và có chút nhần lẫn lên như vậy. đọc câu hỏi và trả lời của bạn thấy bạn lắm vững rùi, chắc hẳn trong đầu đã có câu trả lời rồi. mình chuyển sang cái khác thôi !
                    chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
                    Everything should be made as simple as possible, but not simpler

                    Comment


                    • #11
                      Ko đọc tài liệu mà cứ hỏi khang. bạn chung1608 giải thích rõ rồi đó.
                      Email:
                      Phone: 0969 226 539

                      Comment


                      • #12
                        Nguyên văn bởi daohuytien Xem bài viết
                        bạn ơi ! bạn xem lại rồi thì bạn nhận thấy cái nào đúng cái nào sai chưa, trong sách, trên mạng người ta cũng hướng dẫn cho rồi, từng bứoc rất chi tiết. sao bạn cứ phải đắn đo mãi thế. có lẽ tác giả đưa code lên và có chút nhần lẫn lên như vậy. đọc câu hỏi và trả lời của bạn thấy bạn lắm vững rùi, chắc hẳn trong đầu đã có câu trả lời rồi. mình chuyển sang cái khác thôi !
                        Uhm.Cám ơn bạn.Cũng tại vì mình đọc kỹ nên thấy mâu thuẫn ở đây. Theo ý bạn là code kia của mình là sai đúng không.Nhưng khi nạp file hex và thì lại vẫn chạy là sao nhỉ.Tại mình còn gà về VDK nên một vấn đề tuy nhỏ nhưng chưa cảm thấy chưa được minh bạch và thông suốt nên cũng còn nhiều lăn tăn và chưa được thoải mái.

                        Comment


                        • #13
                          cái hay ở kỹ thuật là vậy. chưa xong chưa ngủ ngon, vì thế có phần " tâm tình kỹ thuật " thức trắng đêm khuya'' mình không nhớ rõ lắm. chúc bạn tự xớm tìm hiểu ra được từ code trên và khi nào ổn thì cho ae biết nhé.
                          chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
                          Everything should be made as simple as possible, but not simpler

                          Comment


                          • #14
                            Cho em hỏi là để tạo được 1 xung vuông có chu kì 15 ms thì phải nạp TH0 và TL0 như thế nào? (xung vuông này mức cao là 10ms và mức thấp là 5ms)

                            Comment


                            • #15
                              2 timer chạy tách biệt nhau
                              Muốn hoạt động timer nào thì chỉ cần bật timer đó lên là đc
                              Tham khảo Hướng dẫn - Timer và cách tính thông số cài đặt cho timer. | Cộng đồng cơ điện tử Việt Nam | Mechatronics
                              nhưng cái này của PIC muốn hiểu rõ thì tìm tài liệu về VDK 8051

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X