Microcontroller โครงงานการติดต่อควบคุม 8051ตอนที่ 1

English version Click here
   ผมได้กล่าวเกี่ยวกับเนื้อหาการติดต่อผ่าน Microcontroller Serial Port ไปแล้วนั้น

    เขียนโปรแกรมควบคุม Microcontroller 8051 ผ่าน Serial Port
    มาในโครงงานนี้จะนำเอาหลักการที่เสนอไปมาประยุกต์เพื่อติดต่อแบบ RS-232 กับ PC ผ่านทาง Serial Port โดยจะมีส่วนของโปรแกรมที่ตัวไมโครคอนโทรลเลอร์และโปรแกรมบน PC ซึ่งผมใช้ Visual  Basic อีกทั้งวงจรและรูปวงจรของบอร์ดที่ผมใช้ทดลอง ดังนั้นจะแบ่งเป็น 2 ตอน เพื่อไม่ให้แต่ละหน้ายาวเกินไปและเนื้อหาปนไปมาครับ

   สำหรับอุปกรณ์ด้าน Hardware นั้น ก็เป็นวงจรการต่อไมโครคอนโทรลเลอร์แบบพื้นฐาน มีเพิ่มในส่วนของ ชุดติดต่อ RS-232 ซึ่งผมใช้ ICL232 และชุดแสดง LED แสดงผล คอนเน็ทเตอร์ติดต่อ Serial Port กับ PC เกี่ยวกับเจ้าตัวไมโครคอลโทรลเลอร์ตัวนี้ จะมีหน่วยความจำภายในตัวคอนโทรลเลอร์เอง ซึ่งสามารถใช้ เครื่อง write โปรแกรมๆที่คอมไพล์แล้วได้เลยครับ   

  

 

รูปบอร์ดทดลองสำหรับโครงงานนี้

   เราจะมาเขียนโปรแกรมของไมโครคอนโทรลเลอร์เพื่อให้ติดต่อและควบคุมการทำงานจาก PC โดยจะเขียน โปรแกรมบนวินโว์ที่เขียนด้วย Visaul Basic(ตามเคย) 

โปรแกรมควบคุมไมโครคอนโทรลเลอร์8051

                    ORG             0000H

 ; กำหนดตั้งค่าให้กับ Timer1 เพื่อใช้สร้าง Baud Rate ในการรับส่งข้อมูล     

                     MOV IE,#00000000B

                     MOV TMOD,#00100000

                     MOV TL1#,0FDH

                     MOV TH1,#0FDH

 ; กำหนดค่าให้กับ SCON Register โดยเลือกโหมด 1 และให้รับข้อมูล REN=1 

                     MOV SCON,#01010000B

                     SETB TR1

                     MOV P0,#00000000B   ; เซทค่าให้พอร์ตขนาน P0 เป็น 0 ทุกบิต

; เข้าโปรแกรมหลัก

INDEX:         ACALL SUB_RXD   ; ไปรับข้อมูลจาก Serial Port ที่ส่งมาจาก PC

                     ACALL LEDOFF       ; รูทีนกำหนดให้ไมโครคอนโทรลเลอร์ส่งค่าที่ออกพอร์ตดับหมด

                     ACALL LED1           ; รูทีนกำหนดให้ไมโครคอนโทรลเลอร์ส่งค่าออกพอร์ตP0.0

                     ACALL LED2          ; รูทีนกำหนดให้ไมโครคอนโทรลเลอร์ส่งค่าออกพอร์ตP0.1

                     ACALL LED3          ; รูทีนกำหนดให้ไมโครคอนโทรลเลอร์ส่งค่าออกพอร์ตP0.2

                     ACALL LED4          ; รูทีนกำหนดให้ไมโครคอนโทรลเลอร์ส่งค่าออกพอร์ตP0.3

                     ACALL LED5          ; รูทีนกำหนดให้ไมโครคอนโทรลเลอร์ส่งค่าออกพอร์ตP0.4

                     ACALL LED6          ; รูทีนกำหนดให้ไมโครคอนโทรลเลอร์ส่งค่าออกพอร์ตP0.5

                     ACALL LED7          ; รูทีนกำหนดให้ไมโครคอนโทรลเลอร์ส่งค่าออกพอร์ตP0.6

                     SJMP INDEX          ; กลับไปทำโปรแกรมหลัก

; รูทีนรับข้อมูลทาง Serial Port

RXD :           JNB RI,$

                     CLR RI

                     MOV A,SBUF

                     RET

LEDOFF:      CJNE A,#30H,NEXT    ; เปรียบเทียบเงื่อนไขถ้าเป็นจริงให้ทำขั้นตอนต่อไป

                     MOV P0,#00000000B  ; จะส่งค่าออกพอร์ตขนาน P0 ให้ LED ดับหมด

                     ACALL SUB_TXD       ; ไปทำขั้นตอนส่งข้อมูลให้ PC รู้ว่าคำสั่งทำงานเรียบร้อยแล้ว

                     SJMP  INDEX             ; กลับสู่โปรแกรมหลัก

; รูทีน LED2-LED7 จะทำงานหลักการเดียวกับ LED1 แต่จะส่งค่าออกพอร์ตขนานเรียงกันไป 

LED1:           CJNE A,#31H,NEXT    ; เปรียบเทียบเงื่อนไขถ้าเป็นจริงให้ทำขั้นตอนต่อไป

; จะส่งค่าออกพอร์ตขนาน P0.0 โดยจะกลับค่า 0 เป็น 1 คือ LED1 ติด และกลับ 1 เป็น 0 คือ LED1 ดับ

                     CPL  P0.0      ; คำสั่ง Boolean = Not ใช้ควบคุมสถานะบิตของพอร์ต 

                     ACALL SUB_TXD       ; ไปทำขั้นตอนส่งข้อมูลให้ PC รู้ว่าคำสั่งทำงานเรียบร้อยแล้ว

                     SJMP  INDEX             ; กลับสู่โปรแกรมหลัก

; รูทีน LED2-LED7 จะทำงานหลักการเดียวกับ LED1 แต่จะส่งค่าออกพอร์ตขนานเรียงกันไป 

LED2:           CJNE A,#32H,NEXT 

                     CPL  P0.1

                     ACALL SUB_TXD

                     SJMP  INDEX

LED3:           CJNE A,#33H,NEXT

                     CPL  P0.2

                     ACALL SUB_TXD

                     SJMP  INDEX

LED4:           CJNE A,#34H,NEXT

                     CPL  P0.3

                     ACALL SUB_TXD

                     SJMP  INDEX

LED5:           CJNE A,#35H,NEXT

                     CPL  P0.4

                     ACALL SUB_TXD

                     SJMP  INDEX

LED6:           CJNE A,#36H,NEXT

                     CPL  P0.5

                     ACALL SUB_TXD

                     SJMP  INDEX

LED7:           CJNE A,#37H,NEXT

                     CPL  P0.6

                     ACALL SUB_TXD

                     SJMP  INDEX

NEXT:           RET  

; รูทีนส่งข้อมูลทาง Serial Port เพื่อบอกให้โปรแกรมที่ PC รู้ว่าส่งคำสั่งทำงานเรียบร้อยแล้ว

TXD :           MOV SBUF,#43

                     JNB TI,$

                     CLR TI

                     RET

                     END 

                

     ต้องบอกว่ารูปแบบการเขียนโปรแกรมหรือรูทีนที่กล่าวนั้นสามารถเขียนได้หลายวิธี โครงงานนี้อาจจะไม่ ไช้วิธีที่ดีที่สุดนะครับ ขั้นตอนต่อไปนำโปรแกรมที่เขียนเรียบร้อยไปแอสแซมเบอร์และเบินท์ลงตัวไมโคร คอนโทรลเลอร์ได้ครับ แต่ในส่วนของโปรแกรมที่รันบน PC ที่จะเขียนด้วย Visual Basic นั้น จะกล่าวในตอนต่อไป สามารถคลิกได้ที่นี้ครับ

Visual Basic Interface Microcontroller 8051 by Serial Port 

 

  สิ่งที่ได้รับจากบทความนี้
   1) เป็นพื้นฐานในงานควบคุมด้วยไมโครคอนโทรลเลอร์ตระกูล 8051
   2) รู้จักคำสั่งในการเขียนโปรแกรมให้กับไมโครคอนโทรลเลอร์
   3) สามารถเขียนโปรแกรมคอมพิวเตอร์ควบคุมอุปกรณ์ไฟฟ้าได้หรือประยุกต์งานควบคุมด้านอื่นๆได้

   เอกสารอ้างอิง

   1. 8051 Tutorial Serial Communication

   2. http://www.smartdata.com.au/8051/serial.txt