PDA

View Full Version : kết nối 16f877a với ds1307 cần giúp đỡ


thythy151
06-11-2011, 12:13 AM
em nhận đồ án đèn giao thông 3 chế độ dùng 16f877a voi ds1307, để lấy dữ liệu thời gian thực mà so sanh cho chạy ở những chế dộ khác nhau, nhưng không biết code để kết nối 2 con này mà lấy dữ liệu thế nào, vậy có anh nào cao thủ vào chỉ em vài chiêu em xin cảm ơn, chi cần kết nối đọc ghi dữ liệu để lấy đó mà so sánh thôi

khi em nạp code này vào thì mô phông không chạy nó vẫn hiện cai đồng hồ theo máy tính chang biết sao nữa


#include <16f877a.h>
#use delay(clock=4000000)
#fuses xt
///////////////////////////////////////

#define DS1307_SDA PIN_C4
#define DS1307_SCL PIN_C3
#use i2c(master, sda=DS1307_SDA, scl=DS1307_SCL)


void set_time() ;
void update_time();



int8 giay,phut,gio,thu,ngay,thang,nam;
int l;
int x,y,z;

////////////////////////////////////////////////////////////////////////////////////////////


void int_DS1307()
{
output_float(DS1307_SCL);
output_float(DS1307_SDA);
}


// ------- Chuyen du lieu m? BINARY cua MASTER -> du lieu m? BCD cho DS1307--------
int DECIMALtoBCD(int data) // MASTER -> DS1307
{
// x -> y trong do x la du lieu cua MASTER, y la du lieu sau khi chuyen doi
// Thuat toan thuc hien bien doi tu ma DECIMAL sang ma BCD he 10

x = data;
if(x<10) // vd: (x=9) -> (y=9) = 0x09
{
y = x;
}
else if(x>=10) // vd: (x=29) -> (y=41) = 0x29
{
y = (x/10 * 6) + x;
}
return y;
}

// ------- Chuyen du lieu m? BCD cua DS1307 -> du lieu m? BINARY cho MASTER-------
int BCDtoDECIMAL(int data) // MASTER <- DS1307
{
// x <- y trong do y la du lieu cua SLAVE, x la du lieu sau khi chuyen doi
// Thuat toan thuc hien bien doi tu ma BCD he 10 sang ma DECIMAL

y = data;
l=0;
if(y<10) // vd: (x=9) <- (y=9) = 0x09
{
x = y;
}
else if(y>=10) // vd: (x=10) <- (y=16) = 0x10
{
do
{
x = y - (6 * l);
z = (x/10 * 6) + x;
l++;
}
while(z!=y);
}
return x;
}

#int_EXT


void set_time()
{
// --------- Khoi tao hien thi ban dau: SAT, 15-10-2011, 07:30:00 --------
giay = 0; //Giay: 00
phut = 30; //Phut: 30
gio = 7; //Gio: 07 (che do 24h)
thu = 7; //Thu 7: SAT (SATURDAY)
ngay = 15; //Ngay: 15
thang = 10; //Thang: 10
nam = 11; //Nam: 11

// Ghi gia tri vao slave
i2c_start(); // Bat dau ghi du lieu vao Slave
i2c_write(0xD0); // Truyen dia chi cua DS1307 len duong truyen I2C ( 0xD0 = Slave Address OR Write bit hay (0x68 OR 0) )
i2c_write(0x00); // Truyen dia chi thanh ghi 0x00 cua DS1307
i2c_write(DECIMALtoBCD(giay)); // Ghi gia tri BCD giay vao thanh ghi 0x00
i2c_write(DECIMALtoBCD(phut)); // Ghi gia tri BCD phut vao thanh ghi 0x01
i2c_write(DECIMALtoBCD(gio)); // Ghi gia tri BCD gio vao thanh ghi 0x02
i2c_write(DECIMALtoBCD(thu)); // Ghi gia tri BCD thu vao thanh ghi 0x03
i2c_write(DECIMALtoBCD(ngay)); // Ghi gia tri BCD ngay vao thanh ghi 0x04
i2c_write(DECIMALtoBCD(thang)); // Ghi gia tri BCD thang vao thanh ghi 0x05
i2c_write(DECIMALtoBCD(nam)); // Ghi gia tri BCD nam vao thanh ghi 0x06
i2c_write(0x10); // Ghi gia tri vao thanh ghi 0x07 de tao xung vuong 1Hz
i2c_stop(); // Ket thuc ghi du lieu
}

void update_time()
{
// Doc du lieu tu Slave
i2c_start(); // Bat dau doc du lieu tu Slave
i2c_write(0xD0); // Truyen dia chi cua DS1307 len duong truyen I2C ( 0xD0 = Slave Address OR Write bit hay (0x68 OR 0) )
i2c_write(0x00); // Truyen dia chi thanh ghi 0x00 cua DS1307
i2c_start(); // Dieu kien Restart
i2c_write(0xD1);
giay = BCDtoDECIMAL(i2c_read()); // Doc gia tri giay tu thanh ghi 0x00 cua DS1307
phut = BCDtoDECIMAL(i2c_read()); // Doc gia tri phut tu thanh ghi 0x01 cua DS1307
gio = BCDtoDECIMAL(i2c_read()); // Doc gia tri gio tu thanh ghi 0x02 cua DS1307
thu = BCDtoDECIMAL(i2c_read()); // Doc gia tri thu tu thanh ghi 0x03 cua DS1307
ngay = BCDtoDECIMAL(i2c_read()); // Doc gia tri ngay tu thanh ghi 0x04 cua DS1307
thang = BCDtoDECIMAL(i2c_read()); // Doc gia tri thang tu thanh ghi 0x05 cua DS1307
nam = BCDtoDECIMAL(i2c_read(0)); // Doc gia tri nam tu thanh ghi 0x06 cua DS1307
i2c_stop(); // Ket thuc doc du lieu
}


lần đầu post không biết có đúng chổ không mọi người thông cảm

thythy151
06-11-2011, 06:56 PM
sao không có cao nhân nào vào giúp em hết vậy TT

van truong
07-11-2011, 01:06 PM
do mi ve xem di
http://www.mediafire.com/?t2ec5y4g1551wv9

rocket42
07-11-2011, 10:00 PM
code của bạn đủ chưa vậy.
Sao ko thấy hàm mai()
nếu bạn ko biết nó sai chỗ nào và cần phải post cái gì. thì bạn nên post all những cái gì bạn đã làm được. Và có vài dòng chú thích là sai chỗ nào sẽ có người giúp

ngdnhanbk
23-11-2011, 06:34 PM
do mi ve xem di
http://www.mediafire.com/?t2ec5y4g1551wv9
Bạn cho mình xin code viết bằng c đi

hongmta
24-11-2011, 01:07 AM
em nhận đồ án đèn giao thông 3 chế độ dùng 16f877a voi ds1307, để lấy dữ liệu thời gian thực mà so sanh cho chạy ở những chế dộ khác nhau, nhưng không biết code để kết nối 2 con này mà lấy dữ liệu thế nào, vậy có anh nào cao thủ vào chỉ em vài chiêu em xin cảm ơn, chi cần kết nối đọc ghi dữ liệu để lấy đó mà so sánh thôi

khi em nạp code này vào thì mô phông không chạy nó vẫn hiện cai đồng hồ theo máy tính chang biết sao nữa


#include <16f877a.h>
#use delay(clock=4000000)
#fuses xt
///////////////////////////////////////

#define DS1307_SDA PIN_C4
#define DS1307_SCL PIN_C3
#use i2c(master, sda=DS1307_SDA, scl=DS1307_SCL)


void set_time() ;
void update_time();



int8 giay,phut,gio,thu,ngay,thang,nam;
int l;
int x,y,z;

////////////////////////////////////////////////////////////////////////////////////////////


void int_DS1307()
{
output_float(DS1307_SCL);
output_float(DS1307_SDA);
}


// ------- Chuyen du lieu m? BINARY cua MASTER -> du lieu m? BCD cho DS1307--------
int DECIMALtoBCD(int data) // MASTER -> DS1307
{
// x -> y trong do x la du lieu cua MASTER, y la du lieu sau khi chuyen doi
// Thuat toan thuc hien bien doi tu ma DECIMAL sang ma BCD he 10

x = data;
if(x<10) // vd: (x=9) -> (y=9) = 0x09
{
y = x;
}
else if(x>=10) // vd: (x=29) -> (y=41) = 0x29
{
y = (x/10 * 6) + x;
}
return y;
}

// ------- Chuyen du lieu m? BCD cua DS1307 -> du lieu m? BINARY cho MASTER-------
int BCDtoDECIMAL(int data) // MASTER <- DS1307
{
// x <- y trong do y la du lieu cua SLAVE, x la du lieu sau khi chuyen doi
// Thuat toan thuc hien bien doi tu ma BCD he 10 sang ma DECIMAL

y = data;
l=0;
if(y<10) // vd: (x=9) <- (y=9) = 0x09
{
x = y;
}
else if(y>=10) // vd: (x=10) <- (y=16) = 0x10
{
do
{
x = y - (6 * l);
z = (x/10 * 6) + x;
l++;
}
while(z!=y);
}
return x;
}

#int_EXT


void set_time()
{
// --------- Khoi tao hien thi ban dau: SAT, 15-10-2011, 07:30:00 --------
giay = 0; //Giay: 00
phut = 30; //Phut: 30
gio = 7; //Gio: 07 (che do 24h)
thu = 7; //Thu 7: SAT (SATURDAY)
ngay = 15; //Ngay: 15
thang = 10; //Thang: 10
nam = 11; //Nam: 11

// Ghi gia tri vao slave
i2c_start(); // Bat dau ghi du lieu vao Slave
i2c_write(0xD0); // Truyen dia chi cua DS1307 len duong truyen I2C ( 0xD0 = Slave Address OR Write bit hay (0x68 OR 0) )
i2c_write(0x00); // Truyen dia chi thanh ghi 0x00 cua DS1307
i2c_write(DECIMALtoBCD(giay)); // Ghi gia tri BCD giay vao thanh ghi 0x00
i2c_write(DECIMALtoBCD(phut)); // Ghi gia tri BCD phut vao thanh ghi 0x01
i2c_write(DECIMALtoBCD(gio)); // Ghi gia tri BCD gio vao thanh ghi 0x02
i2c_write(DECIMALtoBCD(thu)); // Ghi gia tri BCD thu vao thanh ghi 0x03
i2c_write(DECIMALtoBCD(ngay)); // Ghi gia tri BCD ngay vao thanh ghi 0x04
i2c_write(DECIMALtoBCD(thang)); // Ghi gia tri BCD thang vao thanh ghi 0x05
i2c_write(DECIMALtoBCD(nam)); // Ghi gia tri BCD nam vao thanh ghi 0x06
i2c_write(0x10); // Ghi gia tri vao thanh ghi 0x07 de tao xung vuong 1Hz
i2c_stop(); // Ket thuc ghi du lieu
}

void update_time()
{
// Doc du lieu tu Slave
i2c_start(); // Bat dau doc du lieu tu Slave
i2c_write(0xD0); // Truyen dia chi cua DS1307 len duong truyen I2C ( 0xD0 = Slave Address OR Write bit hay (0x68 OR 0) )
i2c_write(0x00); // Truyen dia chi thanh ghi 0x00 cua DS1307
i2c_start(); // Dieu kien Restart
i2c_write(0xD1);
giay = BCDtoDECIMAL(i2c_read()); // Doc gia tri giay tu thanh ghi 0x00 cua DS1307
phut = BCDtoDECIMAL(i2c_read()); // Doc gia tri phut tu thanh ghi 0x01 cua DS1307
gio = BCDtoDECIMAL(i2c_read()); // Doc gia tri gio tu thanh ghi 0x02 cua DS1307
thu = BCDtoDECIMAL(i2c_read()); // Doc gia tri thu tu thanh ghi 0x03 cua DS1307
ngay = BCDtoDECIMAL(i2c_read()); // Doc gia tri ngay tu thanh ghi 0x04 cua DS1307
thang = BCDtoDECIMAL(i2c_read()); // Doc gia tri thang tu thanh ghi 0x05 cua DS1307
nam = BCDtoDECIMAL(i2c_read(0)); // Doc gia tri nam tu thanh ghi 0x06 cua DS1307
i2c_stop(); // Ket thuc doc du lieu
}


lần đầu post không biết có đúng chổ không mọi người thông cảm
bạn post cả mạch cho ace dễ xử lý!^^