PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp USB, CAN, I2C, SPI, USART...

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

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
Prev Previous Post   Next Post Next
Old 06-11-2011, 12:13 AM   #1
thythy151
Nhập môn đệ tử
 
Tham gia ngày: Nov 2010
Bài gửi: 2
:
kết nối 16f877a với ds1307 cần giúp đỡ

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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


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à 03:47 AM.


Đượ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