Thông báo

Collapse
No announcement yet.

code cho PIC 16f887 chức năng giống PT 2262 -2272

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

  • #16
    Chạy rồi, em cảm ơn a nhiều nha
    Nguyên văn bởi queduong Xem bài viết
    Bên chương trình thu PIC16F877A sử dụng thạch anh 4 Mhz mà để 1Mhz ( trong mô phỏng ) thì nó chạy = niềm tin là đúng rồi . Sửa lại thành 4Mhz nó sẽ chạy !

    Comment


    • #17
      Nguyên văn bởi queduong Xem bài viết
      Nhớ ngày xưa cách đây chác vài năm cũng viết cho em nào đó ở Quảng Ninh , Hải Phòng ... cái đề tài tương tự ... mò trong máy tính được cái này :
      Điều khiển 8 led nút bấm ( PIC16F877A) --- CCS nhé.
      ( cách thức hoạt động : Gạt switch ... bấm nút send ... bên thu sẽ sáng led tương ứng --- Có mã nguồn C ở bên dưới ... pố tùy ý sửa code theo ý muốn nha ! )


      Thu :
      Code:
      #include <16F877A.h>
      #device adc=8
      #FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, WRT_50%
      #use delay(clock=4000000)
      
      #define RX_ID 0x30    // Receiver ID
      #define RX PIN_C7     // Chan nhan xung ma hoa
      #define Led PIN_D1    // power led
      unsigned char RX_packet[3],x;
      int1 rx_bit;           // rx_bit range value : 0 or 1 
      unsigned int checksum;
      int1 Receiver(unsigned char *buff);
      
      void main()
      {
      
         setup_adc_ports(NO_ANALOGS);
         setup_adc(ADC_OFF);
         setup_comparator(NC_NC_NC_NC);
          
        set_tris_b(0x00);  // Port b all out put
        output_b(0x00);  // port b all low
        set_tris_c(0xFF); // port C all input   ( RC7 input) 
        set_tris_d(0xFD);
        output_high(Led);
        
        while(TRUE)
       {
        
         
         checksum=0;
         while(Receiver(RX_packet));
         for(x=0;x<2;x++)
         checksum+= RX_packet[x];
         checksum&= 0x0FF;
         if(checksum==RX_packet[2])   // Kiem tra tong cua goi du lieu (packet)
         {
          if(RX_packet[0]==RX_ID)    // Kiem tra ID
          {
             output_b(RX_packet[1]);  // Xuat ra port b
          }
         }
        
       }  // End while(1)
      }
      
      
      //////////////////////////// Functions  ////////////////////////////
      int1 Receiver(unsigned char *buff)
        {
          unsigned char i,j,T0,count;
          i=32;
          count=0;
          setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);    // setup timer 0 div 2
            while(--i)        // wait preamble
             {
          
            #asm
            NOP;  
            NOP; 
            NOP; 
            #endasm
              
               while(input(RX));
               set_timer0(0);   // reset timer0 = 0
              #asm  
              NOP; 
              NOP; 
              NOP; 
              #endasm
      
               while(!input(RX));
               T0=get_timer0();  // doc timer 0
               if (T0==0xFF) {return 1;}      // error
               if ((T0>=198) && (T0<=218))          // check pulse 396us --> 436us (OK )
                {
                  count++;
                  if ((count>=1)|| (i==0)) break;
                }
      
             }
           if ((count==0)&&(i==0)) {return 1;} // error
           setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);  //  setup time0 div 16
           T0=0;
           while (!((T0>=94) && (T0<=114)))             // 1504 - 1824 uS it OK. syn bit for 4Te or 1664 uS
            {
              #asm  
              NOP; 
              NOP; 
              NOP; 
              #endasm
      
              while(input(RX));        // wait syn
              set_timer0(0);   // reset timer0 = 0
              #asm  
              NOP; 
              NOP; 
              NOP; 
              #endasm
      
              while(!input(RX));
              T0=get_timer0();  // doc timer 0
            }
      
           while(input(RX));                         //wait start bit go low
           delay_us(624);         // delay before sampling (1.5Te)
           for (j=0;j<3;j++)     // build packet bytes  ( 3 bytes)
            {
      
              i=8;              // build paket bit  (8 bits )
              buff[j]=0;
              while(i--)
               {
                 buff[j]=buff[j]<<1;
                 rx_bit=input(RX);        // check logic (0,1) chan RX
                 buff[j]=buff[j] | rx_bit;
                 if (rx_bit==0)
                 while(!input(RX));
                 else
                 while(input(RX));
                 delay_us(624);         // delay for 1,5Te
      
               }
      
            }
      
          if (rx_bit==0)
          if (!input(RX)) return 1; // error (no stop bit found)
          else
          if (!input(RX)) return 1; // error (no stop bit found)
          return 0;
       }

      --- Thôi ... hết rồi . Đi ngủ cho khỏe !
      bác queduong cho e hỏi cái, phần code thu, chỗ
      #asm
      NOP;
      NOP;
      NOP;
      #endasm
      - sao có phần code asm chi vậy bác, thay bằng delay ko được àh ?.
      - với phần timer nếu dùng chia tỉ lệ là 1 thì trong 1 chu kì máy ở đây là 1us, thì timer0 nó đếm được 256 giá trị tương ứng trong khoảng thời gian 256us, nếu chọn tỉ lệ chia 2 thì 256 giá trị tương ứng khoảng thời gian 512us phải ko ?? . hơi mất căn bản timer bác thông cảm
      if ((count>=1)|| (i==0)) code này thì hiểu như thế nào vậy ạh ? ,
      - em thấy có dùng biến *buff trong đoạn sub int1 Receiver(unsigned char *buff) , vậy biến này là gị vậy ạ, hình như là biến đệm hay gì đó vì giống từ buffer
      Last edited by minhtri0405; 05-12-2013, 00:43.
      CK6C -HUI

      Comment


      • #18
        Nguyên văn bởi minhtri0405 Xem bài viết
        bác queduong cho e hỏi cái, phần code thu, chỗ
        #asm
        NOP;
        NOP;
        NOP;
        #endasm
        - sao có phần code asm chi vậy bác, thay bằng delay ko được àh ?.
        Tùy sở thích thôi bạn. Thay bằng delay cũng được.
        - với phần timer nếu dùng chia tỉ lệ là 1 thì trong 1 chu kì máy ở đây là 1us, thì timer0 nó đếm được 256 giá trị tương ứng trong khoảng thời gian 256us, nếu chọn tỉ lệ chia 2 thì 256 giá trị tương ứng khoảng thời gian 512us phải ko ?? . hơi mất căn bản timer bác thông cảm
        Chính xác !
        if ((count>=1)|| (i==0)) code này thì hiểu như thế nào vậy ạh ? ,
        Nếu (count lớn hơn hoặc bằng 1) hoặc (i=0).

        - em thấy có dùng biến *buff trong đoạn sub int1 Receiver(unsigned char *buff) , vậy biến này là gị vậy ạ, hình như là biến đệm hay gì đó vì giống từ buffer
        Nó là biến đệm để truyền giá trị vào 1 hàm. Ví dụ delay_ms(100) thì buff là để truyền giá trị 100 vào hàm delay.

        Comment


        • #19
          Nguyên văn bởi duong_act Xem bài viết

          Nếu (count lớn hơn hoặc bằng 1) hoặc (i=0).
          em cũng hiểu là như vậy nhưng nếu vậy thì điều kiện đó luôn đúng mà, giả sử 1 xung đủ điều kiện là >396us và < 436us thì count lên 1 rồi => câu if ((count>=1)|| (i==0)) đúng , lệnh break thực hiện rồi còn đâu ?? mà đếm nữa
          CK6C -HUI

          Comment


          • #20
            Nguyên văn bởi minhtri0405 Xem bài viết
            em cũng hiểu là như vậy nhưng nếu vậy thì điều kiện đó luôn đúng mà, giả sử 1 xung đủ điều kiện là >396us và < 436us thì count lên 1 rồi => câu if ((count>=1)|| (i==0)) đúng , lệnh break thực hiện rồi còn đâu ?? mà đếm nữa
            Thì nó đủ điều kiện rồi mới không cần đếm nữa ( biết là thằng phát đang phát ... đồng bộ được rồi thì ngồi chờ xung Sync và START, thì còn đếm làm gì nữa ).
            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


            • #21
              có thể dùng ngắt trong mạch thu Rx được ko các bác, e dùng thời gian thực nữa mà vòng lặp nó làm cho thời gian thực chạy ko được, nếu ngắt được thì port C có ngắt được ko , cụ thể là PIN C0, chứ e in mạch rồi lười vẽ lại quá
              CK6C -HUI

              Comment


              • #22
                Nguyên văn bởi minhtri0405 Xem bài viết
                có thể dùng ngắt trong mạch thu Rx được ko các bác, e dùng thời gian thực nữa mà vòng lặp nó làm cho thời gian thực chạy ko được, nếu ngắt được thì port C có ngắt được ko , cụ thể là PIN C0, chứ e in mạch rồi lười vẽ lại quá
                module hàng chợ , tốc độ thần kim quy thì khó khăn đấy , chịu khó xem lại bố trí phân bổ thời gian để lập trình ... hoặc kiểu RTOS hoặc dùng các module chuyên dụng có khả năng hơn . RC0 thì chỉ có ngắt timer1 bên ngoài thôi ... chẳng giải quyết được gì.
                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


                • #23
                  anh ơi cho em hỏi .giờ e muốn điều khiển 1 led bằng mắt thu hồng ngoại .sau đó cho nó qua triac khuyếch đại công suất lên điều khiển bóng 220v .thì code này viết lại hay xóa phần nào anh ! tks anh nhiều ....e đang làm đồ án .mong mấy a giúp đỡ

                  Comment


                  • #24
                    Nguyên văn bởi queduong Xem bài viết
                    Nhớ ngày xưa cách đây chác vài năm cũng viết cho em nào đó ở Quảng Ninh , Hải Phòng ... cái đề tài tương tự ... mò trong máy tính được cái này :
                    Điều khiển 8 led nút bấm ( PIC16F877A) --- CCS nhé.
                    ( cách thức hoạt động : Gạt switch ... bấm nút send ... bên thu sẽ sáng led tương ứng --- Có mã nguồn C ở bên dưới ... pố tùy ý sửa code theo ý muốn nha ! )

                    [ATTACH=CONFIG]77578[/ATTACH]

                    Phát :

                    Code:
                    #include <16F877A.h>
                    #device adc=8
                    #FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, WRT_50%
                    #use delay(clock=4000000)
                    
                    #define TX_ID 0x30    // Transmitter ID
                    #define TX PIN_C6     // Chan phat xung ma hoa
                    #define Button PIN_D0 // nut bam
                    #define Led PIN_D1    // Power led
                    unsigned char TX_packet[3];
                    unsigned char i,j;
                    unsigned int checksum;
                    void Transmitter();
                    void main()
                    {
                    
                       setup_adc_ports(NO_ANALOGS);
                       setup_adc(ADC_OFF);
                       setup_comparator(NC_NC_NC_NC);
                    
                       set_tris_c(0b10111111);
                       output_c(0x00);
                       set_tris_a(0x00);
                       output_a(0x00);
                       set_tris_d(0xFD); // rd1 output
                       output_high(Led);
                    while(TRUE)
                    {
                     if(!input(Button))
                     {
                       
                       do
                         {
                            // Dong goi du lieu //  ( data packet )
                             checksum=0;
                             TX_packet[0]=TX_ID;      //  Transmitter ID
                             checksum+= TX_packet[0];
                             TX_packet[1]=input_b();  // doc trang thai port b
                             checksum+= TX_packet[1];
                             TX_packet[2]=checksum;   // goi du lieu  ( Tong ( Sum ) ) 
                           // gui du lieu qua chan TX
                            Transmitter();
                         }
                       while(!input(Button));
                       delay_ms(200);  // Chong rung phim
                        
                     }   
                    }
                       
                    
                    }
                    ///////////////// functions ////////////////////////
                    void Transmitter()
                        {
                    
                           
                           for (i=0;i<32;i++)        // send preamble
                            {
                              output_high(TX);
                              delay_us(416);  // Delay 416 uS
                              output_low(TX);
                              delay_us(416);  //
                            }
                              delay_us(1248);  // delay 1248 uS or 3Te for syn bit
                             
                    
                              //-----------------
                              output_high(TX);        // start bit
                              delay_us(416);
                              output_low(TX);
                              delay_us(416);
                    
                              //-----------------
                           for (j=0;j<3;j++)       // 3 bytes packet transmitter
                            {
                    
                              for(i=0;i<8;i++)
                                 {
                                   if ((TX_packet[j] & 0x80) == 0x80)
                                     {
                                      output_high(TX);
                                      delay_us(416);
                                      output_low(TX);
                                      delay_us(416);
                    
                                     }
                                    else
                                    {
                                      output_low(TX);
                                      delay_us(416);
                                      output_high(TX);
                                      delay_us(416);
                    
                                    }
                                    TX_packet[j]=TX_packet[j]<<1;
                    
                                 }
                            }
                            //------ send stop bit -------
                            output_high(TX);
                            delay_us(416);
                            output_low(TX);
                            delay_us(416);
                    
                            delay_ms(20);        // delay gaurd
                    
                    
                        }
                    //////////////////////////////

                    Thu :
                    Code:
                    #include <16F877A.h>
                    #device adc=8
                    #FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, WRT_50%
                    #use delay(clock=4000000)
                    
                    #define RX_ID 0x30    // Receiver ID
                    #define RX PIN_C7     // Chan nhan xung ma hoa
                    #define Led PIN_D1    // power led
                    unsigned char RX_packet[3],x;
                    int1 rx_bit;           // rx_bit range value : 0 or 1 
                    unsigned int checksum;
                    int1 Receiver(unsigned char *buff);
                    
                    void main()
                    {
                    
                       setup_adc_ports(NO_ANALOGS);
                       setup_adc(ADC_OFF);
                       setup_comparator(NC_NC_NC_NC);
                        
                      set_tris_b(0x00);  // Port b all out put
                      output_b(0x00);  // port b all low
                      set_tris_c(0xFF); // port C all input   ( RC7 input) 
                      set_tris_d(0xFD);
                      output_high(Led);
                      
                      while(TRUE)
                     {
                      
                       
                       checksum=0;
                       while(Receiver(RX_packet));
                       for(x=0;x<2;x++)
                       checksum+= RX_packet[x];
                       checksum&= 0x0FF;
                       if(checksum==RX_packet[2])   // Kiem tra tong cua goi du lieu (packet)
                       {
                        if(RX_packet[0]==RX_ID)    // Kiem tra ID
                        {
                           output_b(RX_packet[1]);  // Xuat ra port b
                        }
                       }
                      
                     }  // End while(1)
                    }
                    
                    
                    //////////////////////////// Functions  ////////////////////////////
                    int1 Receiver(unsigned char *buff)
                      {
                        unsigned char i,j,T0,count;
                        i=32;
                        count=0;
                        setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);    // setup timer 0 div 2
                          while(--i)        // wait preamble
                           {
                        
                          #asm
                          NOP;  
                          NOP; 
                          NOP; 
                          #endasm
                            
                             while(input(RX));
                             set_timer0(0);   // reset timer0 = 0
                            #asm  
                            NOP; 
                            NOP; 
                            NOP; 
                            #endasm
                    
                             while(!input(RX));
                             T0=get_timer0();  // doc timer 0
                             if (T0==0xFF) {return 1;}      // error
                             if ((T0>=198) && (T0<=218))          // check pulse 396us --> 436us (OK )
                              {
                                count++;
                                if ((count>=1)|| (i==0)) break;
                              }
                    
                           }
                         if ((count==0)&&(i==0)) {return 1;} // error
                         setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);  //  setup time0 div 16
                         T0=0;
                         while (!((T0>=94) && (T0<=114)))             // 1504 - 1824 uS it OK. syn bit for 4Te or 1664 uS
                          {
                            #asm  
                            NOP; 
                            NOP; 
                            NOP; 
                            #endasm
                    
                            while(input(RX));        // wait syn
                            set_timer0(0);   // reset timer0 = 0
                            #asm  
                            NOP; 
                            NOP; 
                            NOP; 
                            #endasm
                    
                            while(!input(RX));
                            T0=get_timer0();  // doc timer 0
                          }
                    
                         while(input(RX));                         //wait start bit go low
                         delay_us(624);         // delay before sampling (1.5Te)
                         for (j=0;j<3;j++)     // build packet bytes  ( 3 bytes)
                          {
                    
                            i=8;              // build paket bit  (8 bits )
                            buff[j]=0;
                            while(i--)
                             {
                               buff[j]=buff[j]<<1;
                               rx_bit=input(RX);        // check logic (0,1) chan RX
                               buff[j]=buff[j] | rx_bit;
                               if (rx_bit==0)
                               while(!input(RX));
                               else
                               while(input(RX));
                               delay_us(624);         // delay for 1,5Te
                    
                             }
                    
                          }
                    
                        if (rx_bit==0)
                        if (!input(RX)) return 1; // error (no stop bit found)
                        else
                        if (!input(RX)) return 1; // error (no stop bit found)
                        return 0;
                     }

                    --- Thôi ... hết rồi . Đi ngủ cho khỏe !
                    anh ơi cho em hỏi .giờ e muốn điều khiển 1 led bằng mắt thu hồng ngoại .sau đó cho nó qua triac khuyếch đại công suất lên điều khiển bóng 220v .thì code này viết lại hay xóa phần nào anh ! tks anh nhiều ....e đang làm đồ án .mong mấy a giúp đỡ

                    Comment


                    • #25
                      ảnh nhỏ quá bác quế dương ơi chả thấy gì cả

                      Comment


                      • #26
                        Nguyên văn bởi gse7en Xem bài viết
                        anh ơi cho em hỏi .giờ e muốn điều khiển 1 led bằng mắt thu hồng ngoại .sau đó cho nó qua triac khuyếch đại công suất lên điều khiển bóng 220v .thì code này viết lại hay xóa phần nào anh ! tks anh nhiều ....e đang làm đồ án .mong mấy a giúp đỡ
                        Bạn cài bộ dao động sóng mang 38Khz bên ngoài vào là chẳng phải chỉnh sửa về code. Còn không thì viết mới hoàn toàn . Tìm trong diễn đàn có nhiều bài đã viết về điều khiển hồng ngoại . Cứ Hỏi không tìm ... chẳng ai buồn giúp.
                        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


                        • #27
                          Nguyên văn bởi 09069 Xem bài viết
                          ảnh nhỏ quá bác quế dương ơi chả thấy gì cả
                          Click vào hình nhỏ sẽ được TO
                          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


                          • #28
                            Nguyên văn bởi queduong Xem bài viết
                            Click vào hình nhỏ sẽ được TO
                            click vào thì được thế này:

                            Comment


                            • #29
                              Click vào nó sẽ hiện 1 nhỏ , 1 to :
                              - Đây là cái hình nhỏ : http://www.dientuvietnam.net/forums/...2-led_send.jpg
                              - Đây là cái hình to :
                              http://www.dientuvietnam.net/forums/...2-led_send.jpg
                              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


                              • #30
                                Anh ơi cho em hỏi. em lấy sợi dây mạng làm ăng ten cho 2 module này được ko ạ. và làm nên xoắn ốc lại hay duỗi thẳng ra vậy anh.
                                Em cảm ơn anh nhiều.

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X