PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 05-06-2009, 07:47 PM   #1
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
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
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-06-2009, 09:35 PM   #2
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
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;
  }
}



Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-10-2011, 07:53 PM   #3
van truong
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 16
:
led 3D 8*8*8 cube

su dung pic de lam led 3d
van truong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-10-2011, 08:08 PM   #4
van truong
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 16
:
Smile led 3D 8*8*8 cube

hinh anh va video minh thuc hien ne
hinh anh
http://www.mediafire.com/i/?v7e0zeflavzdff6
http://www.mediafire.com/i/?v69s9mu684mkt2q
video
http://www.mediafire.com/?haqkr203ztj2qzi
http://www.mediafire.com/?rec1ml6niyntymf
van truong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-10-2011, 08:16 PM   #5
van truong
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 16
:
led 3D 8*8*8 cube

hinh anh va video minh thuc hien ne
hinh anh
http://www.mediafire.com/i/?v7e0zeflavzdff6
http://www.mediafire.com/i/?v69s9mu684mkt2q
video
http://www.mediafire.com/?haqkr203ztj2qzi
http://www.mediafire.com/?rec1ml6niyntymf

///////////////////////////////
van truong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-06-2009, 12:03 AM   #6
hoc_picpicpic
Đệ tử 6 túi
 
Tham gia ngày: Feb 2009
Bài gửi: 127
:
bác Mr.Bi ơi con robo đó có những chức năng gì thế , em thấy bác dùng pic8f4431 mà sao chẳng thấy đoạn code nào viết cho bộ PWM thế .
hoc_picpicpic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-06-2009, 09:01 PM   #7
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Trích:
Nguyên văn bởi hoc_picpicpic View Post
bác Mr.Bi ơi con robo đó có những chức năng gì thế , em thấy bác dùng pic8f4431 mà sao chẳng thấy đoạn code nào viết cho bộ PWM thế .
Trong mạch này t đâu dùng PWM mà khai báo làm chi .

thay đổi nội dung bởi: Mr.Bi, 13-06-2009 lúc 04:44 PM.
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-06-2009, 01:45 AM   #8
vidieukhiencdn
Đệ tử 7 túi
 
vidieukhiencdn's Avatar
 
Tham gia ngày: May 2009
Bài gửi: 242
:
Bạn tienchuan oi mạch nhiệt độ LM35 bạn thử chưa, chạy tốt ko vậy, minh muốn làm thử mạch đó
vidieukhiencdn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-06-2009, 09:07 AM   #9
tienchuan
Đệ tử 4 túi
 
tienchuan's Avatar
 
Tham gia ngày: Oct 2008
Bài gửi: 71
:
Trích:
Nguyên văn bởi vidieukhiencdn View Post
Bạn tienchuan oi mạch nhiệt độ LM35 bạn thử chưa, chạy tốt ko vậy, minh muốn làm thử mạch đó
Dạ em đã làm mạch thật,mạch này em làm để nộp ở môn Thực Tập Mạch Số Ứng Dụng(thầy đã test thử bằng điếu con ngựa,và cho em điểm A hehe).Mạch chạy rất ổn định,sai số cỡ chưa tới 1 độ ,nhưng do khi làm mạch in,em hàn con lm35dz gần chỗ nguồn (con 7805),nên nó chạy một lát thì có sai số chút ít(do con 7805 nó nóng lên anh ơi).Em thấy anh/bạn nên vẽ jump để đưa con lm 35dz ra khỏi mạch in bằng dây tín hiệu 3 đường (dây 3 sợi ấy) thì mạch đo ngon ơ luôn !
Chúc Anh/bạn thành công !
Chào !!! [+=+]
tienchuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-06-2009, 11:30 AM   #10
vidieukhiencdn
Đệ tử 7 túi
 
vidieukhiencdn's Avatar
 
Tham gia ngày: May 2009
Bài gửi: 242
:
Thank bạn rất nhiều, mình sẽ ráp thử, có gì ko rõ bạn giúp mình nhé.
vidieukhiencdn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-08-2009, 03:40 PM   #11
sonduy1
Đệ tử 1 túi
 
Tham gia ngày: Jun 2009
Bài gửi: 20
:
bác vào khoe hàng hay giúp đỡ anh em tìm hiểu pic vậy.post những bài mà a,e ở đây xài dc,còn cái đó từ từ đã.
sonduy1 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-08-2009, 11:07 PM   #12
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Trích:
Nguyên văn bởi sonduy1 View Post
bác vào khoe hàng hay giúp đỡ anh em tìm hiểu pic vậy.post những bài mà a,e ở đây xài dc,còn cái đó từ từ đã.
sr , đây là luồng cùng trao đổi về PIC chứ k phải luồng dành cho ng mới bắt đầu , điều đó cũng có thể hỉu là căn bản về PICu cần phải có , đã sử dụng wa hết các chức năng của PIC. t chỉ đi sâu vào ứng dụng những chức năng đó , cách giao tiếp với những module ngoài . ok ?
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-08-2009, 09:20 PM   #13
greenfield
Đệ tử 6 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 152
:
Bác nào đã làm chuẩn giao tiêps SPI xing chỉ cho em với. Em đang cần làm giao tiếp với EEPROM
greenfield vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-08-2009, 09:06 PM   #14
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Trích:
Nguyên văn bởi greenfield View Post
Bác nào đã làm chuẩn giao tiêps SPI xing chỉ cho em với. Em đang cần làm giao tiếp với EEPROM
EEPROM bi h thường giao tiếp I2C , vd mấy con 24Cxx . Nếu ai đã từng làm về I2C thì sẽ thấy cực kỳ dễ dùng . B chưa test thử EEPROM với chuẩn SPI
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-10-2011, 07:48 PM   #15
van truong
Đệ tử 1 túi
 
Tham gia ngày: Jul 2009
Bài gửi: 16
:
chuong trinh do chay chet lien ,len mang pot bay cho vui do ma
van truong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 01:19 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam