Thông báo

Collapse
No announcement yet.

Hỏi về mạch dùng ngắt ngoài, ngắt timer của 89c552

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

  • Hỏi về mạch dùng ngắt ngoài, ngắt timer của 89c552

    chào mọi người! mình có làm cái mạch dùng các ngắt để điều khiển cổng P2_0 của 89c52 để điều khiển bật tắt rơle 5vdc, cụ thể là dùng chân p2_0 xuất ra giá trị 0 đưa vào rơ le, chân còn lại của rơle đấu với + nguồn. mô phỏng thì chạy bình thường nhưng khi làm mạch thật thì thấy tất cả các cổng lại xuất ra giá trị 0, chân P2_0 chưa ấn công tắc mà đã xuất ra 0 rồi. đo điện áp giữa 2 chân rơle thi thấy nó chỉ bằng một nửa của điện áp đưa vào 89c52
    đây là mô phỏng:
    Click image for larger version

Name:	congtasc.PNG
Views:	1
Size:	15.4 KB
ID:	1419853

    vị trí con led ở chân P2_1 là rơle

    còn đây là code ạ:
    Code:
    #include <REGX51.H>
    int i;
    int j;
    
    void tre(unsigned int time)
    {
    while(time--);
    }
    void ngatngoai0(void) interrupt 0
    {
    tre(30000);
    i=i+1;
    if(i==2)
    i=0;
    
    }
    
    void ngatngoai1(void) interrupt 2
    {
    tre(30000);
     j=j+1;
     if(j==2)
     j=0;
    }
    
    void main()
    {
    IE=0x85;
    TMOD=0x60;
    TH1=0xfe;
    TL1=0xfe;
    TR1=1;
    while(1)
    {
    if(i==0)
    {
    P2_1=1;
    P2_4=0;
    }
    else
    {
    P2_1=0;
    P2_4=1;
    }
    if(j==0)
    {
    P2_2=1;
    P2_5=0;
    }
    else
    {
    P2_2=0;
    P2_5=1;
    }
    switch(TL1)
    {
    case 0xfe:
    P2_0=1;
    P2_3=0;
    break;
    
    case 0xff:
    P2_0=0;
    P2_3=1;
    break;
    }
    }
    }
    mọi người xem giúp mình với. cám ơn mọi người!!!
    Last edited by nghientoan; 05-12-2013, 20:11.

  • #2
    Bạn nhớ viết thêm chương trình chống nảy khi nhấn nút nữa. Nếu không khi bạn nhấn sẽ tạo ra nhiều ngắt ngoài liên tục.

    Bạn khởi tạo giá trị biến i và j = 0
    Code:
    int i = 0;
    int j = 0;
    Cần phải sửa lại
    Code:
    void ngatngoai0(void) interrupt 0
    {
    tre(30000);
    i=i+1;
    if(i==2)
    i=0;
    
    }
    
    void ngatngoai1(void) interrupt 2
    {
    tre(30000);
     j=j+1;
     if(j==2)
     j=0;
    }
    như thế này
    Code:
    void ngatngoai0(void) interrupt 0
    {
    tre(30000);
    i=i+1;
    if(i==2) i=0;
    
    }
    
    void ngatngoai1(void) interrupt 2
    {
    tre(30000);
     j=j+1;
     if(j==2) j=0;
    }

    Comment


    • #3
      Nguyên văn bởi tn88test Xem bài viết
      Bạn nhớ viết thêm chương trình chống nảy khi nhấn nút nữa. Nếu không khi bạn nhấn sẽ tạo ra nhiều ngắt ngoài liên tục.

      Bạn khởi tạo giá trị biến i và j = 0
      Code:
      int i = 0;
      int j = 0;
      Cần phải sửa lại
      Code:
      void ngatngoai0(void) interrupt 0
      {
      tre(30000);
      i=i+1;
      if(i==2)
      i=0;
      
      }
      
      void ngatngoai1(void) interrupt 2
      {
      tre(30000);
       j=j+1;
       if(j==2)
       j=0;
      }
      như thế này
      Code:
      void ngatngoai0(void) interrupt 0
      {
      tre(30000);
      i=i+1;
      if(i==2) i=0;
      
      }
      
      void ngatngoai1(void) interrupt 2
      {
      tre(30000);
       j=j+1;
       if(j==2) j=0;
      }
      cám ơn bạn! ngắt timer thì mình làm thì không thấy nó nhảy, còn ngắt ngoài thì nó bị nhảy nên mình cho hàm trễ trước khi đếm tăng. bạn có tìm ra vì sao cái mạch của mình chưa chạy gì mà nó đã xuất ra mức 0 không?

      Comment


      • #4
        hai cai nay cua ban thi khac nhau gi nhi?
        void ngatngoai0(void) interrupt 0
        {
        tre(30000);
        i=i+1;
        if(i==2)
        i=0;

        }

        void ngatngoai1(void) interrupt 2
        {
        tre(30000);
        j=j+1;
        if(j==2)
        j=0;
        }
        như thế này
        Code:
        void ngatngoai0(void) interrupt 0
        {
        tre(30000);
        i=i+1;
        if(i==2) i=0;

        }

        void ngatngoai1(void) interrupt 2
        {
        tre(30000);
        j=j+1;
        if(j==2) j=0;
        }

        Comment


        • #5
          Nguyên văn bởi caonhan_2004 Xem bài viết
          hai cai nay cua ban thi khac nhau gi nhi?
          void ngatngoai0(void) interrupt 0
          {
          tre(30000);
          i=i+1;
          if(i==2)
          i=0;

          }

          void ngatngoai1(void) interrupt 2
          {
          tre(30000);
          j=j+1;
          if(j==2)
          j=0;
          }
          như thế này
          Code:
          void ngatngoai0(void) interrupt 0
          {
          tre(30000);
          i=i+1;
          if(i==2) i=0;

          }

          void ngatngoai1(void) interrupt 2
          {
          tre(30000);
          j=j+1;
          if(j==2) j=0;
          }
          Uh. nó không khác nhau gì đâu! bạn ý muốn chỉ mình viết thế cho nó dễ nhìn thôi! bạn có biết vì sao mà nó đã xuất ra giá trị 0 ở các cổng khi bắt đầu chạy không? theo ý mình là đầu tiên xuất cổng 2_4,2_5,2_6=0; thôi.hix

          Comment


          • #6
            không đá động gì phải là mức 1 mới đúng chứ ta

            Comment


            • #7
              Nguyên văn bởi nghientoan Xem bài viết
              Uh. nó không khác nhau gì đâu! bạn ý muốn chỉ mình viết thế cho nó dễ nhìn thôi! bạn có biết vì sao mà nó đã xuất ra giá trị 0 ở các cổng khi bắt đầu chạy không? theo ý mình là đầu tiên xuất cổng 2_4,2_5,2_6=0; thôi.hix
              Bạn có thể đưa yêu cầu cụ thể bài toán, cả project và mạch rơ le bạn đã thiết kế như thế nào không? Như thế mọi người dễ dàng bắt bệnh hơn.

              Comment


              • #8
                Nguyên văn bởi caonhan_2004 Xem bài viết
                Bạn có thể đưa yêu cầu cụ thể bài toán, cả project và mạch rơ le bạn đã thiết kế như thế nào không? Như thế mọi người dễ dàng bắt bệnh hơn.
                Chẳng là định làm cái mạch công tắc cảm ứng. và dùng 4 ngắt: 2 ngắt ngoài và 2 ngắt timer ở chế độ đếm xung ngoài. khi mình bấm ngat ngoài 0 thì cổng p2_0 xuất ra giá tri 0 đưa vào chân rơ le, chân còn lại nối với + nguồn. tại không có mạch chuẩn mà mình chỉ bịa ra nên nó không được.hihi

                Comment


                • #9
                  Nguyên văn bởi nghientoan Xem bài viết
                  Chẳng là định làm cái mạch công tắc cảm ứng. và dùng 4 ngắt: 2 ngắt ngoài và 2 ngắt timer ở chế độ đếm xung ngoài. khi mình bấm ngat ngoài 0 thì cổng p2_0 xuất ra giá tri 0 đưa vào chân rơ le, chân còn lại nối với + nguồn. tại không có mạch chuẩn mà mình chỉ bịa ra nên nó không được.hihi
                  Chân VXL dòng ra rất nhỏ, do vậy muốn điều khiển rơle bạn phải khuyếch đại qua tran.

                  Comment


                  • #10
                    Nguyên văn bởi caonhan_2004 Xem bài viết
                    Chân VXL dòng ra rất nhỏ, do vậy muốn điều khiển rơle bạn phải khuyếch đại qua tran.
                    cám ơn bạn!!!cái này thì ok. mình chỉ phân vân cái chưa xuất ra 0 mà khi chạy các cổng đã xuất ra 0 rồi. có khi nào VDK hỏng không nhỉ?hihi

                    Comment


                    • #11
                      Nguyên văn bởi nghientoan Xem bài viết
                      cám ơn bạn!!!cái này thì ok. mình chỉ phân vân cái chưa xuất ra 0 mà khi chạy các cổng đã xuất ra 0 rồi. có khi nào VDK hỏng không nhỉ?hihi
                      Muốn biết sống hay chêt, bạn dùn lệnh gán cho nó thử xem. Gán 1 thì lúc chạy phải ra 1, gán 0 phải ra 0. Vẫn ra được thì tốt, mà không ra được là cổng bị hỏng bạn ah. Nhìn chung mô phỏng chạy thì 90% mạch thật chạy thui, chỉ sợ mạch thật của bạn vẫn có gì sai sót.

                      Comment


                      • #12
                        Nguyên văn bởi caonhan_2004 Xem bài viết
                        Muốn biết sống hay chêt, bạn dùn lệnh gán cho nó thử xem. Gán 1 thì lúc chạy phải ra 1, gán 0 phải ra 0. Vẫn ra được thì tốt, mà không ra được là cổng bị hỏng bạn ah. Nhìn chung mô phỏng chạy thì 90% mạch thật chạy thui, chỉ sợ mạch thật của bạn vẫn có gì sai sót.
                        cám ơn bạn nhiều nhé!!!

                        Comment


                        • #13
                          Nguyên văn bởi nghientoan Xem bài viết
                          chào mọi người! mình có làm cái mạch dùng các ngắt để điều khiển cổng P2_0 của 89c52 để điều khiển bật tắt rơle 5vdc, cụ thể là dùng chân p2_0 xuất ra giá trị 0 đưa vào rơ le, chân còn lại của rơle đấu với + nguồn. mô phỏng thì chạy bình thường nhưng khi làm mạch thật thì thấy tất cả các cổng lại xuất ra giá trị 0, chân P2_0 chưa ấn công tắc mà đã xuất ra 0 rồi. đo điện áp giữa 2 chân rơle thi thấy nó chỉ bằng một nửa của điện áp đưa vào 89c52
                          đây là mô phỏng:
                          [ATTACH=CONFIG]79490[/ATTACH]

                          vị trí con led ở chân P2_1 là rơle

                          còn đây là code ạ:
                          Code:
                          #include <REGX51.H>
                          int i;
                          int j;
                          
                          void tre(unsigned int time)
                          {
                          while(time--);
                          }
                          void ngatngoai0(void) interrupt 0
                          {
                          tre(30000);
                          i=i+1;
                          if(i==2)
                          i=0;
                          
                          }
                          
                          void ngatngoai1(void) interrupt 2
                          {
                          tre(30000);
                           j=j+1;
                           if(j==2)
                           j=0;
                          }
                          
                          void main()
                          {
                          IE=0x85;
                          TMOD=0x60;
                          TH1=0xfe;
                          TL1=0xfe;
                          TR1=1;
                          while(1)
                          {
                          if(i==0)
                          {
                          P2_1=1;
                          P2_4=0;
                          }
                          else
                          {
                          P2_1=0;
                          P2_4=1;
                          }
                          if(j==0)
                          {
                          P2_2=1;
                          P2_5=0;
                          }
                          else
                          {
                          P2_2=0;
                          P2_5=1;
                          }
                          switch(TL1)
                          {
                          case 0xfe:
                          P2_0=1;
                          P2_3=0;
                          break;
                          
                          case 0xff:
                          P2_0=0;
                          P2_3=1;
                          break;
                          }
                          }
                          }
                          mọi người xem giúp mình với. cám ơn mọi người!!!
                          Bạn xác định làm chơi 1 lần xong thôi hay làm vì đam mê? Nếu làm vì đam mê thực sự, có thể bất chấp khó khăn thì mình sẽ hướng dẫn bạn dùng 1 phuơng pháp khác khác cho độ chính xác cao hơn và chạy ổn định hơn rất nhiều.

                          Comment


                          • #14
                            Nguyên văn bởi myth-coder Xem bài viết
                            Bạn xác định làm chơi 1 lần xong thôi hay làm vì đam mê? Nếu làm vì đam mê thực sự, có thể bất chấp khó khăn thì mình sẽ hướng dẫn bạn dùng 1 phuơng pháp khác khác cho độ chính xác cao hơn và chạy ổn định hơn rất nhiều.
                            Vâng! xin bạn hướng dẫn cho mình ạ!

                            Comment


                            • #15
                              Nguyên văn bởi nghientoan Xem bài viết
                              Vâng! xin bạn hướng dẫn cho mình ạ!
                              Đừng khúm núm thế, đã biết ai hơn ai đâu? biết đâu tớ là "siêu nhân cuồng phong thì sao?". Bạn hệ thống lại yêu cầu và cách bạn đưa ra để giải quyết vấn đề đi. Vấn đề "công tắc cảm ứng" bạn định giải quyết như thế nào? Bạn cứ nêu ra, theo cách tự nhiên nhất ấy chứ đừng vội liên quan đến code. Phải có hướng để giải quyết vấn đề sau đó mới đi đến từng bước để giải thì mới không bị rối.

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X