Lưu đồ chương trình chính

Một phần của tài liệu Thiết kế mạch đồng hồ số dùng VDK 16f887 (Trang 34 - 52)

29 Hình 3.13 là lưu đồ giải thuật chương trình chính của hệ thống, đầu tiên khởi tạo các Port, khởi tạo LCD và ghi dữ liệu vào DS1307. Việc ghi dữ liệu vào DS chỉ một lần và sau đó việc ghi được triển khai khi chỉnh các giá trị thời gian. Tiếp theo tiến hành đọc các dữ liệu từ DS1307 và cảm biến nhiệt độ, độ ẩm DHT11, sau đó gọi hàm kiểm tra nút nhấn menụ Khi menu chính được hiển thị thì các nút nhấn khác không được sử dụng ngoại trừ nút nhấn menu, điều này được điều khiển bằng biến ht. Biến tt_chinh được sử dụng với giá trị 1 khi chỉnh thứ ngày tháng năm, với giá trị 2 khi chỉnh giờ phút giâỵ Khi chỉnh các giá trị này phải được hiển thị liên tục để cập nhật thời gian từ DS1307. Để thiết lập báo thức, đầu tiên cần so sánh các giá trị để tìm được thời gian có giá trị gần với thời gian hiện tại nhất, điều này được thực hiện trong chương trình con ss_bthuc(). Khi thời gian báo thức bằng với thời gian hiện tại thì sẽ báo hiệu giờ báo thức bằng chương trình con bao_thuc() và cuối cùng thời gian báo thức được cập nhật liên tục lên DS1307. Các chương trình hiển thị chức năng trên LCD theo các mode như bảng 3.2 bên dướị

STT Tên Mode Giao diện hiển thị

0 Menu chính 1 Menu chọn chức năng 2 Menu chỉnh thứ ngày tháng năm 3 Menu chỉnh giờ phút giây

30 4 Menu danh sách báo thức 5 Menu lựa chọn báo thức 6 Menu chỉnh báo thức

Bảng 3. 2: các giao diện sử dụng trong mạch đồng hồ số

31

32 Hình 3.14 là chương trình con của nút nhấn menu có chống dộị Khi có tín hiệu nút nhấn và sau khi chống dội, xóa màn hình lcd và reset các biến trạng thái về trạng thái khởi tạọ Khi đảo trạng thái của biến ht thì sẽ luân phiên thay đổi trạng thái hiển thị giữa menu chính và menu chức năng.

33

3.5.3 Chương trình con nut_up() và nut_dw()

34 Hình 3.15 là lưu đồ giải thuật của hai chương trình con nut_up() và nut_dw(). Hai chương trình này tương tự nhau đều giúp cập nhật biến sel, vt và tăng giảm các giá trị thời gian. Biến sel là biến lựa chọn vị trí con trỏ trên lcd và cũng là lựa chọn chức năng muốn sử dụng. Biến vt có chức năng xác định vị trí của báo thức trong menu danh sách báo thức. Giá trị con trỏ hàm là giá trị của địa chỉ mà con trỏ đang trỏ tới cũng chính là gọi chương trình hiển thị, việc này giúp đơn giản chương trình hơn. Trong lưu đồ có hai chương trình con là chinh_tang() và chỉnh_giam() được cụ thể trong lưu đồ bên dướị

Hình 3. 16: lưu đồ chương trình chinh_tang()

Lưu đồ chương trình con chinh_tang() như hình 3.16, trong chương trình sử dụng biến giatri_mod để chọn thời gian muốn tăng lên, có 9 giá trị tương ứng với 9 giá trị thời gian. Sau khi tăng các giá trị thời gian, các giá trị sẽ được cập nhật lên bộ nhớ của DS1307.

35

Hình 3. 17: lưu đồ chương trình chinh_giam()

Tương tự với chương trình con chinh_tang(), chương trình con chinh_giam() giúp

giảm các giá trị thời gian tương ứng với giatri_mod và cập nhật lên DS1307 ngay sau đó.

36

3.5.4 Chương trình con nut_right()

37 Chương trình con nut_right() như hình 3.18, sau khi chống dội nút nhấn, màn hình lcd sẽ được xóạ Tiến hành kiểm tra biến tt_chinh để xác định đang ở mode chỉnh nàọ Nếu tt_chinh =1 lúc này đang ở mode chỉnh các giá trị thứ ngày tháng năm và có thể sử dụng nút right để chuyển các giá trị tương ứng với giatri_mod. Tương tự như vậy, khi

tt_chinh=2 ở mode chỉnh các giá trị giờ phút giây, khi tt_chinh=3 thì mode ở trạng thái

chỉnh báo thức. Nếu không ở 1 trong 3 mode trên thì hệ thống hoạt động với các chức năng không chỉnh sửa thời gian. Biến xác định các trạng thái menu là tt_mode có giá trị từ 0 đến 4 và gọi chương trình con là hienthi_right(). Ở hai giá trị tt_chinh 4 và 5 là bật và tắt báo thức. Mỗi khi nhấn nút sẽ reset lại các giá trị sel và vt, sau đó gọi chương trình hiển thị bằng con trỏ hàm.

38

39 Hình 3.19 là chương trình con hienthi_right() trong chương trình con nut_right(). Khi

tt_mode=2, chương trình đang ở menu chọn chức năng, thơng qua biến sel có thể lựa chọn được chức năng cần sử dụng và thiết lập các tt_chinh tương ứng. Nếu tt_mode=3 con trỏ sẽ trỏ tới menu lựa chọn báo thức. Ngược lại, nếu tt_mode=4, sẽ lựa chọn được các chức năng trong menu lựa chọn báo thức.

40

3.5.5 Chương trình con nut_left()

41 Cũng giống như nut_right(), chương trình con nut_left() cũng dựa vào tt_chinh và

tt_mode để xác định các chức năng đang sử dụng. Ở tt_chinh=3, khi giatri_mod<8 lúc

này hệ thống sẽ trở lại giao diện trước đó nên giá trị tt_mode được gán bằng 3 và gọi chương trình con hienthi_left để cập nhật. Khi tt_chinh không bằng 1, 2 hoặc 3, mạch

không hoạt động ở chứ năng chỉnh thời gian nữa nên cập nhật giá trị cho tt_mode và reset các biến về giá trị khởi tạọ Sau đó gọi chương trình con hienthi_left() để cập nhật trạng tháị

Hình 3. 21: lưu đồ chương trình hienthi_left()

Hình 3.21 là lưu đồ của chương trình con hienthi_left(), khi trạng thái tt_mode=3 thì con trỏ hàm được gán bằng địa chỉ menu lựa chọn báo thức, khi bằng 2 thì được gán bằng địa chỉ menu danh sách báo thức và khi bằng 1 thì được gán bằng địa chỉ menu lựa chọn chức năng.

42

3.5.6 Chương trình con ss_bthuc()

43 Hình 3.22 là lưu đồ giải thuật của chương trình con ss_bthuc(), chương trình chạy trong 6 vịng lặp k, nếu báo thức tại vị trí OFF thì lệnh continue; sẽ đến vòng lặp tiếp theo và bỏ qua báo thức tại đó. Đầu tiên để so sáng thì ta thiết lập các giá trị, nếu giờ báo thức trong mảng nhỏ hơn thời gian hiện tại thì sẽ được cộng 0x24. Điều này dành cho trường hợp khi chuyển giao giữa đêm và sáng, ví dụ khi giờ hiện tại là 0x22, giờ báo thức thứ k là 0x01 thì việc cộng lên sẽ giúp 0x01 lớn hơn 0x22 và từ đó lấy được khoảng cách giữa 0x22 và 0x01. Tượng tự cho giá trị phút trong mảng, tuy nhiên phút sẽ cộng thêm 0x60. Hai giá trị này sẽ được lưu vào trong hai biến là g, p. Tiếp theo tính khoảng cách giữa các giờ, nếu khoảng cách từ g đến giờ hiện tại nhỏ hơn khoảng cách của biến báo thức đến giờ hiện tại, thì cập nhât cho biến báo thức giá trị giờ tương ứng trong mảng. Nếu trường hợp hai khoảng cách giữa hai giờ là bằng nhau thì ta có hai trường hợp xảy ra:

- Trường hợp 1 khi g bằng với giờ hiện tại, lúc này sẽ tiến hành so sánh phút và lấy khoảng cách phút nhỏ nhất nhưng phút đó phải nhỏ hơn phút hiện tạị

- Trường hợp 2 khi g khác với giờ hiện tại, lúc này so sánh phút của 2 giờ nếu phút nào nhỏ hơn ta cập nhật biến báo thức phút tại đó.

44

3.5.7 Chương trình con bao_thuc()

45 Đầu tiên, ta tiến hành so sánh thời gian báo thức với thời gian hiện tại, nếu bằng nhau cho biến tt_bthuc=1, đây là biến giúp ta có thể dừng báo thức lại khi có tín hiệu từ nút nhấn MENỤ Chạy vòng lặp điều kiện giờ báo thức bằng thời gian hiện tại và tt_bthuc=1,

khi trong vòng lặp tiến hành báo hiệụ Do trong vòng lặp nên cần cập nhật thời gian và nhiệt độ, độ ẩm liên tục nên hàm cập nhật được gọị Khi có tín hiệu nút nhấn, tt_bthuc bằng 0, sau đó so sánh với điều kiện vịng lặp và thốt khỏi vịng lặp, dừng báo hiệụ

46

Chương 4: KẾT QUẢ THỰC HIỆN 4.1 Mơ hình phần cứng

Sau khi đã có được sơ đồ nguyên lý và lưu đồ giải thuật của hệ thống, người thực hiện tiến hành làm mạch in. Mạch in được vẽ trên phần mềm Proteus như hình 4.1 dưới đâỵ

Một phần của tài liệu Thiết kế mạch đồng hồ số dùng VDK 16f887 (Trang 34 - 52)