![]() |
|
Tài trợ cho PIC Vietnam |
||||||||
| Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC |
|
|
Ðiều Chỉnh | Xếp Bài |
|
|
#11 | |
|
Đệ tử 1 túi
Tham gia ngày: Jul 2007
Bài gửi: 22
: |
Trích:
![]() PICVIETNAM tròn 1 tuổi ! ![]() Mình mới viết xong một chương trình I2C dùng 1 Master điều khiển mạng 4 Slave bằng 4 nút ngắt RB, tất cả đều dùng 16f877a, mình xin post lên đây mong các bạn góp ý. Phần cứng: 4 nút nhấn ngắt ngoài rb4 -> rb7 dùng để điều khiển 4 Slave, nhấn nút nào thì Master gọi Slave đó chạy ct Master gửi xuống, còn các Slave khác "ngồi chơi". 2 chân SDA và SCL của các VDK nối nhau kéo lên 4k7, PORTD của 4 Slave quét 8 led... Phần mềm: 4 Slave có địa chỉ lần lượt là 0x10, 0x20, 0x30, 0x40 nên chương trình của 4 Slave hoàn toàn như nhau, chỉ khác cái khai báo ban đầu address là 4 địa chỉ trên. ct của Master: Code:
#include <16f877a.h>
#include <def_877a.h>
#use delay(clock = 20000000)
#fuses HS, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOPROTECT
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, force_hw)
const unsigned int8 dulieu[]={1,2,4,8,16,32,64,128};
const unsigned int8 address_slave[]={0,0x10,0x20,0x30,0x40};
int8 a,i,kytu;
void ghi(int8 address,int8 data)
{
i2c_start();
i2c_write(address);
i2c_write(data);
i2c_stop();
}
#INT_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
{
if(RB4==0)
{
a=1;
i=0;
}
else if(RB5==0)
{
a=2;
i=0;
}
else if(RB6==0)
{
a=3;
i=0;
}
else if(RB7==0)
{
a=4;
i=0;
}
}
RBIF=0;
}
void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
set_tris_d(0);
portd=0;
while(TRUE)
{
kytu=a;
delay_ms(100);
while(kytu==a)
{
if(a!=0)
{
delay_ms(50);
ghi(address_slave[a],dulieu[i]);
i++;
if(i==8)
{
i=0;
}
}
}
}
}
Code:
#include <16f877a.h>
#include <def_877a.h>
#use delay(clock = 20000000)
#fuses HS, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOPROTECT
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10, force_hw)
int8 dulieu;
#INT_SSP
void ngat_i2c()
{
int8 state;
state = i2c_isr_state();
if(state < 0x80)
{
dulieu = i2c_read();
portd = dulieu;
delay_ms(50);
}
}
void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
set_tris_d(0);
while(TRUE)
{
portd = 0;
}
}
Em muốn post sơ đồ mạch lên mà không biết chèn code như thế nào, mong Admin chỉ giùm em cách tải file từ máy... thay đổi nội dung bởi: namqn, 15-06-2008 lúc 07:11 PM. Lý do: xóa thông tin không cần thiết |
|
|
|
|
| Ðiều Chỉnh | |
| Xếp Bài | |
|
|