![]() |
|
Tài trợ cho PIC Vietnam |
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 |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
Đệ 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 |
![]() |
![]() |
![]() |
#2 |
Đệ 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; } } ![]() ![]() ![]() |
![]() |
![]() |
![]() |
#3 |
Đệ 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
|
![]() |
![]() |
![]() |
#4 |
Đệ tử 1 túi
Tham gia ngày: Jul 2009
Bài gửi: 16
: |
![]() 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 |
![]() |
![]() |
![]() |
#5 |
Đệ 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 /////////////////////////////// |
![]() |
![]() |
![]() |
#6 |
Đệ 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ế .
|
![]() |
![]() |
![]() |
#7 |
Đệ tử 7 túi
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
: |
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. |
![]() |
![]() |
![]() |
#8 |
Đệ tử 7 túi
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 đó
|
![]() |
![]() |
![]() |
#9 | |
Đệ tử 4 túi
Tham gia ngày: Oct 2008
Bài gửi: 71
: |
Trích:
Chúc Anh/bạn thành công ! Chào !!! [+=+] |
|
![]() |
![]() |
![]() |
#10 |
Đệ tử 7 túi
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é.
|
![]() |
![]() |
![]() |
#11 |
Đệ 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ừ đã.
|
![]() |
![]() |
![]() |
#12 |
Đệ tử 7 túi
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
: |
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 ?
|
![]() |
![]() |
![]() |
#13 |
Đệ 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
|
![]() |
![]() |
![]() |
#14 |
Đệ tử 7 túi
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
: |
|
![]() |
![]() |
![]() |
#15 |
Đệ 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
|
![]() |
![]() |
![]() |
|
|