Bài 4-2: Thực hành viết chương trình điều khiển LED sáng

  4.4 GIẢI THUẬT VÀ LƯU ĐỒ trong lập trình

Giải thuật là một trình tự thực hiện công việc nào đó.
Lưu đồ là sự biểu diễn đồ hoạ của giải thuật.
Lưu đồ chứa các ký hiệu biểu diễn các bước của giải thuật.
Mỗi ký hiệu biểu diễn một hoạt động.

Các ký hiệu được sử dụng trong lưu đồ:

  • Nhập - Input: tín hiệu vi điều khiển lấy vào để xử lí nhập input
     
  • Xử lý – Process: quá trình xử lí tín hiệu Xử lý – Process: quá trình xử lí tín hiệu
     
  • Quyết định – Decision: chọn lựa hướng đi phù hợpQuyết định – Decision .
     
  • Bắt đầu và Kết thúc – Start and Stop: startstop
     
  • Hiển thị - Display/Output: tín hiệu do vi điều khiển xuất ra để điều khiển thiết bị hiển thị Hiển thị
     
  • Gọi chương trình con: gọi chương trình con Gọi chương trình con. Khi chương trình con được gọi, chương trình chính dừng lại chờ cho chương trình con thực hiện xong thì chương trình chính mới tiếp tục thực hiện.
     
  • Bắt đầu và Kết thúc chương trình con: bắt đầu chương trình con



     

         Bài 3: Viết chương trình để các led nối với Port 1 sáng rồi tắt led. Biết led sáng khi tín hiệu xuất ra ở mức 1. Minh họa trong hình phía dưới

  • Mô phỏng điều khiển 8 led sáng tắt cùng lúc

      Phân tích: để led sáng rồi tắt, cần làm cho tín hiệu xuất ra mức 1 một khoảng thời gian để mắt có thể nhận biết được, sau đó làm tín hiệu xuất ra ở mức 0 một khoảng thời gian như trên. Cứ lặp đi lặp lại đoạn trên sẽ thấy dãy đèn sáng rồi tắt.

Lưu đồ giải thuật vi điều khiển led sáng    Chương trình con delay

       Khi bắt đầu chương trình, P1 được truyền giá trị là #FFH để làm các ngõ ra của P1 ở mức 1. Giả sử ta bỏ qua lệnh gọi chương trình con Delay, công việc cần thực hiện kế tiếp là làm tín hiệu ở P1 trở về mức 0 để làm led tắt, vì vậy P1 được truyền giá trị là #0H. Các lệnh của vi điều khiển chỉ thực hiện trong một vài chu kì máy, khoảng vài µs, do đó nếu bỏ qua lệnh gọi chương trình con Delay thì led sáng sau khoảng vài µs, rồi lại tắt khoảng vài µs, quá trình sáng tắt của led quá nhanh làm mắt người chỉ thấy led sáng liên tục. Muốn mắt người nhận ra led sáng lên rồi tắt đi cần làm tín hiệu xuất ra P1 lâu hơn. Chương trình con Delay thực hiện nhiệm vụ duy trì trạng thái ở ngõ ra lâu hơn bằng cách cho vi điều khiển thực hiện hàng ngàn lần các câu lệnh nào đó không ảnh hưởng đến trạng thái ngõ ra. Khi chương trình chính gặp lệnh gọi chương trình con Delay, chương trình chính sẽ dừng lại chờ cho chương trình con Delay thực hiện xong rồi mới thực hiện câu lệnh kế tiếp.

       Phụ chú: Xem lại về nhãn và chương trình con

Chương trình:

;*************************************************************************************************
;**************/////--- 8 LED SANG SANG TAT ---\\\\\\ ****************************************
;**----------------------------------------------------------------------------------------------------------------------
;**////////////////___ lam 8 led sang roi tat_________________\\\\\\\\\\\\\\\\\\\\\\\\\\\
;**///////////////___ sang o muc 1 va tat o muc 0__________________\\\\\\\\\\\\\\\\\\\\\\\\\
;**//////////////____ lap di lap lai khong gioi han____________________\\\\\\\\\\\\\\\\\\\\\
;**<<<<<<<<<<<<<<<<<<<----------------------------------------------------->>>>>>>>>>>>>>
;*****************************************************************************************************
;*****************************************************************************************************

                     ORG        000H                  ; khai bao dia chi de bat dau chuong trinh tren Rom
Tudau:
                     Mov        P1,#11111111B    ;===>>>> lam 8 led noi P1 sang
                     LCall      Delay                  ;===>>>> goi chuong trinh con Delay
                     Mov        P1,#00                ;===>>>> lam 8 led noi P1 tat
                     LCall      Delay                
                     Sjmp      Tudau                 ;===>>>> nhay ve thuc hien tu dau
  
;**>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> delay <<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
Delay:
                     Mov        R7,#0FFH           ;===>>>> ga'n R7=#0FFH, 1 chu ki may
Kt2:               Mov        R6,#0FFH           ;===>>>> ga'n R6=#0FFH, 1 chu ki may
Kt1:               Djnz       R6,Kt1                 ;===>>>> giam R6 xuong 1, R6 khac 0->giam tiep,2ckm
                     Djnz       R7,Kt2                 ;===>>>> giam R7 xuong 1, R6 khac 0-> ve Kt2,2ckm
                     Ret                                   ;===>>>> ket thuc chuong trinh con Delay
;_________________________________________________________________________________
                     End                                   ;===>>>> ket thuc chuong trinh

 

Gọi và thưc thi chương trình con cho vi điều khiển

           Chương trình thực hiện, gặp câu lệnh  Sjmp      Tudau  chương trình sẽ nhảy về nhãn Tudau ở đầu chương trình, và chương trình tiếp tục lại từ đầu, cứ thế chương trình lặp lại mãi mãi.

            LCall      Delay      lệnh gọi chương trình con Delay

           Chương trình con trong chương trình này được bắt đầu bằng nhãn Delay:, khi có lệnh gọi chương trình con, thì vi điều khiển sẽ chuyển sang thực hiện các câu lệnh của chương trình con, sau khi chương trình con hoàn thành, vi điều khiển trở về chương trình chính để thực hiện tiếp.

          Lệnh Kt1:     Djnz       R6,Kt1  
                                  Lệnh Djnz       R6,Kt1  này giảm R6 đi một đơn vị, nếu R6 chưa bằng 0, chương trình lại nhảy về nhãn Kt1, mà nhãn Kt1 lại gọi lại lệnh này, do đó toàn câu lệnh thực hiện giảm R6 cho đến khi R6 về 0 thì thực hiện lệnh kế tiếp. Câu lệnh này thực hiện, không ảnh hưởng hay thay đổi giá trị của các ô nhớ khác, vì vậy ngõ ra từ các Port cũng không thay đổi trạng thái.

        Tổng thời gian của chương trình con Delay:

  • Nếu sử dụng thạch anh 12MHz thì mỗi chu kì máy là 1µs
  • Lệnh       Mov   R7,#0FFH   thực hiện 1 lần và mất 1 chu kì máy
  • Lệnh      Djnz    R6,Kt1         thực hiện 255 lần và mỗi lần mất 2 chu kì máy
  • Đoạn lệnh 
    Kt2:             Mov        R6,#0FFH
    Kt1:             Djnz       R6,Kt1              ;kí hiệu Kt thay cho kiểm tra
                        Djnz       R7,Kt2

    Đoạn lệnh này được thực hiện 255 lần với mỗi lần gồm
         (255×2)chu kì máy của lệnh    Djnz       R6,Kt1
         và 2 chu kì máy của lệnh         Djnz       R7,Kt2
         và 1 chu kì máy của lệnh         Mov        R6,#0FFH
    Tổng cộng đoạn trên đã thực hiện (1+(255×2)+2)×255)=130815 chu kì máy
  • Vậy tổng cộng chương trình con Delay đã thực hiện 130815+1=130816 chu kì máy
    tức là đã thực hiện trong 130816µs , khoảng thời gian gần bằng 0.13s
  • Như vậy trong 1s led sáng khoảng 4 lần đủ để mắt người có thể nhận ra được

        Nếu mô phỏng với Pinnacle 52 chương trình delay phải chạy với số lần lặp lại nhiều hơn để thấy được các trạng thái ngõ ra của các Port, thay đoạn chương trình con Delay ở trên bằng đoạn chương trình con như dưới đây khi mô phỏng bằng Pinnacle 52



 
Delay:
Mov        70H,#2H   …
Kt3:               Mov        71H,#0FFH      ;===>>>> ga'n 71H=#0FFH, 2 chu ki may
Kt2:               Mov        72H,#0FFH      ;===>>>> ga'n 72H=#0FFH, 2 chu ki may
Kt1:               Djnz       72H,Kt1           ;===>>>> giam 72H xuong 1, 72H khac 0-> giam tiep, 2ckm
                     Djnz       71H,Kt2           ;===>>>> giam 71H xuong 1, khac 0-> ve Kt2
                     Djnz       70H,Kt3           ;===>>>> giam 70H xuong 1, khac 0-> ve Kt3
                     Ret                               ;===>>>> ket thuc chuong trinh con

 

 

 

 

. Bài 4. Bài tập tự giải.

Làm cho các led nối Port 2 sáng tắt xen kẽ nhau, ( đèn 1,3,5,7 sáng, đèn 2,4,6,8 tắt , sau đó đèn 1,3,5,7 tắt, đèn 2,4,6,8 sáng. Lặp lại quá trình trên.). Biết led sáng khi tín hiệu xuất ở các chân Port 2 ở mức 1. Minh họa trong hình phía dưới

  • Mô phỏng điều khiển sáng tắt 8 led