Thông báo

Collapse
No announcement yet.

[cấn giúp ]Mạch điều khiển thiết bị từ xa bằng sóng RF

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

  • [cấn giúp ]Mạch điều khiển thiết bị từ xa bằng sóng RF

    em thiết kế mạch điều khiển từ xa 4 thiết bị dùng module RF 315Mhz , ko hiểu sao khi ấn nút trên mạch phát thì bên phía mạch thu vẫn chớp led báo nhận được tín hiệu nhưng mà áp ra trên kênh tương ứng từ D0,D1,D2,D3 chỉ đạt ngưỡng 1,5V hix nên hok kích mở relay đóng ngăt đước, mong mọi người giúp em với.
    đây là sơ đồ mạch thu của em :
    Click image for larger version

Name:	mach thu.jpg
Views:	1
Size:	191.2 KB
ID:	1421619
    còn đây là code
    Code:
    #include <AT89X52.H>
    #define in_0   P2_0
    #define in_1   P2_1
    #define in_2   P2_2
    #define in_3   P2_3
                 
    #define out_0  P2_4
    
    #define out_1  P2_5
    #define out_2  P2_6
    #define out_3  P2_7
    //
    int st1,st2,st3,st0;
    //khai bao ham delay
    void delay(unsigned int time)
    {
        while(time--)
        {
            unsigned char temp = 121;
            while(temp--);
        };
    }
    //***********************************
    void main()
    {
        st0=st1=st2=st3=0;
        in_0=in_1=in_2=in_3=0;
        out_0=st0;out_1=st1;out_2=st2;out_3=st3;
        while(1)
        {
            if(in_0==1)
            {
                while(in_0==1){}
                delay(10);
                if(st0==0)
                st0=1;
                else
                st0=0;
                out_0=st0;
            }
    //
            if(in_1==1)
            {
                while(in_1){}
                delay(10);
                if(st1==0)
                st1=1;
                else
                st1=0;
                out_1=st1;
            }
    //      
            if(in_2)
            {
                while(in_2){}
                delay(10);
                if(st2==0)
                st2=1;
                else
                st2=0;
                out_2=st2;
            }
    //
            if(in_3)
            {
                while(in_3){}
                delay(10);
                if(st3==0)
                st3=1;
                else
                st3=0;
                out_3=st3;
            }          
        }
    }

  • #2
    hix em đã thử ngắt các đường mạch trên chân D0 , D1, D2, D3 từ PT2272 nối vào chân P2.0 ->P2.3 của 89s52 thì khi nó nhận vẫn có áp trên các chân D0 ,D1, D2, D3 của PT2272 , còn khi nối vào các chân của 89s52 thì chỉ đạt 1,5V là sao ? thắc mắc quá, mong mọi người giúp với

    Comment


    • #3
      relay của bạn có dùng transistor để mở không, nếu dùng transistor kích nên thì vẫn được chứ. Mình hay dùng VDK nối với tran kích relay

      Comment


      • #4
        mình thì làm điều khiển bằng hồng ngoại. Mình muốn các bạn chỉ giúp code C cho đoạn chương trình: Khi nhấn tất cả các nút được nhấn đồng thời (4 nút==0) thì thực hiện lệnh. Đoạn đó viết thế nào nhỉ? Xin vui lòng chỉ giúp!

        Comment


        • #5
          Nguyên văn bởi vietyen125 Xem bài viết
          mình thì làm điều khiển bằng hồng ngoại. Mình muốn các bạn chỉ giúp code C cho đoạn chương trình: Khi nhấn tất cả các nút được nhấn đồng thời (4 nút==0) thì thực hiện lệnh. Đoạn đó viết thế nào nhỉ? Xin vui lòng chỉ giúp!
          if((nut1==0)&&(nut2==0)&&(nut3==0)&&(nut4==0))
          {
          // làm Lệnh gì ở đây thì làm
          }
          Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

          Comment


          • #6
            Cảm ơn queduong. Minh cũng viết code thao tác Bit là &. Bạn có thể vui lòng giải thích giúp tại sao mình dùng logic && mà không dùng thao tác Bit &? nó khác nhau thế nào ạ? Trong chương trình của mình thì các NUT1 riêng rẽ ==0 đã thực hiện các lệnh khác nhau. Khi nhấn đồng thời các nút nhấn thì lúc thì thực hiện NUT1, lúc thực hiện NUT2... mà không thực hiện theo lệnh cùng nhấn như trên. Mặc dù mình đã delay và chống dội phím. Nhân tiện bạn có thể cho mình xin code của nhấn và giữ phím (ví dụ giữ 3s thì thực hiện 1 lệnh). Trân trọng!

            Comment


            • #7
              Nguyên văn bởi vietyen125 Xem bài viết
              Cảm ơn queduong. Minh cũng viết code thao tác Bit là &. Bạn có thể vui lòng giải thích giúp tại sao mình dùng logic && mà không dùng thao tác Bit &? nó khác nhau thế nào ạ? Trong chương trình của mình thì các NUT1 riêng rẽ ==0 đã thực hiện các lệnh khác nhau. Khi nhấn đồng thời các nút nhấn thì lúc thì thực hiện NUT1, lúc thực hiện NUT2... mà không thực hiện theo lệnh cùng nhấn như trên. Mặc dù mình đã delay và chống dội phím. Nhân tiện bạn có thể cho mình xin code của nhấn và giữ phím (ví dụ giữ 3s thì thực hiện 1 lệnh). Trân trọng!
              Logic kiểm tra thì sử dụng && , kết quả thì &

              Bạn có 4 nút nếu làm thế này ( thì sẽ bị lỗi ) :

              if(nut1==0)
              {
              led1 =1; // led 1 sáng
              }

              if((nut1==0)&&(nut2==0)&&(nut3==0)&&(nut4==0))
              {
              led5 =1; // led 5 sáng
              }

              Cách làm như vậy sẽ bị lỗi vì bạn khó có thể bấm 4 nút cùng 1 thời điểm ... nên nó sẽ thực hiện lệnh ở nut1 và cũng sẽ thực hiện lệnh ở cả 4 nút cùng 1 lúc.

              --- Để loại trừ, tránh trường hợp hoạt động sai này thì :
              if((nut1==0)&&(nut2==1)&&(nut3==1)&&(nut4==1)) // Chỉ có mỗi nut1 được bấm
              {
              led1=1; // led 1 sáng
              }

              if((nut1==0)&&(nut2==0)&&(nut3==0)&&(nut4==0)) // cả 4 nút được bấm
              {
              led5=1; // led 5 sáng
              }

              --- Dùng các phép toán logic lọc chúng là OK thôi .


              ---- Giữ 3 giây thì thực hiện 1 lệnh ( Ví dụ bấm nút A ( nutA )) : Có nhiều cách nhưng cách viết tăng bộ đếm là đơn giản

              if(nutA==0)
              {
              i=0;
              while((nutA==0)&&(i<3000)) // trong khi nút A bấm và thời gian chưa đạt đến 3 giây !!!
              {
              delay_ms(1);
              i++ ; // tăng biến đếm i
              if(i>=3000) // 3 giây
              {
              /// Thực hiện lệnh ở đây
              }
              }
              }

              /// giải thích : Khi bấm và giữ nút và chưa đạt đến 3 giây thì biến i tăng lên mỗi 1 ms ... khi biến i tăng lên đến giá trị 3000 ( 1ms x 3000 = 3000ms = 3 giây ) thì thực hiện các lệnh. lúc đó kết quả logic điều kiện while((nutA==0)&&(i<3000)) trở thành sai ( do i= 3000) ... thoát khỏi vòng lặp và tiếp tục quá trình hoạt động khác .
              Vì một lý do nào đó bấm nút A chưa đến 3 giây đã nhả nút lúc này lệnh if(i>=3000) không đúng ( vì i chưa đến 3000 đã nhả tay khỏi nút) nên lệnh không được thực hiện, kết quả while((nutA==0)&&(i<3000)) sai ( do nhả nút thì nutA có logic là 1 ) ... thoát khỏi vòng lặp và làm tiếp các công việc khác.
              Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

              Comment


              • #8
                Nguyên văn bởi queduong Xem bài viết
                Logic kiểm tra thì sử dụng && , kết quả thì &

                Bạn có 4 nút nếu làm thế này ( thì sẽ bị lỗi ) :

                if(nut1==0)
                {
                led1 =1; // led 1 sáng
                }

                if((nut1==0)&&(nut2==0)&&(nut3==0)&&(nut4==0))
                {
                led5 =1; // led 5 sáng
                }

                Cách làm như vậy sẽ bị lỗi vì bạn khó có thể bấm 4 nút cùng 1 thời điểm ... nên nó sẽ thực hiện lệnh ở nut1 và cũng sẽ thực hiện lệnh ở cả 4 nút cùng 1 lúc.

                --- Để loại trừ, tránh trường hợp hoạt động sai này thì :
                if((nut1==0)&&(nut2==1)&&(nut3==1)&&(nut4==1)) // Chỉ có mỗi nut1 được bấm
                {
                led1=1; // led 1 sáng
                }

                if((nut1==0)&&(nut2==0)&&(nut3==0)&&(nut4==0)) // cả 4 nút được bấm
                {
                led5=1; // led 5 sáng
                }

                --- Dùng các phép toán logic lọc chúng là OK thôi .


                ---- Giữ 3 giây thì thực hiện 1 lệnh ( Ví dụ bấm nút A ( nutA )) : Có nhiều cách nhưng cách viết tăng bộ đếm là đơn giản

                if(nutA==0)
                {
                i=0;
                while((nutA==0)&&(i<3000)) // trong khi nút A bấm và thời gian chưa đạt đến 3 giây !!!
                {
                delay_ms(1);
                i++ ; // tăng biến đếm i
                if(i>=3000) // 3 giây
                {
                /// Thực hiện lệnh ở đây
                }
                }
                }

                /// giải thích : Khi bấm và giữ nút và chưa đạt đến 3 giây thì biến i tăng lên mỗi 1 ms ... khi biến i tăng lên đến giá trị 3000 ( 1ms x 3000 = 3000ms = 3 giây ) thì thực hiện các lệnh. lúc đó kết quả logic điều kiện while((nutA==0)&&(i<3000)) trở thành sai ( do i= 3000) ... thoát khỏi vòng lặp và tiếp tục quá trình hoạt động khác .
                Vì một lý do nào đó bấm nút A chưa đến 3 giây đã nhả nút lúc này lệnh if(i>=3000) không đúng ( vì i chưa đến 3000 đã nhả tay khỏi nút) nên lệnh không được thực hiện, kết quả while((nutA==0)&&(i<3000)) sai ( do nhả nút thì nutA có logic là 1 ) ... thoát khỏi vòng lặp và làm tiếp các công việc khác.
                Cảm ơn bạn nhiều lắm. Giải thích của bạn rất ngắn gọn và đầy đủ.

                Comment


                • #9
                  Nguyên văn bởi queduong Xem bài viết
                  Logic kiểm tra thì sử dụng && , kết quả thì &

                  .
                  Bác queduong giải thích rõ ràng quá.Tiện thể bác cho em hỏi cách viết 1 đoạn chương trình dk 2 lệnh // cùng 1 lúc giống PLC vậy.
                  Vd: dùng 2 nút nhấn mỗi nút làm cac việc khác nhau nhung khi nhấn cả 2 nút thì cả 2 lệnh đều dc thực hiện.

                  Comment


                  • #10
                    Nguyên văn bởi ken___ Xem bài viết
                    Bác queduong giải thích rõ ràng quá.Tiện thể bác cho em hỏi cách viết 1 đoạn chương trình dk 2 lệnh // cùng 1 lúc giống PLC vậy.
                    Vd: dùng 2 nút nhấn mỗi nút làm cac việc khác nhau nhung khi nhấn cả 2 nút thì cả 2 lệnh đều dc thực hiện.
                    Các vi điều khiển làm việc, xử lý tuần tự ... nếu muốn xử lý song song là điều bất khả thi , trừ khi ta khéo léo sắp xếp thời gian ( lúc này làm cái này , lúc khác làm cái khác , mỗi cái 1 tý ) khi đó ta nhìn nhận nó như là Song song ... do tốc độ chuyển quá nhanh .
                    Để điều khiển được 2 chương trình song song đồng thời thì cần phải có cụ thể bài toán , mỗi bài toán khác nhau về cách thức giải thuật ( có bài thì đơn giản , có bài thì phức tạp ).

                    Muốn chạy song song nhiều chương trình ... bạn nên tìm hiểu về các hệ điều hành thời gian thực ( VD đơn giản như RTOS chẳng hạn ).
                    Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                    Comment


                    • #11
                      không hiểu ...

                      Comment


                      • #12
                        các bạn cho mình hỏi cách viết code cho điều khiển tắt mở đèn dùng rf...mình chỉ cần 1 bóng đèn thôi nhé....mình xin cảm ơn các bạn trước...

                        Comment


                        • #13
                          Anh chipchip91 ơi. Anh chia sẽ sơ đồ,code... Về mạch trên với. Thank anh nha. Mail...hoangvuly12@gmail.com

                          Comment

                          Về tác giả

                          Collapse

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

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

                          Collapse

                          Đang tải...
                          X