Đà nẵng vào đây cùng thảo luận về PIC

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • Mr.Bi
    Đệ tử 7 túi
    • Jul 2007
    • 188

    #1

    Đà nẵng vào đây cùng thảo luận về PIC

    Đầu tiên là t đưa ra 2 mạch nạp PIC vô cùng dễ làm nhưng tốc độ nạp hơn GTB-USB Lite


    sau đó , u tải file nì về http://www.mediafire.com/download.php?tzkzcccmit2
    giải nén , coppy + paste vô thư mục C:\Program Files\WinPic800\Hardware.
    phần mềm để nạp PIC hiện t đang dùng là WINPIC800 v3.61
    http://www.mediafire.com/download.php?w0zyqqtmmyq

    sau khi cài đặt , vô chương trình WINPIC800 :
    - Language : english
    - Setting/hardware : nếu mạch JDM mod(hình 1) thì chọn JDM mod , còn nếu mạch hình 2 thì chon Sch+ . Xong nhấn Appy edits
    - gắn mạch nạp vô , chọn devices/hardware test . Nếu mạch làm đúng thì có bảng hardware test : OK

    Theo kinh nghiệm làm tùm lum mạch nạp thì 2 mạch này nạp đc cả nùi con PIC. Ráp là chạy . Tin tưởng đi .....
  • Mr.Bi
    Đệ tử 7 túi
    • Jul 2007
    • 188

    #2
    thêm cái nữa cho ae học PIC thấy phấn khởi : đọc ADC , xuất giá trị ADC đk động cơ lun

    Code:
    [COLOR="black"]#include <16F88.h>
    #device 16F88*=16  ADC=8
    #fuses  XT,NOWDT,NOPROTECT,NOLVP,NOPUT,NOBROWNOUT,NODEBUG
    #use    delay(clock=4000000)
    
    int8 adc;
    
    void readADC()
    { setup_adc(adc_clock_internal);
      setup_adc_ports(sAN1);
      set_adc_channel(1);
      delay_ms(10);adc=read_adc();
    }
    void pwm_ccp()
    {
    setup_ccp1(CCP_PWM);
    setup_timer_2(T2_DIV_BY_1,255, 1);
    }
    void PWM(int8 value)
    {set_pwm1_duty(value);
    }
    main()
    { set_tris_B(0x00); PORTB=0x00;
      pwm_ccp();
      while(1)
       { readADC();
         PWM(adc);
        }
    }[/COLOR]

    Comment

    • Mr.Bi
      Đệ tử 7 túi
      • Jul 2007
      • 188

      #3
      I> LCD : LCD ở đây t chỉ đưa ra giao tiếp 8 bit cho ng mới dễ tiếp cận . Vì giao tiếp 8 bit nên sẽ cần 8 chân của VDK , do đó t thu gọn = con 74164 --> chỉ dùng 4 chân VDK (E,RS,RX1,TX1) .


      Code giao tiếp LCD8bit , dùng 164
      Code:
      #include <18F4331.h>
      #fuses  XT,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT,NOCPD,NODEBUG,NOFCMEN,NOCPB,NOPWMPIN,HPOL_LOW,STVREN
      #use    delay(clock=4000000)
      
      #use fast_io(a)
      #use fast_io(b)
      #use fast_io(c)
      #use fast_io(d)
      #use fast_io(e)
      
      //=========== LCD ==============
      #bit RX1  =0xF80.3 // RA3
      #bit TX1  =0xF80.2 // RA2
      #bit RS  =0xF82.0  // RC0
      #bit E   =0xF84.0  // RE0
      void shiftLCD(int8 k)
      { int8 i;
        for(i=8;i>0;i=i-1)
           { if(!bit_test(k,i-1))RX1=0;
             else RX1=1;
             TX1=1;delay_us(20);TX1=0;
           };
       E=1;delay_ms(1);E=0;delay_ms(1);
      }
      void LCD_PutCmd(int8 k)
      { RS=0;shiftLCD(k);}
      void LCD_PutChar(int8 k)
      { RS=1;shiftLCD(k);}
      void LCD_Init()
      {  delay_ms(100);
         LCD_PutCmd(0x38);
         LCD_PutCmd(0x06); // dich con tro sang phai
         LCD_PutCmd(0x0C); // bat hien thi ,tat con tro
         LCD_PutCmd(0x01); // xoa man hinh
         LCD_PutCmd(0x02); // ve dau dong
         LCD_PutCmd(0x86);
         LCD_PutChar('R');LCD_PutChar('e');LCD_PutChar('a');LCD_PutChar('d');LCD_PutChar('y');
         
      }
      //+++++++++++++++++++++++++++++++++++
      
      main()
      { 
        TRISA = 0x03;PORTA=0xFF;
        TRISB = 0x00;PORTB=0xFF;
        TRISC = 0xF8;PORTC=0xFF;
        TRISD = 0x0F;PORTD=0xFF;
        TRISE = 0x06;PORTE=0xFF;
        
        LCD_Init();while(1);
      }

      Hơ hơ mệt wa , nghe music tí đã

      Comment

      • namqn
        Trưởng lão PIC bang
        • Feb 2006
        • 3020

        #4
        Nguyên văn bởi Mr.Bi View Post
        Đầu tiên là t đưa ra 2 mạch nạp PIC vô cùng dễ làm nhưng tốc độ nạp hơn GTB-USB Lite


        sau đó , u tải file nì về http://www.mediafire.com/download.php?tzkzcccmit2
        giải nén , coppy + paste vô thư mục C:\Program Files\WinPic800\Hardware.
        phần mềm để nạp PIC hiện t đang dùng là WINPIC800 v3.61
        http://www.mediafire.com/download.php?w0zyqqtmmyq

        sau khi cài đặt , vô chương trình WINPIC800 :
        - Language : english
        - Setting/hardware : nếu mạch JDM mod(hình 1) thì chọn JDM mod , còn nếu mạch hình 2 thì chon Sch+ . Xong nhấn Appy edits
        - gắn mạch nạp vô , chọn devices/hardware test . Nếu mạch làm đúng thì có bảng hardware test : OK

        Theo kinh nghiệm làm tùm lum mạch nạp thì 2 mạch này nạp đc cả nùi con PIC. Ráp là chạy . Tin tưởng đi .....
        Bạn có thể trích dẫn liên kết đến trang web của tôi, không cần cắt hình vẽ và đưa lên photobucket làm gì. Kết quả thử nghiệm các mạch nạp này được tôi nêu ra trên trang web của tôi, không rõ bạn đã thử nghiệm bao nhiêu PIC/dsPIC mà kết luận theo kinh nghiệm của bạn?

        Nếu bạn tải WinPic800 về và cài đặt vào máy thì các tập tin cấu hình cho JDM Mod và Schaer+ sẽ không tồn tại, vì chúng không nằm trong gói cài đặt của phần mềm WinPic800. Các tập tin cấu hình này đã được tôi post lên diễn đàn ở luồng "Thông tin về các mạch nạp và phần mềm" (không cần phải post lại lên mediafire làm gì), các bạn nhớ chú ý điểm này.

        Thân,
        Last edited by namqn; 30-05-2009, 04:12 PM. Lý do: thừa 1 từ
        Biển học mênh mông, sức người có hạn.

        Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
        http://www.picvietnam.com/forum/showthread.php?t=1263

        Comment

        • Mr.Bi
          Đệ tử 7 túi
          • Jul 2007
          • 188

          #5
          Nguyên văn bởi namqn View Post
          Bạn có thể trích dẫn liên kết đến trang web của tôi, không cần cắt hình vẽ và đưa lên photobucket làm gì. Kết quả thử nghiệm các mạch nạp này được tôi nêu ra trên trang web của tôi, không rõ bạn đã thử nghiệm bao nhiêu PIC/dsPIC mà kết luận theo theo kinh nghiệm của bạn?

          Nếu bạn tải WinPic800 về và cài đặt vào máy thì các tập tin cấu hình cho JDM Mod và Schaer+ sẽ không tồn tại, vì chúng không nằm trong gói cài đặt của phần mềm WinPic800. Các tập tin cấu hình này đã được tôi post lên diễn đàn ở luồng "Thông tin về các mạch nạp và phần mềm" (không cần phải post lại lên mediafire làm gì), các bạn nhớ chú ý điểm này.

          Thân,
          sr anh Nam , e ko cố ý , lúc trưa up lên mà quên đưa link, tại mấy hình này có sẵn trên photobucket nên paste vô lun .(đụng đến bản quyền oy đây )


          Còn kết quả thử nghiệm của a thì quá đủ để gọi là "cả nùi con PIC " rồi . Ở Đà Nẵng mà bán đủ loại PIC như a liệt kê thì e cũng rán mua .

          Vì một số mem ko chịu lục tìm , ko chịu search , chưa làm đc tới đâu thì hỏi cái đó , ngay cả với 1 số đứa em 05CDT đc em đưa cho capture,laypout , link 2 mạch này nhưng tụi nó la làng là ko nạp đc. Nguyên nhân là ko chịu copy 2 file cấu hình này . Do đó , em phải chỉ từng bứoc , up lun file lên ...

          Cảm ơn a đã nhắc nhở !

          Comment

          • hailuabk
            Nhập môn đệ tử
            • Aug 2008
            • 9

            #6
            Em thấy 2 cái mạch nạp trên làm nguồn 1 chiều tùm lum.có mạch mô dùng ít nguồn 1 chiều hơn không anh

            Comment

            • tienchuan
              Đệ tử 4 túi
              • Oct 2008
              • 71

              #7
              cho em tham gia với!
              Nhân tiện em xin đưa chương trình "đo nhiệt độ "dùng cảm biến nhiệt LM35DZ hiển thị trên 2 led 7 đoạn anode chung ,dùng pic16f877a (phí quá,nhưng chip này do Thầy em cho).
              cai mach in em vẽ thiếu chân nguồn cho 2 con led7,em nhát quá chạy lun cái jumper trước con trở Reset xuống luôn>


              // |+++++++++++++++++++++++++++++++++++++++++++++++++ ++|
              // | CHUONG TRINH HIENTHI NHIET DO TREN 2 LED 7 DOAN |
              // | BAO CAO THUC TAP MACH SO UNG DUNG |
              // | NGUYEN TIEN CHUAN-071250520207-07DT2 |
              // |+++++++++++++++++++++++++++++++++++++++++++++++++ ++|


              // ||||||||||||---------------------- KET NOI PHAN CUNG --------------------||||||||||||||||
              //++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++\
              //| RB0->6 KET NOI DEN CAC CHAN A,B,C,D,E,F,G CUA 2 LED 7 DOAN ANODE CHUNG. +\
              //| CHAN 8(VCC) CUA 2 LED 7 D0AN DUOC DIEU KHIEN BOI 2 BJT THUAN PNP: A1015 +\
              //| CHAN C CUA 2 BJT NOI VOI CHAN VCC CUA 2 LED 7 DOAN DE DIEU KHIEN QUET LED +\
              //| CHAN E CUA BJT NOI VOI NGUON +\
              //| CHAN B (BAM DIEN TRO 10K )CUA BJT HANG CHUC VA DON VI NOI LAN LUOT VOI CHAN RD1,RD0 +\
              //|---------------------------------------------------------------------------------------+\
              //| SU DUNG TRINH BIEN DICH PCWH COMPLIER VER:4.018 +\
              //| SU DUNG TRINH WINPIC800 DE NAP FILE HEX LEN PIC QUA CHUAN GIAO TIEP ICSP +\
              //|+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++\



              #include <16F877A.h> // KHAI BAO SU DUNG PIC 16F877A

              #include <def_877a.h> // FILE DINH NGHIA CAC THANH GHI VA CAC BIT

              #device *=16 adc=10 // KHAI BAO SU DUNG CON TRO 16 BIT VA ADC 10 BIT

              // KHAI BAO CAU HINH CHO PIC 16F877A
              #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT

              // KHAI BAO SU DUNG DELAY VOI TAN SO DAO DONG NGOAI
              #use delay(clock=12000000)

              int8 high,low; // KHAI BAO CAC BIEN SO NGUYEN 1 BYTE

              // KHAI BAO BANG MA LED 7 DOAN ANODE CHUNG
              int8 const a[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };

              // CHUONG TRINH CON TACH SO HANG CHUC VA HANG DON VI
              void convert_bcd(int8 x)
              {
              low=x%10; // CHU SO HANG DON VI
              high=x/10; // CHU SO HANG CHUC

              }
              // CHUONG TRINH CON HIEN THI RA 2 LED 7 DOAN
              void display()
              {
              PORTB=a[low];
              RD0=0;
              delay_us(500);
              RD0=1;
              PORTB=a[high];
              RD1=0;
              delay_us(500);
              RD1=1;
              }

              void main()
              {
              float value;
              int16 i;
              trisb = 0x00; // THIET LAP CAC CHAN PORTB LA OUTPUT
              trisd = 0x00; // THIET LAP CAC CHAN PORT D LA OUTPUT
              trise = 0x00; // THIET LAP CAC CHAN PORT E LA OUTPUT
              trisa = 0xff; // THIET LAP CAC CHAN PORT A LA INPUT

              // KHOI TAO ADC

              setup_adc(ADC_CLOCK_INTERNAL); // THIET LAP THOI GIAN LAY MAU BANG XUNG CLOCK
              setup_adc_ports(AN0); // THIET LAP CHAN AN0 LA CHAN VAO ADC
              set_ADC_channel(0) ;
              delay_us(10); // TRE 10US

              value=(float)read_adc(); // DOC GIA TRI ADC
              value = value/2.048; //
              convert_bcd((int8)value); // GOI CHUONG TRINH CON CONVERT_BCD

              i=0;
              while(1)
              {
              i++;
              value =(float) read_adc();
              value = value/2.048;
              if (i==500)
              {
              convert_bcd((int8)value);
              i=0;
              }
              display();
              }
              }
              Attached Files

              Comment

              • Mr.Bi
                Đệ tử 7 túi
                • Jul 2007
                • 188

                #8
                Nguyên văn bởi hailuabk View Post
                Em thấy 2 cái mạch nạp trên làm nguồn 1 chiều tùm lum.có mạch mô dùng ít nguồn 1 chiều hơn không anh
                nguồn 1 chiều đó mới quan trọng đó em . Nhờ nó mà mạch nạp đc nhiều con PIC. 1 số mạch nạp qua COM ko dùng lun nguồn máy tính nên list PIC hạn chế

                Em dùng adapter (20k) để cấp nguồn 1 chiều này

                Comment

                • hailuabk
                  Nhập môn đệ tử
                  • Aug 2008
                  • 9

                  #9
                  Có bác mô ở ĐN gần Bách Khoa không giúp em với.Em đang ngụp lặn con DS1307 với con 89S52 mấy ngày ni mà chưa được

                  Comment

                  • Mr.Bi
                    Đệ tử 7 túi
                    • Jul 2007
                    • 188

                    #10
                    ở đây chỉ thảo luận về PIC thui e . Nhưng thui , ae phá lệ . Vấn đề j nêu ra (quan trọng phải post code & mạch lên thì mới giúp đc đấy , chứ nói 0 0 thì chịu)

                    Comment

                    • hailuabk
                      Nhập môn đệ tử
                      • Aug 2008
                      • 9

                      #11
                      Em chỉ còn thắc mắc chỗ lấy dữ liệu ra ở con DS1307 rồi chuyển qua mã BCD sau đó lại đưa dữ liệu vào led 7 đoạn.Tại sao phải chuyển qua BCD mà không phải là số thập phân luôn

                      Comment

                      • tienchuan
                        Đệ tử 4 túi
                        • Oct 2008
                        • 71

                        #12
                        Cần giúp đỡ về Spi của pic16f877a

                        Các Anh nào có tài liệu tiếng việt, hay code và mạch ví dụ về Spi của pic16f877a thì cho em xin với !Em mới nghiên cứu về phần này nhưng chẳng biết bắt đầu từ đâu?
                        Em vào Topic giao tiếp của diễn đàn nhưng thấy loạn xạ luôn!

                        Anh nào đi trước chỉ cho em với !

                        Cảm ơn các Anh nhiều !

                        tienchuanct@gmail.com

                        Comment

                        • Mr.Bi
                          Đệ tử 7 túi
                          • Jul 2007
                          • 188

                          #13
                          Nguyên văn bởi hailuabk View Post
                          Em chỉ còn thắc mắc chỗ lấy dữ liệu ra ở con DS1307 rồi chuyển qua mã BCD sau đó lại đưa dữ liệu vào led 7 đoạn.Tại sao phải chuyển qua BCD mà không phải là số thập phân luôn
                          em hỉu sai !Khi nạp vào con RTC 1307 , ta phải chuyển thành mã BCD .
                          vd : mún nạp ngày = 27 thì phải nạp 0x27 .

                          Còn khi đọc ra , dữ liẹu ta thu đc là số có dạng mã BCD , ta phải chuyển wa thành số thập phân để dễ làm việc khi xuất led

                          vd : ngay = read_rtc(0x04) ; // ngày = 0x27 <-- số này là số BCD
                          bước tiếp theo ngay = (ngay>>4)*10 + (ngay&0x0F) // lúc này ngày = 27 <-- số thập phân đây

                          Comment

                          • Mr.Bi
                            Đệ tử 7 túi
                            • Jul 2007
                            • 188

                            #14
                            Chúng ta đã biết PIC 16F877A có module PWM trong CCP . Nhưng có cái dở là bắt buộc ta phải dùng 2 chân RC1 & RC2 , còn phải tốn bộ timer .

                            H với 1 bộ timer bất kỳ , ae ta có thể sử dụng bất kỳ chân nào làm PWM cũng đc (giống như kiểu sd 89 vẫn PWM đc)

                            Code:
                            #include <16F877A.h>
                            #fuses  NOWDT,XT,NOPROTECT,NOLVP,PUT,NODEBUG
                            #use delay(clock=4000000)
                            
                            #bit signal =0x06.5 // RB5
                            
                            
                            int8 V_BanhTrai,V_BanhPhai, temp;
                            
                            void Init_timer()
                            { 
                              OPTION_REG=0x00;
                              TMR0IE=1; 
                              TMR0IF=0; 
                              TMR0 = 0;
                              enable_interrupts(GLOBAL); // GIE =1
                              //enable_interrupts(int_timer0);
                            }
                            #int_timer0
                            void ngat_timer0()
                            { TMR0IF=0;
                              if (temp++==10) temp= 0;      
                            
                              switch (V_BanhTrai) 
                               {case 0: RC1 = 1; break;
                                case 10: RC1 = 0; break;
                                default:
                                  if (temp < V_BanhTrai) RC1 = 0; else RC1 = 1;
                               };
                            
                              switch (V_BanhPhai) 
                               { case 0: RC2 = 1;break;
                                 case 10:RC2 = 0;break;
                                 default:   
                                   if (temp < V_BanhPhai) RC2 = 0;else RC2= 1;
                               }
                              
                              TMR0 = 0;
                            }
                            
                            main()
                            { TRISC=0x00;PORTC=0xFF;
                              
                              Init_timer();
                            
                             while(1) V_BanhTrai=V_BanhPhai=10 ; //chay het toc do

                            Comment

                            • Mr.Bi
                              Đệ tử 7 túi
                              • Jul 2007
                              • 188

                              #15
                              Tiếp theo , ta ứng dụng PIC trong việc thu nhận sóng RF , điều khiển Rb từ xa



                              mạch phát :

                              Code:
                              #include <16F88.h>
                              #device 16F88*=16  ADC=8
                              #fuses  XT,NOWDT,NOPROTECT,NOLVP,NOPUT,NOBROWNOUT,NODEBUG
                              #use    delay(clock=4000000)
                              #use fast_io(b)
                              
                              #define AN0  0b10110111
                              #define AN1  0b01010100
                              #define AN2  0b01001000
                              #define AN3  0b10001011
                              
                              #define Av   0b01011010
                              #define Bv   0b11001101
                              #define stop 0b10100101
                              #define Cv   0b00110010
                              #define Dv   0b10010110  
                              
                              #bit    TX   =0x06.5 // RB5
                              
                              //  24v = 0101 1010 , AN0= 1011 0111
                              //  12v = 1100 1101 , AN1= 0101 0100
                              // stop = 1010 0101 , AN2= 0100 1000
                              // -12v = 0011 0010 , AN3= 1010 1011
                              // -24v = 1001 0110
                              
                              int8 adc0,adc1,adc2,adc3;
                              unsigned char buff[2];  // dia chi & data
                              
                              void readADC()
                              { setup_adc(adc_clock_internal);
                                
                                setup_adc_ports(sAN0);
                                set_adc_channel(0);
                                adc0=read_adc();delay_us(20);
                              
                                setup_adc_ports(sAN1);
                                set_adc_channel(1);
                                adc1=read_adc();delay_us(20);
                              
                                setup_adc_ports(sAN2);
                                set_adc_channel(2);
                                adc2=read_adc();delay_us(20);
                                
                                setup_adc_ports(sAN3);
                                set_adc_channel(3);
                                adc3=read_adc();delay_us(20);
                              }
                              void send_data(unsigned char *data)
                              { unsigned char i,j;
                                for (i=0;i<10;i++)   // send preamble 16 times
                                    {TX=1;
                                     delay_us(4890);    // 5 mS
                                     TX=0;
                                     delay_us(4890);    // 5 mS
                                    };
                                delay_us(14738); // Delay 15000 uS  // syn bit
                                 //-----------------
                                TX=1;   // start bit
                                delay_us(4890);    // 5 mS
                                TX=0;
                                delay_us(4890);    // 5 mS
                                //-----------------
                                for (j=0;j<2;j++)
                                  { for(i=0;i<8;i++)
                                      {if((data[j]&0x80)==0x80)
                                        {TX=1;delay_us(4890);    // 5 mS
                                         TX=0;delay_us(4890);    // 5 mS
                                        }
                                       else{TX=0;delay_us(4890);    // 5 mS
                                            TX=1;delay_us(4890);    // 5 mS
                                           };
                                       data[j]=data[j]<<1;
                                      };
                                   };
                                 //------ send stop bit -------
                                TX=1;delay_us(4890);    // 5 mS
                                TX=0;delay_us(4890);    // 5 mS
                              }   
                              void main()
                              { set_tris_B(0x00);RB1=0;TX=0;delay_ms(500);RB1=1;
                                while(1)
                                { readADC();RB1=1;
                                  if(((0<=adc0)&&(adc0<40))&&((90<adc1&&adc1<140))){RB1=0;buff[0]=AN0;buff[1]=Av;send_data(buff);};//toi 24V
                                  if(((40<=adc0)&&(adc0<=90))&&((90<adc1&&adc1<140))){RB1=0;buff[0]=AN0;buff[1]=Bv;send_data(buff);};//toi 12V
                                  if(((150<=adc0)&&(adc0<=185))&&((90<adc1&&adc1<140))){RB1=0;buff[0]=AN0;buff[1]=Cv;send_data(buff);};//lui 12V
                                  if(((185<adc0)&&(adc0<255))&&((90<adc1)&&(adc1<140))){RB1=0;buff[0]=AN0;buff[1]=Dv;send_data(buff);};//24V
                                
                                  if((adc1<40)&&(100<adc0&&adc0<170)){RB1=0;buff[0]=AN1;buff[1]=Bv;send_data(buff);};//phai 2banh12V
                                  if((40<=adc1)&&(adc1<=100)&&(100<adc0&&adc0<170)){RB1=0;buff[0]=AN1;buff[1]=Av;send_data(buff);};//phai 1 banh24V
                                  if((145<=adc1)&&(adc1<=180)&&(100<adc0&&adc0<170)){RB1=0;buff[0]=AN1;buff[1]=Dv;send_data(buff);};//trai 1 banh24V
                                  if((180<adc1)&&(adc1<=255)&&(100<adc0&&adc0<170)){RB1=0;buff[0]=AN1;buff[1]=Cv;send_data(buff);};//trai 2banh12V
                                  
                                  if(((0<=adc2)&&(adc2<50))&&((90<adc3)&&(adc3<140))){RB1=0;buff[0]=AN2;buff[1]=Bv;send_data(buff);};
                                  if(((180<=adc2)&&(adc2<=255))&&((90<adc3)&&(adc3<140))){RB1=0;buff[0]=AN2;buff[1]=Cv;send_data(buff);};
                                  
                                  if(((0<=adc3)&&(adc3<70))&&((100<adc2)&&(adc2<170))){RB1=0;buff[0]=AN3;buff[1]=Bv;send_data(buff);};
                                  if((160<=adc3)&&(adc3<=255)&&((100<=adc2)&&(adc2<=170)))
                                    {RB1=0;buff[0]=AN3;buff[1]=Cv;send_data(buff);};
                                
                                }
                              }


                              Mạch thu:

                              Code:
                              #include <18F4331.h>
                              #fuses  
                              
                              XT,NOWDT,NOPROTECT,NOLVP,NOPUT,NOBROWNOUT,NOCPD,NODEBUG,NOFCMEN,NOCPB,HPOL_LOW,NOPW
                              
                              MPIN,STVREN
                              #use    delay(clock=4000000)
                              
                              #use fast_io(a)
                              #use fast_io(b)
                              #use fast_io(c)
                              #use fast_io(d)
                              #use fast_io(e)
                              
                              #bit RX      =0xF83.0 // RD0
                              #bit RL1     =0xF81.4 // RB4
                              #bit RL2     =0xF81.5 // RB5
                              #bit RL3     =0xF81.0 // RB0
                              #bit RL4     =0xF81.2 // RB2
                              #bit RL5     =0xF83.7 // RD7
                              #bit RL6     =0xF83.6 // RD6
                              #bit RL7     =0xF83.5 // RD5
                              #bit PWM3    =0xF81.1 // RB1
                              #bit PWM4    =0xF81.3 // RB3
                              
                              #define AN0  0b10110111
                              #define AN1  0b01010100
                              #define AN2  0b01001000
                              #define AN3  0b10001011
                              
                              #define Av   0b01011010
                              #define Bv   0b11001101
                              #define stop 0b10100101
                              #define Cv   0b00110010
                              #define Dv   0b10010110  
                              
                              unsigned char i,j,T0,count;
                              unsigned char RXREG[2];
                              int1 get_data(unsigned char *buff);
                              int1 rx_bit;
                              
                              
                              //-----------------------------------------------
                              int1 get_data(unsigned char *buff)
                              { unsigned char i,j,T0,count;   
                                i=10; count=0;   
                                T0CON = 0x84; // prescaler =32
                                while(--i)   // wait preamble
                                 {delay_us(1);
                                  while(RX);        
                                  TMR0L=0;
                                  delay_us(1);
                                  while(!RX);
                                  T0=TMR0L;
                                  if (T0==0xFF) return 1;    // error
                                  if ((T0>=146) && (T0<=166))// 4672-5312 uS it OK.   
                                    {count++;
                                     if ((count>=5)|| (i==0)) break;
                                    };        
                                 };
                                if (i==0) return 1; // error            
                                T0CON=0x86; // prescaler = 128
                                T0=0;
                                while(!((T0>=146)&&(T0<=166)))//18688 - 21248 uS it OK. syn bit
                                  {delay_us(1);
                                   while(RX); // wait syn
                                   TMR0L=0;
                                   delay_us(1);
                                   while(!RX);
                                   T0=TMR0L;
                                  };
                                while(RX);//wait start bit go low
                                delay_us(7355); // delay 7500 uS before sampling
                                for(j=0;j<2;j++)
                                  {i=8;
                                   buff[j]=0;
                                   while(i--)
                                     {buff[j]=buff[j]<<1;
                                      rx_bit=RX;   // sampling
                                      buff[j]=buff[j]|rx_bit;         
                                      if (rx_bit==0)while(!RX);   
                                      else while(RX);
                                      delay_us(7355); // delay 7500 uS before sampling      
                                     };
                                   };
                                if (rx_bit==0) 
                                if (!RX) return 1; // error (no stop bit found)
                                else if (!RX) return 1; // error (no stop bit found)
                                return 0;
                              }
                              
                              main()
                              { set_tris_B(0x00); PORTB=0xFF;
                                set_tris_C(0x00); PORTC=0xff;
                                set_tris_D(0b00000001);PORTD=0b11000001;
                                set_power_pwm();
                                while(1)
                                { while(get_data(RXREG)){RL1=RL2=RL3=RL4=RL5=RL6=1;RL7=0;dc_len(0);dc_trai(0);}
                                  if(RXREG[0]==AN0)
                                    {if(RXREG[1]==Av){RL7=1;RL1=RL5=0;}; // di toi 24v
                                     if(RXREG[1]==Bv){RL7=0;RL1=RL5=0;}; // toi 12v
                                     if(RXREG[1]==Cv){RL7=0;RL2=RL6=0;}; // lui 12v
                                     if(RXREG[1]==Dv){RL7=1;RL2=RL6=0;}; // di lui 24v
                                    };
                                  if(RXREG[0]==AN1)
                                    {if(RXREG[1]==Bv){RL7=1;RL1=RL6=0;}; //trai 2banh 24V
                                     if(RXREG[1]==Av){RL7=0;RL1=0;}; //trai 1banh 12V
                                     
                                     if(RXREG[1]==Dv){RL7=0;RL5=0;}; //phai 1banh 12V
                                     if(RXREG[1]==Cv){RL7=1;RL2=RL5=0;}; //phai 2banh 24V
                                    };
                                  if(RXREG[0]==AN2)
                                    {if(RXREG[1]==Bv){dc_len(150);};
                                     if(RXREG[1]==Cv){RL3=0;dc_len(170);};
                                    };
                                  if(RXREG[0]==AN3)
                                    {if(RXREG[1]==Bv){dc_trai(7);};
                                     if(RXREG[1]==Cv){RL4=0;dc_trai(7);};
                                    };
                                  get_data(RXREG)=1;
                                }
                              }



                              Comment

                              Working...