Xin chào các bạn!Trong bài viết này bản thân xin hướng dẫn các bạn giao tiếp cùng với IC thời hạn thực DS1307 áp dụng Atmega16. Project chạy xe trên KIT AVR V4.

Bạn đang xem: Giao tiếp ds1307 với 8051

Chú ý : Source code nội dung bài viết dưới trên đây được biên dịch bởi phần mềm CodeVisionAVR để biên dịch code không lỗi xin sung sướng Download bản CodeVisionAVR trên Đây

I.MÔ TẢ PHẦN CỨNG Kit AVR V4 hỗ trợ cho chúng ta khối IC thời hạn thực DS1307 bao gồm sơ đồ nguyên tắc như sau:

*

Các chân liên kết với Atmega16:

Chân SCL à PORTC0Chân SDA à PORTC1

Các thông số kỹ thuật của DS1307:

Điện áp hoạt động: 5V​Sử dụng nguồn Pin 3V bên ngoài khi mất điện.​Giao tiếp theo chuẩn chỉnh I2C.​Có 56 Byte RAM trống để người dùng tùy ý sử dụng.​Có thể xuất ra được xung gồm tần số 1Hz, 4.096KHz, 8.192KHz, 32.768KHz.​

Tên và chức năng các chân của DS1307:

*

DS1307 tất cả 7 thanh ghi (0x00 – 0x06) chứa tin tức về thời hạn của đồng hồ và 1 thanh ghi (0x07) thực hiện để điều khiển xung ra trên chân SQW/OUT. Tiếp xúc với DS1307 có nghĩa là ghi quý hiếm và đọc những thanh ghi này, các thanh ghi này sẽ chứa mã BCD của những giá trị:

*

Tên và công dụng các thanh ghi thời gian của DS1307:

*

Thanh ghi CONTROL (0x07):

*

Trong đó:

OUT: lựa chọn mức ngắn gọn xúc tích xuất ra tại chân SQW/OUT khi chức năng SQW không được kích hoạt (SQW=0).

Xem thêm: Màn Hình S7 Edge Bị Sọc Ngang, Cách Đơn Giản Khắc Phục S7 Edge Bị Sọc Ngang


 OUT = 1: xuất ra mức xúc tích và ngắn gọn 1​
 OUT = 0: xuất ra mức súc tích 0​
SQW: = 1, chất nhận được tạo xung vuông ra bên trên chân SQW/OUT, tần số xung vuông được thiết lập bởi RS0, RS1:

*

II.LẬP TRÌNH PHẦN MỀM

Để giao tiếp với DS1307, ta sử dụng chuẩn chỉnh giao tiếp I2C (các bạn xem thêm Driver I2C trong file đính kèm).Các cách để Ghi/Đọc thời gian với DS1307:

*

Các bạn áp dụng hàm void DS1307_SetTime(uint8_t Hour, uint8_t Minute, uint8_t Second) để thiết đặt thời gian mang lại DS1307:

void DS1307_SetTime(uint8_t Hour, uint8_t Minute, uint8_t Second) DS1307_WriteData(DS1307_ADDR_SECOND,Second); DS1307_WriteData(DS1307_ADDR_MINUTE,Minute); DS1307_WriteData(DS1307_ADDR_HOUR,Hour);Các bạn thực hiện hàm void DS1307_GetTime(uint8_t *Hour, uint8_t* Minute, uint8_t* Second)để rước giá trị thời hạn từ DS1307:

void DS1307_GetTime(uint8_t *Hour, uint8_t* Minute, uint8_t* Second) *Hour = DS1307_ReadData(DS1307_ADDR_HOUR); *Minute = DS1307_ReadData(DS1307_ADDR_MINUTE); *Second = DS1307_ReadData(DS1307_ADDR_SECOND);Các bạn thông số kỹ thuật GPIO:

PORTC3:5 (các chân điều khiển và tinh chỉnh LCD16x2), PORTB4:7 (các chân tài liệu LCD16x2) là OUTPUT với mức xúc tích đầu ra ban sơ là nấc 1.​PORTC0:1 (chân Clock với Data của DS1307) là OUTPUT.​

// Port B initialization// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In// State7=1 State6=1 State5=1 State4=1 State3=T State2=T State1=T State0=TPORTB=0xF0;DDRB=0xF0; // Port C initialization// Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=In Func1=Out Func0=Out// State7=T State6=T State5=1 State4=1 State3=1 State2=T State1=0 State0=0PORTC=0x38;DDRC=0x3B;
Chương trình chính đọc thời hạn và hiển thị lên LCD16x2:

LCD16X2_Init(); // Khoi tao LCD16X2DS1307_Init();DS1307_SetControl(1,DS1307_SQW_1Hz);if(FlagSetTime) DS1307_SetTime(11,15,0); FlagSetTime=0;LCD16X2_Gotoxy(0,0);LCD16X2_Puts(" DS1307 AVR V4 ");while (1) DS1307_GetTime(&Hour,&Min,&Sec); sprintf(Str,"Time: %2u-%2u-%2u",Hour,Min,Sec); LCD16X2_Gotoxy(0,1); LCD16X2_Puts(Str); delay_ms(200);