[HỌC AVR] BÀI 7: GIAO TIẾP IC THỜI GIAN THỰC DS1307

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

Chú ý : Source code bài viết dưới đây được biên dịch bằng phần mềm CodeVisionAVR để biên dịch code không lỗi xin vui lòng Download bản CodeVisionAVR Tại Đây

I.MÔ TẢ PHẦN CỨNG  Kit AVR V4 cung cấp cho các bạn khối IC thời gian thực DS1307 có sơ đồ nguyên lý như sau:

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

  • Chân SCL à PORTC0
  • Châ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 I2C.​
  • Có 56 Byte RAM trống để người dùng tùy ý sử dụng.​
  • Có thể xuất ra được xung có 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 có 7 thanh ghi (0x00 – 0x06) chứa thông tin về thời gian của đồng hồ và 1 thanh ghi (0x07) sử dụng để điều khiển xung ra tại chân SQW/OUT. Giao tiếp với DS1307 tức là ghi giá trị và đọc các thanh ghi này, các thanh ghi này sẽ chứa mã BCD của các giá trị:

Tên và chức năng các thanh ghi thời gian của DS1307:

Thanh ghi CONTROL (0x07):

Trong đó:

  • OUT: lựa chọn mức logic xuất ra tại chân SQW/OUT khi chức năng SQW không được kích hoạt (SQW=0).
 OUT = 1: xuất ra mức logic 1​  OUT = 0: xuất ra mức logic 0​
  • SQW: = 1, cho phép tạo xung vuông ra 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 giao tiếp I2C (các bạn tham khảo Driver I2C trong file đính kèm). Các bước để Ghi/Đọc thời gian với DS1307:

Các bạn sử dụng hàm void DS1307_SetTime(uint8_t Hour, uint8_t Minute, uint8_t Second) để cài đặt thời gian cho 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 sử dụng hàm void DS1307_GetTime(uint8_t *Hour, uint8_t* Minute, uint8_t* Second)để lấy giá trị thời gian 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 cấu hình GPIO:

  • PORTC3:5 (các chân điều khiển LCD16x2), PORTB4:7 (các chân dữ liệu LCD16x2) là OUTPUT với mức logic đầu ra ban đầu là mức 1.​
  • PORTC0:1 (chân Clock và 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=T PORTB=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=0 PORTC=0x38; DDRC=0x3B;

Chương trình chính đọc thời gian và hiển thị lên LCD16x2:

LCD16X2_Init(); // Khoi tao LCD16X2 DS1307_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); }

Code các hiệu ứng tham khảo ở file code đính kèm. TẠI ĐÂY

Tags: arduinoatmega16CodeVisionAVRds1307

Từ khóa » Chân Ds1307