Ðăng Nhập

View Full Version : Code về đồng hồ DS1307


qloi
10-10-2012, 03:41 PM
hôm nọ có bạn hỏi mình về code đồng hồ sử dụng ds1307 trên yahoo mà mình quên mất nick zậy ai cần thì pm mình gởi qua cho.dạo này chỉ vào diễn đàn bằng di động nên không post đc

thanhtrungdt
10-10-2012, 10:35 PM
mình cũng đang làm đồ án ,mình rất muốn tham khảo code của bạn,bạn có thể gửi cho mình tam khảo được chứ,mail của mình la ''thanhtrungkhongcogikho@yahoo.com.vn ''nhe.
thank bạn nhiều.
SẴN ĐÂY MÌNH MUỐN NHỜ BẠN,XEM HỘ MÌNH ĐOAẠN CODE SAU ĐƯƠC KO AH,MÌNH ĐỌC MẠI MÀ CHƯA HIỂU LẮM

void read_ds1307()
{
i2c_start(); //Goi bit star tu master toi slave
i2c_write(0xD0); //Gui dia chi cua slave,thiet lap chdo truyen d_lieu vao ds1307
i2c_write(0x01); //thiet lap vi tri con tro - set register pointer
i2c_stop(); // Goi bit stop thu master toi slave

i2C_start();
i2C_write(0xD1); //gui lenh doc du lieu
sec=i2c_read(1); //Bat dau doc du lieu tu vi tri Con tro,Doc sec
min=i2c_read(1);
hour=i2c_read(1); //che do gio la 12h. Loai bo bit5 va bit6 dung lenh AND
dow=i2c_read(1); //bit5=AM/PM
date=i2c_read(1); //bit6=12/24
month=i2c_read(1);
year=i2c_read(1);
thu=i2c_read(0);//so(0)la de VDK biet YEAR la d_lieu cuoi
i2c_stop();
//(2)
//----------------------------------------Chuyen BCD sang Nhi Phan---------------------------------------
sec1=sec&0x0F;
sec2=(sec&0x70)>>4;
min1=min&0x0F;
min2=(min&0x70)>>4;
hour1=hour&0x0F;
hour2=(hour&0x30)>>4;
date1=date&0x0F;
date2=(date&0x30)>>4;
month1=month&0x0F;
month2=(month&0x10)>>4;
year1=year&0x0F;
year2=(year&0xF0)>>4;
}

CHỖ ĐOẠN DỊCH 4 BÍT ĐÓ BẠN,DỊCH ĐỂ LÀM GÌ VẬY,CÁC GIÁ TRỊ NHƯ 0X0F,0X70,0X30 LẤY Ở ĐÂU RA VẬY AH,RẤT MONG NHẬN ĐƯỢC SỰ GIÚP ĐỠ CỦA MỌI NGƯỜI.
THANK

thanhtrungdt
10-10-2012, 10:44 PM
mình cũng đang làm đồ án ,mình rất muốn tham khảo code của bạn,bạn có thể gửi cho mình tam khảo được chứ,mail của mình la ''thanhtrungkhongcogikho@yahoo.com.vn ''nhe.
thank bạn nhiều.
SẴN ĐÂY MÌNH MUỐN NHỜ BẠN,XEM HỘ MÌNH ĐOAẠN CODE SAU ĐƯƠC KO AH,MÌNH ĐỌC MẠI MÀ CHƯA HIỂU LẮM

void read_ds1307()
{
i2c_start(); //Goi bit star tu master toi slave
i2c_write(0xD0); //Gui dia chi cua slave,thiet lap chdo truyen d_lieu vao ds1307
i2c_write(0x01); //thiet lap vi tri con tro - set register pointer
i2c_stop(); // Goi bit stop thu master toi slave

i2C_start();
i2C_write(0xD1); //gui lenh doc du lieu
sec=i2c_read(1); //Bat dau doc du lieu tu vi tri Con tro,Doc sec
min=i2c_read(1);
hour=i2c_read(1); //che do gio la 12h. Loai bo bit5 va bit6 dung lenh AND
dow=i2c_read(1); //bit5=AM/PM
date=i2c_read(1); //bit6=12/24
month=i2c_read(1);
year=i2c_read(1);
thu=i2c_read(0);//so(0)la de VDK biet YEAR la d_lieu cuoi
i2c_stop();
//(2)
//----------------------------------------Chuyen BCD sang Nhi Phan---------------------------------------
sec1=sec&0x0F;
sec2=(sec&0x70)>>4;
min1=min&0x0F;
min2=(min&0x70)>>4;
hour1=hour&0x0F;
hour2=(hour&0x30)>>4;
date1=date&0x0F;
date2=(date&0x30)>>4;
month1=month&0x0F;
month2=(month&0x10)>>4;
year1=year&0x0F;
year2=(year&0xF0)>>4;
}

CHỖ ĐOẠN DỊCH 4 BÍT ĐÓ BẠN,DỊCH ĐỂ LÀM GÌ VẬY,CÁC GIÁ TRỊ NHƯ 0X0F,0X70,0X30 LẤY Ở ĐÂU RA VẬY AH,RẤT MONG NHẬN ĐƯỢC SỰ GIÚP ĐỠ CỦA MỌI NGƯỜI.
THANK

quangsangpro
11-10-2012, 01:11 AM
hoquangsangspkt@gmail.com hôm trước em có hỏi anh.

qloi
11-10-2012, 10:24 PM
mình cũng đang làm đồ án ,mình rất muốn tham khảo code của bạn,bạn có thể gửi cho mình tam khảo được chứ,mail của mình la ''thanhtrungkhongcogikho@yahoo.com.vn ''nhe.
thank bạn nhiều.
SẴN ĐÂY MÌNH MUỐN NHỜ BẠN,XEM HỘ MÌNH ĐOAẠN CODE SAU ĐƯƠC KO AH,MÌNH ĐỌC MẠI MÀ CHƯA HIỂU LẮM

void read_ds1307()
{
i2c_start(); //Goi bit star tu master toi slave
i2c_write(0xD0); //Gui dia chi cua slave,thiet lap chdo truyen d_lieu vao ds1307
i2c_write(0x01); //thiet lap vi tri con tro - set register pointer
i2c_stop(); // Goi bit stop thu master toi slave

i2C_start();
i2C_write(0xD1); //gui lenh doc du lieu
sec=i2c_read(1); //Bat dau doc du lieu tu vi tri Con tro,Doc sec
min=i2c_read(1);
hour=i2c_read(1); //che do gio la 12h. Loai bo bit5 va bit6 dung lenh AND
dow=i2c_read(1); //bit5=AM/PM
date=i2c_read(1); //bit6=12/24
month=i2c_read(1);
year=i2c_read(1);
thu=i2c_read(0);//so(0)la de VDK biet YEAR la d_lieu cuoi
i2c_stop();
//(2)
//----------------------------------------Chuyen BCD sang Nhi Phan---------------------------------------
sec1=sec&0x0F;
sec2=(sec&0x70)>>4;
min1=min&0x0F;
min2=(min&0x70)>>4;
hour1=hour&0x0F;
hour2=(hour&0x30)>>4;
date1=date&0x0F;
date2=(date&0x30)>>4;
month1=month&0x0F;
month2=(month&0x10)>>4;
year1=year&0x0F;
year2=(year&0xF0)>>4;
}

CHỖ ĐOẠN DỊCH 4 BÍT ĐÓ BẠN,DỊCH ĐỂ LÀM GÌ VẬY,CÁC GIÁ TRỊ NHƯ 0X0F,0X70,0X30 LẤY Ở ĐÂU RA VẬY AH,RẤT MONG NHẬN ĐƯỢC SỰ GIÚP ĐỠ CỦA MỌI NGƯỜI.
THANK

sec1,sec2,min1,min2,... là các biến nhằm tách biến sec,min ra làm 2 số riêng biệt để hiển thị trên từng led 7đoạn.data đọc ra từ ds1307 là mã BCD(chắc bạn biết BCD là gì nhỉ,hiểu đơn giản ví dụ đọc ra 31 giây thì dử liệu sẽ biểu diễn dưới dạng 0x31,nếu giữ nguyên dữ liệu này cho PIC đọc và hiển thị thì sẽ sai vì 31h = 49dec=>trật lất.do đó khi tách ra lam 2 số,số hàng đơn vị sẽ AND với 0x0f(0b00001111) như thế sẽ tách được số đơn vị ra.Còn số hàng chục AND với 70h(01110000b) do hàng chục có thể đếm tối đa đến "5"(101b) nên chỉ cần 3bit cao là được các bít thấp =0 để tách bỏ số hàng đơn vị đã thực hiện ở trên,bạn thử ngồi ngẫm lại xem đúng k,sau đó dịch 4 lần để đưa giá tri đó về trọng số thấp(ví dụ số hàng chục=3 , 3(0011 AND(bit cao) 01110000 = 00110000) là 30h mà số mình cần lấy là 3 để hiển thị lên led hàng chục thị dich phai 4 lần của 30h sẽ được 03h(số 3).Các biến còn lại cũng tương tự ví dụ như giờ AND 30h vì giờ tối đa chỉ đến 23h(00100011b) nên phải AND với 30h(00110000b) để lấy hết giá trị tối đa của hàng chục giờ.Oke hiểu rồi nhá ;)

qloi
11-10-2012, 10:39 PM
gởi code cho các bác rùi nhá

toancdt
12-10-2012, 08:10 PM
gởi code cho các bác rùi nhá

cho mình xin code với bạn ơi! toancdt09@gmail.com

nhocyhang
12-11-2012, 11:19 AM
cho mình xin code với nhochung757@gmail.com

tienrau2
30-11-2012, 02:49 PM
cho mình xin code với nha
mình mới tập tành thôi ah

tienrau2@gmail.com

tienrau2
30-11-2012, 02:50 PM
gởi code cho các bác rùi nhá

cho mình xin code với nha
mình mới tập tành thôi ah :)

tienrau2@gmail.com

lequockha
21-12-2012, 07:39 PM
hôm nọ có bạn hỏi mình về code đồng hồ sử dụng ds1307 trên yahoo mà mình quên mất nick zậy ai cần thì pm mình gởi qua cho.dạo này chỉ vào diễn đàn bằng di động nên không post đc
cho tớ xin được không..nếu bạn đọc được thì gửi qua cho mình mail:lequockha@gmail.com
thanks bạn nhìu

tvhai1701
23-12-2012, 10:19 AM
em đang cần tài liệu encodor để làm đồ án trên plc mitsubishi. anh chị nào có tài liệu về encodor bộ đếm sung tốc độ cao. và encodor tương đối và tuyệt đối thì gưi mail cho em nha. tvhai1701@gmail.com thanks mọi người

qloi
17-01-2013, 06:21 PM
gởi code cho các bác đến sau rồi nhá :)

lamnhatquan91
17-01-2013, 11:30 PM
cho mình xin code với bạn ơi . lamnhatquan47@gmail.com .
thank nhiều nha !!!

qloi
21-01-2013, 09:46 AM
dạo này khá bận mà thấy mấy bác xin code nhiều nên mình post luôn code lên đây lun. code này viết ở dạng giản lược chỉ sử dụng có 2 nút và hiển thị giờ phút giây, các bác có thể phát triển thêm, có gì không biết post lên đây mình sẽ trả lời , một nút mode để vào chế độ chỉnh giờ và một nút incre để tăng giá trị(không có nút decre) khi tăng tới giới hạn nó sẽ trở về 0 lại. nếu mún thêm nút các bác có thể bổ sung thêm nha.

kiniemxua88
11-04-2013, 09:58 AM
mấy anh ơi! có thể upload phần mô phỏng cho bài code 1307.rar lên luôn không? tại em mới tìm hiểu về pic muốn cỏ cả phần mô phỏng để đọc code cho dễ hiểu. cám ơn nhiều.

vansondv
28-04-2013, 01:58 PM
hôm nọ có bạn hỏi mình về code đồng hồ sử dụng ds1307 trên yahoo mà mình quên mất nick zậy ai cần thì pm mình gởi qua cho.dạo này chỉ vào diễn đàn bằng di động nên không post đc

mình đang cần ,bạn có thể share qua mail mình la : vanson.10dv@gmail.com
cảm ơn bạn.

kehamch00i
16-05-2013, 06:16 PM
anh qloi ơi cho em hỏi bài ds1307 của anh ko hiển thị trên cại j ak ???? e ko hiểu lắm

qloi
30-05-2013, 10:52 PM
anh qloi ơi cho em hỏi bài ds1307 của anh ko hiển thị trên cại j ak ???? e ko hiểu lắm

Hiển thị trên 3 cặp led 7đoạn đó bạn. ở hàm read_time() các biến dig1 - dig6 mỗi cái tương ứng với 1 con led 7đoạn đó. bạn không hiểu chổ nào?

qloi
30-05-2013, 10:56 PM
mình đang cần ,bạn có thể share qua mail mình la : vanson.10dv@gmail.com
cảm ơn bạn.

Bạn qua trang đầu tải nha

duydien187
12-06-2013, 11:28 AM
e dùng con MCU không có giao tiếp i2c sẵn nên em phải viết hàm cho nó.. em gặp 1 vân đề là
seconds = i2c_read(); // doc du lieu tai dia chi 0x02
//minutes = i2c_read(); // doc du lieu tai dia chi 0x03
//hours = i2c_read(); // doc du lieu tai dia chi 0x04
//day = i2c_read(); // year/day 0x05
//month = i2c_read(); // weekday/month 0x06
no co hien giá trị đúng nhung no nhay loan con thêm
seconds = i2c_read(1); // doc du lieu tai dia chi 0x02
//minutes = i2c_read(1); // doc du lieu tai dia chi 0x03
//hours = i2c_read(1); // doc du lieu tai dia chi 0x04
//day = i2c_read(1); // year/day 0x05
//month = i2c_read(0); // weekday/month 0x06
thì no bao lỗi chỗ sô 1 đó..tai em phải viết cả hàm i2c
mong cac bac chi giáo

qloi
20-06-2013, 08:21 PM
e dùng con MCU không có giao tiếp i2c sẵn nên em phải viết hàm cho nó.. em gặp 1 vân đề là
seconds = i2c_read(); // doc du lieu tai dia chi 0x02
//minutes = i2c_read(); // doc du lieu tai dia chi 0x03
//hours = i2c_read(); // doc du lieu tai dia chi 0x04
//day = i2c_read(); // year/day 0x05
//month = i2c_read(); // weekday/month 0x06
no co hien giá trị đúng nhung no nhay loan con thêm
seconds = i2c_read(1); // doc du lieu tai dia chi 0x02
//minutes = i2c_read(1); // doc du lieu tai dia chi 0x03
//hours = i2c_read(1); // doc du lieu tai dia chi 0x04
//day = i2c_read(1); // year/day 0x05
//month = i2c_read(0); // weekday/month 0x06
thì no bao lỗi chỗ sô 1 đó..tai em phải viết cả hàm i2c
mong cac bac chi giáo

Cụ thể bạn xài vxl nào thế. đa số mấy dòng vđk mới điều hổ trợ i2c. theo cách viết giao tiếp i2c trên của bạn là sai rồi, nếu bạn có koi cái code của tui gởi ở trên thì:

void write_rtc(byte address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0xd0);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xd0);
while(status==1)
{
i2c_start();
status=i2c_write(0xd0);
}
}

các hàm bên trong hàm write_rtc(byte address, BYTE data) là các hàm do ccs tạo sẳn nếu để thực hiện được một lệnh wrirte_rtc(byte address, BYTE data) (lệnh này là viết một data lên địa chỉ address của ds1307) thì cần thực hiện theo thứ tự một loạt các lệnh tạo sẳn ở trong đó.vậy bạn phải xây dựng các lệnh nhỏ ở trong đó để tạo một bộ i2c ảo cho con vxl của bạn. bạn tham khao tại http://www.dientuvietnam.net/forums/vi-dieu-khien-ho-8051-53/hoi-giao-tiep-i2c-ds1307-voi-8051-a-134648/.
sau khi xây dựng được các hàm đó bạn có thể dụa theo code mẫu của mình để đọc các biến giờ, phút , giây theo các địa chỉ của 1307!

ngo_huy_binh
09-09-2013, 10:52 PM
anh ơi tiện thể post luôn file mô phỏng lên đi anh. nhìn code k khó hiểu lắm

qloi
21-09-2013, 02:19 PM
anh ơi tiện thể post luôn file mô phỏng lên đi anh. nhìn code k khó hiểu lắm

Mình không có file mô phỏng bạn ơi. Cái này mình viết theo yêu cầu của một bạn trên diễn đàn nên mình chỉ viết code mà không vẽ sơ đồ mô phỏng. Bạn cứ bắt đầu đọc code từ hàm main() theo thứ tự từ trên xuống là hiêu cách hoạt động của nó liền. Nếu vẽ mạch mô phỏng thì khả năng mô phỏng dduocj không cao lắm do đây là mạch giao tiếp i2c tốc độ thực thi lệnh rất cao nên khả năng proteus đáp ứng rất chậm sẽ không mô phỏng chính xác được hoạt mạch sẽ hoạt động sai. Cách tốt nhất là làm mạch thực nghiệm để test bảo đảm chạy ngay. Có thời gian mình sẽ vẽ mạch để post cho các bác.