Chào các bạn. Mình vừa mới học thực hành vi điều khiển, chủ yếu là chíp 8051. Có một số thắc mắc cần các bạn giúp đỡ.
Do thầy yêu cầu viết code theo kiểu đơn giản (thủ công và dài dòng một tí), mà tụi mình cũng mới học cơ bản thui không có chuyên sau nên các bạn hướng dẫn theo kiểu đơn giản nhé.
+ Đề bài thầy yêu cầu mình làm như sau:
Lập trình hiển thị đếm tăng dần từ 0-88 rồi đếm giảm dần từ 88-0 cùng trong một chương trình.
+ Mình đã làm như sau:
Hình mô phỏng Protus:
Code:
Ở trên là bài đã hoàn chỉnh và chạy được, nhưng mình trước khi làm phần code trên thi có một giải pháp để rút ngắn bớt phần viết code nhưng đã không thành công.
Cụ thể giải pháp như sau:
- Ở phần đếm tăng dần, đầu tiên mình viết code hiển thị số hàng chục nhảy lên 0, sau đó gọi chương trình con DEMDV: (Đếm số đơn vị như code trên) để hiển thị ra led hiển thị số đơn vị từ 0-9, sau khi chạy hết chương trình con DEMDV: thì led hàng chục lại nhảy lên 1, đến 88 rồi dừng 5s.
- Tương tự như tăng, lúc đầu cho led hiển thị số hàng chục hiển thị ra số 8, sau đó gọi chương trình con DEMDVNGUOC: (Đếm số đợn vị ngược) để hiển thị ra led số đơn vị giảm dần từ 9-0 (trừ phần 8 ban đầu của số 88 phải viết riêng)
==> Nhưng không thành công vì theo sơ đồ mình viết như sau chương trình như sau:
----------------
thì trong phần đầu đếm từ 0-88, khi gọi CTC DEMDV: thay vì chạy xong chương trình con CTC DEMDV thì nhảy số hàng chục thì lại chạy tiếp luôn CTC DEMDVNGUOC: rồi mới nhảy số hàng chục, mình biết là vì CTC DEMDVDEMNGUOC: nằm sau CTC DEMDV: nên nó chạy nối tiếp luôn. Còn phần đếm ngược thì không bị sao cả, theo mình hiểu vì CTC DEMDVNGUOC không có CTC nào nữa.
Vậy làm thế nào để khống chế khi gọi CTC DEMDV: thì không chạy nối tiếp nữa mà sẽ nhảy hàng chục.
Do thầy yêu cầu viết code theo kiểu đơn giản (thủ công và dài dòng một tí), mà tụi mình cũng mới học cơ bản thui không có chuyên sau nên các bạn hướng dẫn theo kiểu đơn giản nhé.
+ Đề bài thầy yêu cầu mình làm như sau:
Lập trình hiển thị đếm tăng dần từ 0-88 rồi đếm giảm dần từ 88-0 cùng trong một chương trình.
+ Mình đã làm như sau:
Hình mô phỏng Protus:
Code:
Code:
; CHUONG TRINH CHINH ORG 0000H DEMHC: ;SANG TU SO 0-88 MOV P0, #0C0H ;SO 0 LCALL DEMDV MOV P0, #0F9H ;SO 1 LCALL DEMDV MOV P0, #0A4H ;SO 2 LCALL DEMDV MOV P0, #0B0H ;SO 3 LCALL DEMDV MOV P0, #99H ;SO 4 LCALL DEMDV MOV P0, #92H ;SO 5 LCALL DEMDV MOV P0, #82H ;SO 6 LCALL DEMDV MOV P0, #0F8H ;SO 7 LCALL DEMDV MOV P0, #80H ;SO 8 MOV P2, #0C0H ;SO 0 (Dv) CALL DELAY MOV P2, #0F9H ;SO 1 (DV) CALL DELAY MOV P2, #0A4H ;SO 2 (DV) CALL DELAY MOV P2, #0B0H ;SO 3 (DV) CALL DELAY MOV P2, #99H ;SO 4 (DV) CALL DELAY MOV P2, #92H ;SO 5 (DV) CALL DELAY MOV P2, #82H ;SO 6 (DV) CALL DELAY MOV P2, #0F8H ;SO 7 (DV) CALL DELAY MOV P2, #80H ;SO 8 (DV) ;NGUNG 5S CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY ;SANG TU 88-0 MOV P2, #0F8H ;SO 7 (DV) CALL DELAY MOV P2, #82H ;SO 6 (DV) CALL DELAY MOV P2, #92H ;SO 5 (DV) CALL DELAY MOV P2, #99H ;SO 4 (DV) CALL DELAY MOV P2, #0B0H ;SO 3 (DV) CALL DELAY MOV P2, #0A4H ;SO 2 (DV) CALL DELAY MOV P2, #0F9H ;SO 1 (DV) CALL DELAY MOV P2, #0C0H ;SO 0 (Dv) CALL DELAY MOV P0, #0F8H ;SO 7 (HC) MOV P2, #90H ;SO 9 CALL DELAY MOV P2, #80H ;SO 8 CALL DELAY MOV P2, #0F8H ;SO 7 CALL DELAY MOV P2, #82H ;SO 6 CALL DELAY MOV P2, #92H ;SO 5 CALL DELAY MOV P2, #99H ;SO 4 CALL DELAY MOV P2, #0B0H ;SO 3 CALL DELAY MOV P2, #0A4H ;SO 2 CALL DELAY MOV P2, #0F9H ;SO 1 CALL DELAY MOV P2, #0C0H ;SO 0 CALL DELAY MOV P0, #82H ;SO 6 (HC) MOV P2, #90H ;SO 9 CALL DELAY MOV P2, #80H ;SO 8 CALL DELAY MOV P2, #0F8H ;SO 7 CALL DELAY MOV P2, #82H ;SO 6 CALL DELAY MOV P2, #92H ;SO 5 CALL DELAY MOV P2, #99H ;SO 4 CALL DELAY MOV P2, #0B0H ;SO 3 CALL DELAY MOV P2, #0A4H ;SO 2 CALL DELAY MOV P2, #0F9H ;SO 1 CALL DELAY MOV P2, #0C0H ;SO 0 CALL DELAY MOV P0, #92H ;SO 5 (HC) MOV P2, #90H ;SO 9 CALL DELAY MOV P2, #80H ;SO 8 CALL DELAY MOV P2, #0F8H ;SO 7 CALL DELAY MOV P2, #82H ;SO 6 CALL DELAY MOV P2, #92H ;SO 5 CALL DELAY MOV P2, #99H ;SO 4 CALL DELAY MOV P2, #0B0H ;SO 3 CALL DELAY MOV P2, #0A4H ;SO 2 CALL DELAY MOV P2, #0F9H ;SO 1 CALL DELAY MOV P2, #0C0H ;SO 0 CALL DELAY MOV P0, #99H ;SO 4 (HC) MOV P2, #90H ;SO 9 CALL DELAY MOV P2, #80H ;SO 8 CALL DELAY MOV P2, #0F8H ;SO 7 CALL DELAY MOV P2, #82H ;SO 6 CALL DELAY MOV P2, #92H ;SO 5 CALL DELAY MOV P2, #99H ;SO 4 CALL DELAY MOV P2, #0B0H ;SO 3 CALL DELAY MOV P2, #0A4H ;SO 2 CALL DELAY MOV P2, #0F9H ;SO 1 CALL DELAY MOV P2, #0C0H ;SO 0 CALL DELAY MOV P0, #0B0H ;SO 3 (HC) MOV P2, #90H ;SO 9 CALL DELAY MOV P2, #80H ;SO 8 CALL DELAY MOV P2, #0F8H ;SO 7 CALL DELAY MOV P2, #82H ;SO 6 CALL DELAY MOV P2, #92H ;SO 5 CALL DELAY MOV P2, #99H ;SO 4 CALL DELAY MOV P2, #0B0H ;SO 3 CALL DELAY MOV P2, #0A4H ;SO 2 CALL DELAY MOV P2, #0F9H ;SO 1 CALL DELAY MOV P2, #0C0H ;SO 0 CALL DELAY MOV P0, #0A4H ;SO 2 (HC) MOV P2, #90H ;SO 9 CALL DELAY MOV P2, #80H ;SO 8 CALL DELAY MOV P2, #0F8H ;SO 7 CALL DELAY MOV P2, #82H ;SO 6 CALL DELAY MOV P2, #92H ;SO 5 CALL DELAY MOV P2, #99H ;SO 4 CALL DELAY MOV P2, #0B0H ;SO 3 CALL DELAY MOV P2, #0A4H ;SO 2 CALL DELAY MOV P2, #0F9H ;SO 1 CALL DELAY MOV P2, #0C0H ;SO 0 CALL DELAY MOV P0, #0F9H ;SO 1 (HC) MOV P2, #90H ;SO 9 CALL DELAY MOV P2, #80H ;SO 8 CALL DELAY MOV P2, #0F8H ;SO 7 CALL DELAY MOV P2, #82H ;SO 6 CALL DELAY MOV P2, #92H ;SO 5 CALL DELAY MOV P2, #99H ;SO 4 CALL DELAY MOV P2, #0B0H ;SO 3 CALL DELAY MOV P2, #0A4H ;SO 2 CALL DELAY MOV P2, #0F9H ;SO 1 CALL DELAY MOV P2, #0C0H ;SO 0 CALL DELAY MOV P0, #0C0H ;SO 0 (HC) MOV P2, #90H ;SO 9 CALL DELAY MOV P2, #80H ;SO 8 CALL DELAY MOV P2, #0F8H ;SO 7 CALL DELAY MOV P2, #82H ;SO 6 CALL DELAY MOV P2, #92H ;SO 5 CALL DELAY MOV P2, #99H ;SO 4 CALL DELAY MOV P2, #0B0H ;SO 3 CALL DELAY MOV P2, #0A4H ;SO 2 CALL DELAY MOV P2, #0F9H ;SO 1 CALL DELAY MOV P2, #0C0H ;SO 0 ;NGUNG 5S CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY ;LAP LAI LCALL DEMHC ;CHUONG TRINH CON DEMDV: ;Đếm số đơn vị từ 0-9 MOV P2, #0C0H ;SO 0 CALL DELAY MOV P2, #0F9H ;SO 1 CALL DELAY MOV P2, #0A4H ;SO 2 CALL DELAY MOV P2, #0B0H ;SO 3 CALL DELAY MOV P2, #99H ;SO 4 CALL DELAY MOV P2, #92H ;SO 5 CALL DELAY MOV P2, #82H ;SO 6 CALL DELAY MOV P2, #0F8H ;SO 7 CALL DELAY MOV P2, #80H ;SO 8 CALL DELAY MOV P2, #90H ;SO 9 DELAY: ;Delay 1s MOV R5,#1 PUSH 00H MOV TMOD,#01H MOV R0,#225 LOOP: MOV TH0,#HIGH(-3000) MOV TL0,#LOW(-3000) SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 DJNZ R0,LOOP POP 00H RET END
Cụ thể giải pháp như sau:
- Ở phần đếm tăng dần, đầu tiên mình viết code hiển thị số hàng chục nhảy lên 0, sau đó gọi chương trình con DEMDV: (Đếm số đơn vị như code trên) để hiển thị ra led hiển thị số đơn vị từ 0-9, sau khi chạy hết chương trình con DEMDV: thì led hàng chục lại nhảy lên 1, đến 88 rồi dừng 5s.
- Tương tự như tăng, lúc đầu cho led hiển thị số hàng chục hiển thị ra số 8, sau đó gọi chương trình con DEMDVNGUOC: (Đếm số đợn vị ngược) để hiển thị ra led số đơn vị giảm dần từ 9-0 (trừ phần 8 ban đầu của số 88 phải viết riêng)
==> Nhưng không thành công vì theo sơ đồ mình viết như sau chương trình như sau:
Code:
Main1: ;Chương trình đếm từ 0-88 Hiển thị số 0 hàng chục Gọi CTC DEMDV Hiển thị số 1 hàng chục Gọi CTC DEMDV .... Hiển thị số 8 hàng chục Gọi CTC DEMDV ;Dừng 5s JMP MAIN2 Main2: ;Chương trình đếm từ 88-0 Hiển thị số 8 hàng chục Gọi CTC DEMDVNGUOC Hiển thị số 7 hàng chục Gọi CTC DEMDVNGUOC .... Hiển thị số 0 hàng chục Gọi CTC DEMDVNGUOC ;Dừng 5s JMP MAIN1 ;------ ;CÁC CHƯƠNG TRÌNH ĐẾM ĐƠN VỊ ;------ DEMDV: SỐ 0 CALL DELAY SỐ 1 ..... SỐ 9 DEMDVNGUOC: SỐ 9 CALL DELAY SỐ 8 .... SỐ 0 DELAY: 1S END
thì trong phần đầu đếm từ 0-88, khi gọi CTC DEMDV: thay vì chạy xong chương trình con CTC DEMDV thì nhảy số hàng chục thì lại chạy tiếp luôn CTC DEMDVNGUOC: rồi mới nhảy số hàng chục, mình biết là vì CTC DEMDVDEMNGUOC: nằm sau CTC DEMDV: nên nó chạy nối tiếp luôn. Còn phần đếm ngược thì không bị sao cả, theo mình hiểu vì CTC DEMDVNGUOC không có CTC nào nữa.
Vậy làm thế nào để khống chế khi gọi CTC DEMDV: thì không chạy nối tiếp nữa mà sẽ nhảy hàng chục.
Comment