English version Click hereผมได้กล่าวเกี่ยวกับเนื้อหาการติดต่อผ่าน Microcontroller Serial Port ไปแล้วนั้น เขียนโปรแกรมควบคุม
Microcontroller
8051 ผ่าน Serial Port
สำหรับอุปกรณ์ด้าน 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