![]() |
|
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
|
|
|
|
![]() |
|
|