การรับข้อมูลพอร์ตอนุกรมของ MCS-51 โดยใช้ภาษาซี

ในตอนที่แล้วเราได้เรียนรู้การส่งข้อมูลออกทางพอร์ตอนุกรมโดยใช้คำสั่ง printf คำสั่ง printf คือการสั่งพิมพ์ ดังนั้นคำสั่งในการรับข้อมูลคือ scanf ซึ่งเหมือนกับใน Turbo C++ เลย เพื่อให้เห็นภาพชัดเจนผมจึงนำมาประยุกต์ใช้กับโปรแกรม Hyper Terminal ที่อยู่ใน Window เมื่อไมโครคอนโทรลเลอร์พบคำสั่ง printf ก็จะหยุดรับข้อมูลทางพอร์ตอนุกรม เราก็ทำการส่งข้อมูลออกไปทางพอร์ตอนุกรมโดยการพิมพ์ข้อความลงไป แล้วกด Enter ข้อความก็จะถูกส่งเข้าไปในไมโครคอนโทรลเลอร์ จากนั้นเราทำการประมวลผลข้อมูลดังกล่าว

ใครที่เคยเขียนโปรแกรมด้วยภาษาซีมาก่อนคงรู้จักคำสั่ง printf แน่นอน ใน Turbo C++ เมื่อเราใช้คำสั่ง printf("Your text") หมายถึงสั่งให้พิมพ์ตัวอักษรลงที่หน้าจอที่หน้าจอก็จะมีผลลัพธ์ดังรูปข้างล่างนี้ ส่วนคำสั่ง \n เป็นคำสั่งให้ขึ้นบรรทัดใหม่

Your text

และใน Keil ก็มีคำสั่งนี้เช่นกัน ใช้ร่วมกับการตั้ง Baud Rate เป็นการส่งข้อมูลออกทาง Serial Port เราสามารถเลือกความเร็วในการรับส่งข้อมูลได้จากการตั้ง Baud Rate สำหรับในการทดลองนี้ผมใช้ค่ามาตราฐานในการรับส่งข้อมูล คือ 9600 bps และจะต้องตั้งค่าดังนี้

SCON = 0x52; // set speacial function register
TMOD = 0x20;
TH1 = 0xfd; // Baud Rate = 9600
TR1 = 1;

ในภาษาซีเมื่อเราใช้ คำสั่ง printf( ) จึงต้องประกาศ #include <stdio.h> ไว้ที่ตอนต้นของโปรแกรมด้วย ในส่วนของวงจรผมใช้ไอซีสำเร็จรูปเบอร์ DS275 ที่แปลงระดับสัญญาณของ RS232 ให้เป็น TTL และจาก TTL ให้เป็นสัญญาณ RS232 หรือจะใช้ MAX 232 ก็ได้ไม่ว่ากันครับ ส่วนไมโครคอนโทรเลอร์ผมใช้เบอร์ยอดนิยมเบอร์ 89C52 มาเริ่มต่อวงจรกันเลยดีกว่าครับ

ส่วนของโปรแกรมมีสั้นๆ ไม่ยาวมากครับ เมื่อเทียบการเขียนโปรแกรมภาษาแอสเซมบลีกับภาษาซีแล้วภาษาแอสเซมบลีจะยาวกว่าเยอะเลยครับ

//****************************************//
//Program : Serial Communication
//Copyright (C) Aon_Micro
//****************************************//

#include <reg51.h>
#include <stdio.h>

void start (void) {
SCON = 0x52; // set speacial function register
TMOD = 0x20;
TH1 = 0xfd; // Baud Rate = 9600
TR1 = 1;

}

/********** MAIN **********/
void main (void)
{ char get_data[20];
init();
printf("Type your name\n");
scanf("%s",&get_data);
printf("Your name is %s",get_data);
while(1);


}

คำอธิบายโปรแกรม

#include <reg51.h> เป็นการประกาศว่าจะใช้ special function register

#include <stdio.h> ประกาศ prototype สำหรับ I/O ฟังก์ชัน

เราต้องกำหนดให้ข้อมูลที่รับเข้ามาเป็น array ดังนั้นจึงต้องระบุจำนวนที่แน่นอนของ array ด้วยผมกะเอาซัก 20 ไบต์สำหรับเก็บข้อมูลที่เข้ามาทางพอร์ตอนุกรม printf คือคำสั่งส่งข้อมูลออกทางพอร์ตอนุกรม scanf คือคำสั่งรับข้อมูลเข้าทางพอร์ตอนุกรม จากนั้นให้สิ้นสุดโปรแกรมด้วยคำสั่ง while(1) หมายถึงให้วนลูปอยู่ที่คำสั่ง while(1) ตลอดไป ถ้าเทียบกับภาษา แอสเซมบลีก็คือคำสั่ง SJMP $

 

 

 

 

 

เมื่อเขียนโปรแกรมเสร็จแล้วให้ลองเบิร์นลงไมโครคอนโทรเลอร์แล้วเปิดโปรแกรม Hyper Termial ที่อยู่ในเมนู start - - - > Acessories - - - > Communication - - - > Hyper Termial (ถ้าไม่มีให้ Add program ที่ Control panel) เมื่อเปิดขึ้นมาแล้วให้ใส่ชื่อ Keil C51 ในช่อง Name แล้วเลือกการสื่อสารที่ port1, port2 ...

หน้าต่าง Property ให้เลือก Restore Defaults จากนั้นให้กดรีเซตที่บอร์ดไมโครคอนโทรลเลอร์จะประกฎข้อความ Type your name ให้พิมพ์ชื่อลงไปแล้วกด Enter ในที่นี้พิมพ์คำว่า aon_micro แล้วกด Enter ที่หน้าจอก็จะปรากฎข้อความ Your name is aon_micro.

 

 


Copyright © 2003 Aon micro. All rights reserved

E-mail:[email protected]

 

Hosted by www.Geocities.ws

1