Cấu tạo bên trong DS1307 bao gồm một số thành phần như mạch nguồn, mạch dao động, mạch điều khiển logic, mạch giao điện I2C, con trỏ địa chỉ và các thanh ghi hay RAM.. Vì 7 thanh ghi đầu
TỔNG QUAN VỀ ĐỀ TÀI
Mục tiêu của đề tài
Nhằm phục vụ xem giờ, tính thời gian
Với mục tiêu nhằm thực hiện được những yêu cầu sau:
• Đồng hồ chạy đúng giờ
• Hiện thị nhiệt độ, độ ẩm.
Giới hạn và phạm vi của Chuyên đề
• Cảm biến nhiệt độ, độ ẩm DHT11
Nghiên cứu trên mô phỏng.
Nội dung thực hiện
Phương pháp nghiên cứu
● Áp dụng kiến thức đã học vào lập trình
● Sử dụng các tài liệu liên quan để hỗ trợ việc lập trình hệ thống
● Tham khảo ý kiến đóng góp của giảng viên hướng dẫn
● Thiết kế mô phỏng trên proteus
CƠ SỞ LÝ THUYẾT
Linh kiện điện tử, vi điều khiển và cảm biến
2.1.1.1 Sơ đồ chân và sơ đồ khối của PIC16F877A
Hình 2.1: Sơ đồ chân của vi điều khiển PIC 16F877A
Hình 2.2: Sơ đồ khối của vi điều khiển PIC16F877A
2.1.1.2 Tổ chức không gian bộ nhớ
Cấu trúc bộ nhớ của vi điều khiển PIC16F877A bao gồm bộ nhớ chương trình (Program memory) và bộ nhớ dữ liệu(Data memory) a Bộ nhớ chương trình
Hình 2.3: Bộ nhớ chương trình của PIC 16F877A
Bộ nhớ chương trình của vi điều khiển PIC16F877A là bộ nhớ flash có dung lượng 8K word (1 word = 14 bit), được chia thành nhiều trang từ page0 đến page3, giúp quản lý dữ liệu hiệu quả Bộ nhớ này có khả năng chứa tới 8.192 lệnh, vì mỗi lệnh sau mã hóa chiếm 1 word (14 bit) Để địa chỉ hóa chính xác trong bộ nhớ 8K word của chương trình, bộ đếm chương trình đóng vai trò quan trọng trong việc phân phối và truy cập dữ liệu nhanh chóng và chính xác.
Trong hệ thống vi điều khiển, bộ đếm chương trình (PC) có dung lượng 13 bit (PC), cho phép truy cập địa chỉ từ 0000h Khi vi điều khiển được reset, chương trình sẽ bắt đầu thực thi từ địa chỉ 0000h (Reset vector), còn khi xảy ra ngắt, bộ đếm chương trình sẽ chuyển sang địa chỉ 0004h (Interrupt vector) Bộ nhớ chương trình không bao gồm bộ nhớ stack và không được định địa chỉ bởi bộ đếm chương trình hoặc bộ nhớ stack, nhằm đảm bảo hoạt động chính xác của các chức năng xử lý câu lệnh Bên cạnh đó, hệ thống còn có bộ nhớ dữ liệu để lưu trữ thông tin cần thiết trong quá trình vận hành của vi điều khiển.
Bộ nhớ dữ liệu của PIC là bộ nhớ EEPROM được phân chia thành nhiều bank để tối ưu hóa quản lý và truy cập dữ liệu Cụ thể, với dòng PIC16F877A, bộ nhớ dữ liệu được chia thành 4 bank riêng biệt, mỗi bank có dung lượng nhất định, giúp nâng cao hiệu suất và khả năng mở rộng cho các ứng dụng lập trình vi điều khiển.
The 128-byte memory area includes Special Function Registers (SFRs) located in low address regions, which are essential for controlling specific hardware functions In addition, General Purpose Registers (GPRs) occupy the remaining address space within each bank, providing flexible data storage for various operations SFRs are frequently used to manage and monitor microcontroller peripherals, making them critical for efficient system control and performance.
Hình 2.5: Sơ đồ bộ nhớ dữ liệu của PIC16F877A
DS1307 là chip đồng hồ thời gian thực (RTC) hàng đầu của Dallas Semiconductor, được thiết kế để cung cấp chính xác thời gian hiện tại theo kiểu thời gian tuyệt đối, bao gồm các đơn vị như giây, phút, giờ Đây là linh kiện quan trọng trong các ứng dụng yêu cầu theo dõi thời gian chính xác, giúp đồng bộ các hệ thống điện tử Với khả năng hoạt động ổn định và độ chính xác cao, DS1307 ngày càng được ưa chuộng trong các dự án điện tử và thiết bị công nghiệp.
DS1307 là chip thuộc Maxim Integrated Products, gồm 7 thanh ghi 8-bit để lưu trữ thời gian gồm giây, phút, giờ, thứ trong tuần, ngày, tháng và năm Ngoài ra, DS1307 còn có 1 thanh ghi điều khiển ngõ ra phụ và 56 thanh ghi trống có thể sử dụng như RAM Giao diện đọc và ghi của DS1307 dựa trên giao tiếp nối tiếp I2C, giúp thiết kế ngoại hình rất đơn giản Chip này xuất hiện dưới hai dạng gói SOIC và DIP với 8 chân, phù hợp cho nhiều ứng dụng điện tử.
Hình 2.6: Hai gói cấu tạo chip DS1307
Các chân của DS1307 được mô tả như sau:
- X1 và X2: là 2 ngõ kết nối với 1 thạch anh 32.768KHz làm nguồn tạo dao động cho chip
- VBAT: cực dương của một nguồn pin 3V nuôi chip
- GND: chân mass chung cho cả pin 3V và Vcc
Vcc là nguồn cấp cho giao diện I2C, thường là 5V và được dùng chung với vi điều khiển để đảm bảo hoạt động ổn định Tuy nhiên, nếu Vcc không được cấp nguồn nhưng VBAT vẫn có điện, DS1307 vẫn hoạt động, nhưng sẽ không thể ghi hoặc đọc dữ liệu Quan trọng là cần cấp nguồn Vcc đúng chuẩn để đảm bảo chức năng của RTC hoạt động chính xác.
Trong mạch DS1307, chân SQW/OUT là một ngõ phụ tạo xung vuông (Square Wave / Output Driver) với tần số của xung có thể lập trình, tuy nhiên chân này không ảnh hưởng đến chức năng chính của đồng hồ thời gian thực DS1307 Do đó, khi kết nối mạch, chúng ta có thể bỏ trống chân SQW/OUT để tránh gây ảnh hưởng đến hoạt động của thiết bị.
- SCL và SDA là 2 đường giao xung nhịp và dữ liệu của giao diện I2C
Có thể kết nối DS1307 bằng một mạch điện đơn giản như trong hình 2.7
Hình 2.7: Mạch ứng dụng đơn giản của DS1307
Cấu tạo bên trong DS1307 bao gồm các thành phần chính như mạch nguồn, mạch dao động, mạch điều khiển logic, mạch giao tiếp I2C, con trỏ địa chỉ và các thanh ghi (hay RAM) Hầu hết các thành phần của DS1307 đều là các linh kiện “cứng”, giúp việc sử dụng chip đơn giản hơn, chủ yếu tập trung vào việc đọc và ghi các thanh ghi của chip Để điều khiển DS1307 hiệu quả, cần hiểu rõ cấu trúc các thanh ghi cũng như cách truy xuất chúng qua giao diện I2C Trong phần này, chúng ta sẽ tìm hiểu chi tiết về cấu trúc các thanh ghi của DS1307 và phương pháp truy xuất chúng qua giao diện I2C để phục vụ các dự án điều khiển bằng PIC.
Bộ nhớ DS1307 gồm 64 thanh ghi 8-bit, trong đó chỉ có 8 thanh ghi đầu dùng để quản lý thời gian (RTC), còn lại 56 thanh ghi có thể được sử dụng như RAM tạm thời Bảy thanh ghi đầu tiên chứa thông tin về thời gian gồm giây, phút, giờ, thứ, ngày, tháng và năm, và việc ghi giá trị vào các thanh ghi này cho phép cài đặt thời gian khởi động cho RTC, trong khi việc đọc các thanh ghi này phản ánh thời gian thực do chip tạo ra Khi khởi động, nếu ta ghi giá trị 42 vào thanh ghi “giây” và sau đó đọc lại sau 12 giây, kết quả sẽ là 54, phản ánh chính xác thời gian đã trôi qua Thanh ghi thứ 8 (CONTROL) là thanh ghi điều khiển tín hiệu ra SQW/OUT, tuy nhiên vì không sử dụng chân này, thanh ghi này có thể bỏ qua Tổ chức bộ nhớ của DS1307 được trình bày rõ ràng trong hình 2.8.
Hình 2.8: Tổ chức bộ nhớ của DS1307
Vì 7 thanh ghi đầu tiên là quan trọng nhất trong hoạt động của DS1307, chúng ta sẽ khảo sát các thanh ghi này một cách chi tiết Trước hết hãy quan sát tổ chức theo từng bit của các thanh ghi này như trong hình 2.9
Hình 2.9 trình bày cách tổ chức các thanh ghi thời gian, trong đó giá trị lưu trữ trong các thanh ghi được biểu diễn theo dạng BCD (Binary-Coded Decimal), nghĩa là mã nhị phân của các số thập phân Ví dụ, để thiết lập giá trị 42 cho thanh ghi MINUTES, ta chuyển đổi 42 sang mã BCD là 0x2A; tuy nhiên, do các thanh ghi này lưu trữ giá trị theo dạng BCD, nên cách gán giá trị phải phù hợp với định dạng này để đảm bảo chính xác trong quá trình xử lý dữ liệu thời gian.
Số 42 được tách thành hai chữ số 4 và 2, mỗi chữ số sau đó được đổi sang mã nhị phân 4-bit; 4 thành 0100 và 2 thành 0010 Ghép mã nhị phân của hai chữ số lại, ta thu được số BCD 8-bit là 01000010, tương ứng với giá trị 66 trong hệ thập phân Để thiết lập số phút 42 cho DS1307, cần ghi vào thanh ghi MINUTES giá trị 66 (mã BCD của 42) Trong thực tế lập trình, phần mềm thường sử dụng mã nhị phân thường, do đó cần viết chương trình chuyển đổi từ số thập phân sang BCD, đặc biệt khi hiển thị bằng LED 7 đoạn, vì số BCD giúp hiển thị chính xác từng chữ số Khi đọc thanh ghi MINUTES và thu được giá trị 66 (mã BCD của 42), ta có thể tách thành hai phần bằng cách sử dụng toán tử shift “>>” hoặc lệnh LSL, LSR trong asm để tách ra 4 và 2, rồi xuất trực tiếp ra LED 7 đoạn Nhờ vậy, quá trình hiển thị chữ số nhanh và dễ dàng, phù hợp để hiển thị bằng LED 7 đoạn nếu nối chúng trong cùng một PORT.
Trong hệ thống hiển thị số BCD, việc tách từng chữ số ra khỏi số nguyên không cần thiết, bạn chỉ cần xuất trực tiếp toàn bộ số ra PORT Điều này giúp quá trình hiển thị số dễ dàng hơn nhiều, vì không cần thực hiện các phép chia cho các cơ số như 10, 100, 1000, vốn tốn thời gian xử lý đáng kể như trong trường hợp số thập phân Việc này tiết kiệm thời gian và tối ưu hóa hiệu năng của hệ thống hiển thị số.
Thanh ghi giây (SECONDS) trong bộ nhớ của DS1307 có địa chỉ 0x00 là thanh ghi đầu tiên, trong đó bốn bit thấp chứa mã BCD của chữ số hàng đơn vị của giá trị giây Do chữ số hàng chục tối đa là 5 (không có giây 60), nên chỉ cần 3 bit (từ SECONDS6 đến SECONDS4) để mã hóa giá trị này Bit cao nhất trong thanh ghi này, là bit 7, giữ vai trò điều khiển và có tên riêng trong danh sách các thanh ghi của DS1307.
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG
3.1.1 Các yêu cầu chức năng
• Hiển thị giây, phút, giờ, thứ, ngày, tháng, năm lên LCD
• Hiện thị nhiệt độ, độ ẩm
3.1.2 Các yêu cầu phi chức năng
3.2.1 Thiết kế phần cứng cho hệ thống a) Sơ đồ khối
Vi điều khiển giao tiếp với module đồng hồ DS1307 để lấy thời gian chính xác và kết nối với cảm biến DHT11 để đo nhiệt độ và độ ẩm môi trường Hệ thống gửi và nhận tín hiệu phản hồi từ DS1307 và DHT11 nhằm đảm bảo dữ liệu được truyền đạt chính xác Các dữ liệu về thời gian, nhiệt độ và độ ẩm sau đó được hiển thị rõ nét lên màn hình LCD, giúp người dùng dễ dàng theo dõi các thông số môi trường một cách trực quan và thuận tiện.
Hình 3.2: Sơ đồ nguyên lý hệ thống
Hệ thống có các khối để thực hiện các chức năng riêng:
• Khối vi điều khiển : Là khối quan trọng nhất, xử lý và điều hành toàn bộ các khối còn lại
• Khối hiển thị: Có chức năng hiện thị nội dung của hệ thống
• Khối phím chức năng: Có chức năng chỉnh ngày, giờ, báo thức
• Khối thời gian thực DS1307: Đếm ngày tháng theo thời gian thực
• Khối cảm biến : Để nhận biết nhiệt độ và độ ẩm môi trường gửi về VDK để xử lý
• Khối cảnh báo: Để báo thức khi đến giờ
3.2.2 Thiết kế phần mềm cho hệ thống
Hình 3.3: Lưu đồ thuật toán
Mô tả hoạt động của hệ thống:
Hệ thống nhận nguồn cấp, sẽ tự động đọc và hiển thị thời gian, nhiệt độ, độ ẩm lên màn hình LCD để người dùng dễ dàng theo dõi Tiếp theo, hệ thống kiểm tra các phím điều khiển có được nhấn hay không, nhằm xác định thao tác của người dùng để thực hiện các chức năng tiếp theo Khi nút điều khiển được nhấn, hệ thống sẽ xử lý lệnh tương ứng nhằm mang lại trải nghiệm nhập liệu dễ dàng và chính xác.
Nút Mode cho phép người dùng điều chỉnh các thông số thời gian như giờ, phút, giây, ngày, tháng và năm Người dùng chỉ cần nhấn nút một lần để chỉnh giờ, tiếp tục nhấn để chỉnh phút, giây, ngày, tháng, năm, và lần thứ bảy để lưu lại tất cả các dữ liệu đã điều chỉnh và thoát khỏi chế độ chỉnh giờ.
• Nút set: bật chế độ báo thức Chỉnh thời gian muốn để báo thức
• Nút tăng: Tăng các giá trị tương ứng (giờ, phút, giây, ngày, tháng, năm)
• Nút giảm: Giảm các giá trị tương ứng (giờ, phút, giây, ngày, tháng, năm)
Khi thời gian thực khớp với thời gian đã thiết lập trong báo thức, báo thức sẽ bắt đầu gây tiếng còi Tiếng còi sẽ tiếp tục phát ra cho đến khi người dùng nhấn nút đặt lại hoặc tắt báo thức Để đảm bảo báo thức hoạt động chính xác, người dùng cần chú ý chỉnh thời gian phù hợp và thao tác tắt đúng cách khi báo thức báo.
CHƯƠNG 4: TÍCH HỢP VÀ ĐÁNH GIÁ HỆ THỐNG
4.1 Xây dựng và tích hợp hệ thống
Trong chương trình đã được định nghĩa các chân điều khiển và các chân tín hiệu chính xác với phần cứng
4.2 Kiểm thử và đánh giá hệ thống
• Kiểm tra các chức năng của hệ thống
• Đo nhiệt độ môi trường và kiểm tra với hệ thống Đánh giá hệ thống:
• Hiện thị được thời gian, nhiệt độ và độ ẩm
4.3 Hướng dẫn vận hành hệ thống
• 4 nút điều khiển để chỉnh và đặt báo thức
Kết quả đạt được của đề tài
• Biết cách giao tiếp với pic16F877a
• Xử lý tín hiệu với các cảm biến DHT11
• Tự tay làm được 1 sản phẩm nhúng
Hạn chế của đề tài
Còn thiếu nhiều chức năng Phân tích hệ thống chưa hoàn thiện do đề tài có 1 số chức năng đơn giản Kỹ thuật lập trình còn là cơ bản.